2017-08-17 72 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/ –