簡體   English   中英

在臨時表中創建動態查詢而不是硬編碼聯合語句

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM