带日期的动态SQL查询

问题描述 投票:1回答:1

我有一个SQL查询,它正在创建一个PIVOT表。

就这个。

SELECT *
FROM (
  SELECT
   Name
  ,Year
  ,sum(Payment) as TotalPayment  
  FROM Orders
  group by Name,Date
 ) as Tablo
 PIVOT
 (
    SUM(TotalPayment)
    FOR Date IN ([2009-11],[2009-12],[2010-01])
 )
 AS p

这是月度总付款和编写此查询的人每月手动添加年月。我需要动态地做。

如何使用带有循环的SQL查询或类似的东西从表中动态获取月份?

谢谢你的帮助!

sql sql-server
1个回答
2
投票

我建议你使用relative时间而不是absolute。通过这种方式,您的查询始终是最新的。在这里,我在SQL Fiddle上发布了一个样本

MS SQL Server 2014架构设置:

create table t ( d date, i int );
insert into t values
( '2016-01-01', 100 ),
-- ... some other data
( '2017-12-13', 100 );

我使用CTE逐步编写查询:

with 
cooked as          --change to relative months (from today)
( select datediff(MONTH,getdate(), d ) as dif, i
  from t
),
filtered as        --just take the last 12 months
( select dif as Date, i as TotalPayment
  from cooked
  where dif > -12
)
select *           --pivoting
from filtered
PIVOT
 (
    SUM(TotalPayment)
    FOR Date IN ([-11],[-10],[-9],[-8],
                 [-7],[-6],[-5],[-4],
                 [-3],[-2],[-1],[0])
 )
 AS p

在这里Results,其中[0]意味着这个飞蛾和[-11]意味着12个月前:

| -11 | -10 |  -9 |  -8 |  -7 |  -6 |  -5 |  -4 |  -3 |  -2 |  -1 |   0 |
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 500 | 500 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
© www.soinside.com 2019 - 2024. All rights reserved.