[英]Create a Dynamic Query into a Temp table instead of hard coding union statements
我硬编码了一堆联合声明,为每个地区、每个财政年度的每个月创建一行(该示例仅针对 2017 财政年度)。 而不是所有这些代码行,我真的很想“构建一个循环”来动态创建临时表而不是数百行代码和联合语句。
*****从 Gordon 提出的解决方案中更新代码
SELECT dt.fulldate AS trade_month,
t.trade_gy AS trade_gy,
r.dvsregion_id,
r.dvsregion_name
FROM dimdate dt
CROSS JOIN (VALUES ('2017'),
('2018')) AS t(trade_gy)
CROSS JOIN (VALUES ('1',
'Midwest'),
('2',
'Northeast')) as r(dvsregion_id, dvsregion_name)
WHERE Year(dt.fulldate) >= 2012
AND dt.fulldate = dt.firstofmonthdate
AND dt.fulldate IN (SELECT p.fulldate
FROM dimdate p
WHERE ( Year(p.fulldate) ) >= 2012
AND p.lastdayofgasyear <= '2018-03-31')
ORDER BY trade_gy ASC,
trade_month ASC
开始日期为 1-1-2012*
每个会计年度的结束日期都会发生变化。
我们的财政年度于 3 月 31 日结束(2017 年结束于 3-31-18,依此类推)。
财政年度包括 2017 - 2023
地区:中西部、东北部、西部、加拿大
非常感谢任何对我有帮助的建议或链接!
谢谢
2017 财年的代码示例。所有其他年份的格式相同,除了我为每个财政年度更新p.LastDayofGasYear <= '3-31-2018') 。
Select *
into #Regions
From (
--Create regions temp table for GY 2017
select
dt.FullDate as trade_month ,
'2017' as trade_gy,
'1' as dvsregion_id,
'Midwest' as dvsregion_name
from dimDate dt
where (year(dt.FullDate)) >= 2012
and dt.FullDate = dt.FirstOfMonthDate
and dt.FullDate IN (
Select p.FullDate
from dimDate p
where (year(p.FullDate)) >= 2012 and p.LastDayofGasYear <= '3-31-2018')
Union
select
dt.FullDate as trade_month ,
'2017' as trade_gy,
'2' as dvsregion_id,
'Northeast' as dvsregion_name
from dimDate dt
where (year(dt.FullDate)) >= 2012
and dt.FullDate = dt.FirstOfMonthDate
and dt.FullDate IN (
Select p.FullDate
from dimDate p
where (year(p.FullDate)) >= 2012 and p.LastDayofGasYear <= '3-31-2018')
Union
select
dt.FullDate as trade_month ,
'2017' as trade_gy,
'3' as dvsregion_id,
'Western' as dvsregion_name
from dimDate dt
where (year(dt.FullDate)) >= 2012
and dt.FullDate = dt.FirstOfMonthDate
and dt.FullDate IN (
Select p.FullDate
from dimDate p
where (year(p.FullDate)) >= 2012 and p.LastDayofGasYear <= '3-31-2018')
Union
select
dt.FullDate as trade_month ,
'2017' as trade_gy,
'5' as dvsregion_id,
'Canada' as dvsregion_name
from dimDate dt
where (year(dt.FullDate)) >= 2012
and dt.FullDate = dt.FirstOfMonthDate
and dt.FullDate IN (
Select p.FullDate
from dimDate p
where (year(p.FullDate)) >= 2012 and p.LastDayofGasYear <= '3-31-2018')
看起来你只想要cross join
常量值:
select dt.FullDate as trade_month ,
t.trade_gy as trade_gy,
r.dvsregion_id,
r.dvsregion_name
from dimDate dt cross join
(values ('2017', '2018', . . .) as t(trade_gy) cross join
(values ('1', 'Midwest'),
('2', 'Northeast'),
. . .
) r(dvsregion_id, dvsregion_name)
where year(dt.FullDate)) >= 2012 and
dt.FullDate = dt.FirstOfMonthDate and
dt.FullDate in (Select p.FullDate
from dimDate p
where (year(p.FullDate)) >= 2012 and p.LastDayofGasYear <= '2018-03-31'
);
我不确定我是否完全遵循您相当复杂的查询中的所有逻辑,但我认为它可以像这样构造。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.