当前位置: 代码迷 >> Sql Server >> 能不能在窗口函数的情况下作跨年数据的sum
  详细解决方案

能不能在窗口函数的情况下作跨年数据的sum

热度:24   发布时间:2016-04-24 09:17:16.0
能不能在窗口函数的情况下做跨年数据的sum
目前是这样的,我写一段代码,做一些数据的累积值
比如 
时间     值
201001    1
201002    1
201003    1
201004    1
201005    1
201006    1
201007    1
201008    1
201009    1
201010    1
201011    1
201021    1
201101    1
 sum( 值) over (order by 时间 rows between unbounded preceding and current row)
发现这样不能跨年,不然 201101的值就是13而不是想要的1
问在还是用窗口函数的情况下能否实现,怎么实现


------解决思路----------------------
这是 oracle 的语法吧,还是 sqlserver 2012 (2014)的?
------解决思路----------------------
DECLARE @T TABLE([Date] DATE,Value INT)

INSERT INTO @T VALUES
('20100101',1),
('20100201',1),
('20100301',1),
('20100401',1),
('20100501',1),
('20100601',1),
('20100701',1),
('20100801',1),
('20100901',1),
('20101001',1),
('20101101',1),
('20101201',1),
('20110101',1)

SELECT [DATE],sum(Value) over (PARTITION BY YEAR([DATE]) order by [Date] rows between unbounded preceding and current row) FROM @T

------解决思路----------------------
这个应该是ORACLE的语法
这个可以根据年来PARTITION BY
------解决思路----------------------

这个开窗函数的功能,在sql server 2012开始支持,当然 在 oracle也有。

上面2 楼的用法是对的,增加一个 partition by year 就可以了,

sum( 值) over (partition by left(时间,4) order by 时间  rows between unbounded preceding and current row)

意思是 首先把 数据按照 取出的前4位,就是按照年来分组,这样就形成了一个窗口(有几年的数据,就会有几个窗口),然后 对于每一行数据按照时间先后进行排序,取出从窗口的第一行开始 到 当前行,就是一个 累积的 求和。
  相关解决方案