正在运行的Total已添加到下一个分区


declare @Temp table 
(    
Grp int,
Bal float,
[Value] float    
)     
declare @Amt  float =1000;
Insert into @Temp(Grp,[Value])    
Values(1,10),(1,5),(1,15)
,(2,20),(2,5),(2,15)
,(3,50),(3,50)
select Grp,@Amt as Amount,Value,Bal from @Temp

所需输出:

Grp Amount Value Bal
1   1000    10  1000
1   1000    5   1000
1   1000    15  1000
2   1000    20  1030  ---(10+5+15)
2   1000    5   1030
2   1000    15  1030
3   1000    50  1070 ---- (20+5+15)
3   1000    50  1070

根据添加到第2组的第1组的"价值"的运行总数和添加到第3组的余额的第2组运行总数以及即将计算的余额

我知道如何计算运行总数,但我不会,因为总和会加到下一个分区。

请帮助有效地获得所需的结果。我正在使用SQL Server 2017

一种方法是outer apply:

select t.*, t.amount + coalesce(t2.value, 0)
from @temp t outer apply
(select sum(t2.value) as value
from @temp t2
where t2.grp < t.grp
) t2;

使用聚合和运行求和可能更有效:

select t.*,
(1000 + tt.running_value)
from @temp t join
(select t.grp, sum(value) as value,
sum(sum(value)) over (order by grp) - sum(value) as running_value
from @temp t
group by grp
) tt
on t.grp = tt.grp;

不幸的是,SQL Server并不完全支持range窗口框架,所以我认为没有一种只使用窗口函数来实现这一点的方便方法。但是group by可能会有更好的性能。

最新更新