有时候会碰到这种情况,计算累计值时,不是整体的累计,而只需要累计到当前的行,每一行计算它上面所有行的和。比如下面图所示,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 的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐