有时候会碰到这种情况,计算累计值时,不是整体的累计,而只需要累计到当前的行,每一行计算它上面所有行的和。比如下面图所示,kind表示类别,PrdDate表示日期,Qty表示当前日期的Kind的数量。现在需要添加一个字段,计算累计到每一行日期的Qty的和。
要实现这样的需求很简单,使用开窗函数就可以解决,一句select语句就可以搞定。
以下是具体的实现方法:
1,造一张表,并往表里面写入数据(用来做例子)
create table #Temp (
Kind varchar(20),PrdDate date,Qty int
)
-- 写入Kind是A001的数据,随机给每行Qty 一个随机数
insert into #Temp(Kind,PrdDate,Qty)
select 'A001',convert( date, dateadd(day,+number,'2022-05-01') ) ,ABS(CHECKSUM(NewId())) % 20 + number
from master.dbo.spt_values b
WHERE type = 'P' AND number>0 and number <=30
-- 再写入Kind是A002的数据,随机给每行Qty 一个随机数
insert into #Temp(Kind,PrdDate,Qty)
select 'A002',convert( date, dateadd(day,+number,'2022-05-01') ) ,ABS(CHECKSUM(NewId())) % 20 + number
from master.dbo.spt_values b
WHERE type = 'P' AND number>0 and number <=30
2,利用开窗函数计算累计的Qty
select Kind,PrdDate,Qty,sum(Qty) over(partition by Kind order by PrdDate) as PrdQty
from #Temp
查询结果如下,语句中的 partition by 是因为我造的表里面有 “A001”和“A002” 两种Kind ,需要计算每一个kind的累计和。如果没有像我这样的有kind分组,是可以不需要partition by 的。

本文介绍了如何利用SQL的开窗函数解决按行累计的问题。通过创建临时表并填充数据,然后使用开窗函数`SUM() OVER (PARTITION BY ... ORDER BY ...)`来计算每个类别(Kind)每天(PrdDate)的累计数量(Qty)。这种方法适用于需要对分组数据进行逐行累计求和的场景。



3345

被折叠的 条评论
为什么被折叠?



