SQL Server逐行累加到当前行的方法

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值