如何以最佳方式对过去一年的月份列求和?
How to SUM over month columns in past year best way?
我从 1 月到 12 月有以下专栏:
Year - Jan - Feb - Mar - (etc.) - Dec
---- --- --- --- ---
2015 25 32 102 12
2016 30 40 50 60
过去一年如何有效地做SUM?假设从 GETDATE() 开始,如果今天是 16.08.2017,我想要 SUM 从 16.08.2016(从 2016 年 8 月到 2017 年 8 月)。
我有以下代码:
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());
哪个有效,但是有没有办法不用交叉应用? (例如:只是 where 子句)
像下面这样使用 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()
假设您所有的列月份名称都是 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
我从 1 月到 12 月有以下专栏:
Year - Jan - Feb - Mar - (etc.) - Dec
---- --- --- --- ---
2015 25 32 102 12
2016 30 40 50 60
过去一年如何有效地做SUM?假设从 GETDATE() 开始,如果今天是 16.08.2017,我想要 SUM 从 16.08.2016(从 2016 年 8 月到 2017 年 8 月)。
我有以下代码:
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());
哪个有效,但是有没有办法不用交叉应用? (例如:只是 where 子句)
像下面这样使用 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()
假设您所有的列月份名称都是 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