2017-08-17 70 views
3

我有一个包含日期和事务的表。我需要计算运行总数(除非需要在“数量”中存在负值时重置为零,然后再次开始计算运行总数,否则使用总分区将会很容易)。有任何想法吗?SQL运行总计并重置

account|amount|  date   |total| 
123456 |50 |2017-01-01 00:00:00|50 
123456 |50 |2017-01-02 00:00:00|100 
123456 |100 |2017-01-03 00:00:00|200 
123456 |-50 |2017-01-04 00:00:00|0 
123456 |100 |2017-01-05 00:00:00|100 
123456 |100 |2017-01-06 00:00:00|200 
+0

你见过https://stackoverflow.com/questions/22235959/window-functions-running-total-with-reset?rq=1 –

+0

没有,他说他想从0重新启动的总和,如果遇到负数的行 –

回答

5

使用更新变量方法,您可以使用重置选项计算运行总数。

declare @tblItems table(
ID int identity(1, 1), 
Amount decimal(12, 3), 
RunningTotal decimal(12, 3) default(0) 
) 

insert into @tblItems(Amount) 
values 
(50), 
(20), 
(-100), 
(5), 
(10) 
; 

DECLARE @RunningTotal decimal(12, 3) = 0; 

UPDATE @tblItems 
SET @RunningTotal = RunningTotal = case when amount<0 then 0 else (@RunningTotal + Amount) end 
FROM @tblItems; 

SELECT ID, Amount, RunningTotal 
FROM @tblItems 
ORDER BY ID; 
+0

您的解决方案假定数据库系统按插入它们的顺序处理该行。它是否始终如此? –

+0

是的同意,可能是这种情况。但通常情况下,运行总数通常用于报告,我认为报告目的通常没有庞大的数据表。就像我在许多报告中所做的那样,首先使用order by子句提取临时表中的报告数据(这当然不会很大)。那么这是一个简单的工作。 –

+0

我发现很好的文章处理使用聚集索引的订购:https://sqlsunday.com/2014/06/29/inline-variable-assignment-in-update/ –