[英]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.