繁体   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