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

在开发中碰到这种情况。计算累计值时,不是整体的累计,而只需要累计到当前的行,每一行计算它上面所有行的和。比如下面图所示,kind表示类别,PrdDate表示日期,Qty表示当前日期的Kind的数量。现在需要添加一个字段,计算累计到每一行日期的Qty的和。

通过查找资料,发现需要使用开窗函数来完成相应的操作。

以下是具体的实现方法:

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

利用开窗函数计算累计的值

select sum(Qty) over (partition by Kind order by Kind rows between unbounded preceding and current row) NewQty,* from #Temp

查询结果如下,语句中的 partition by 是因为我造的表里面有 “A001”和“A002” 两种Kind ,需要计算每一个kind的累计和。如果没有像我这样的有kind分组,是可以不需要partition by 的。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值