如何以过去一年的最佳方式汇总月份列?

时间:2017-08-16 08:17:54

标签: sql sql-server database tsql calculated-columns

我从1月到12月有以下专栏:

Year - Jan - Feb - Mar - (etc.) - Dec
----   ---   ---   ---            ---
2015   25    32    102            12
2016   30    40    50             60

过去一年如何有效地做SUM?让我们来自GETDATE(),如果今天是16.08.2017,我想从2016年8月16日(从2016年8月到2017年8月)获得SUM。

我有以下代码:

select sum(val)
from t cross apply
     (values (t.year, t.Jan, 1),
             (t.year, t.Feb, 2),
             . . .
     ) v(yyyy, val, mon)
where yyyy * 100 + mon >= (year(getdate()) - 1) * 100 + month(getdate());

的作品 ,但如果没有交叉申请,有没有办法做到这一点? (例如:just where clause)

2 个答案:

答案 0 :(得分:3)

如下所示使用UNPIVOT表示法的东西。

select sum(val)
from
(select * from t )s
unpivot
( val for month in ( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec))up
where 
  cast(month+ cast(year as varchar(20)) as date) 
   between  dateadd(m,-12,getdate()) and getdate()

Live Demo

答案 1 :(得分:0)

假设您的所有列月份名称都是3个字母,您还可以使用动态SQL。像下面这样的东西应该工作。

DECLARE @CurrentDate DATE = CAST(GETDATE() AS DATE)
DECLARE @Year INT = DATEPART(YEAR, @CurrentDate)
DECLARE @PrevYear INT = @Year - 1
DECLARE @Month CHAR(3)

SET @Month = convert(char(3), @CurrentDate, 0)

BEGIN
EXEC('SELECT SUM(t.'+@Month+') FROM t WHERE Year >= ' + @PrevYear + ' AND Year <= ' + @Year)
END