2013-04-04 29 views
1

表具有如下所示的數據。它包含了我要尋找一個查詢的兩個帳號每次更改帳戶編號時要重置的運行總計數

 
P_ID AcctNo Date Amount 
1 111A 04/03/2011 -331 
2 111A 04/03/2011 600 
3 111A 04/03/2011 20000 
4 111A 05/03/2011 -20000 
5 111A 10/03/2011 -260 
6 111B 01/08/2011 2 
7 111B 12/09/2012 500 
8 111B 13/09/2012 -166 
9 111B 13/09/2012 -225 

的數據給我運行總和,如下圖所示(的運行總計被重置帳戶改變):

 
P_ID AcctNo Date Amount Running Total 
1 111A 04/03/2011 -331 -331 
2 111A 04/03/2011 600  269 
3 111A 04/03/2011 20000 20269 
4 111A 05/03/2011 -20000 269 
5 111A 10/03/2011 -260 9 
6 111B 01/08/2011 2  2 
7 111B 12/09/2012 500  502 
8 111B 13/09/2012 -166 336 
9 111B 13/09/2012 -225 111 

+0

什麼版本的SQL Server? – 2013-04-04 06:52:51

+0

這是2008 R2。感謝2012年的解決方案。請記住,如果我們遷移到2012 – user1955215 2013-04-04 07:10:03

回答

1

試試這個: -

SELECT P_ID,AcctNo, Amount, 
(SELECT SUM(Amount) as total 
    FROM YourTable s 
    WHERE s.P_ID <= a.P_ID and s.AcctNo=a.AcctNo 
) AS b 
FROM YourTable a 

演示在SQLFIDDLE

結果

╔══════╦════════╦════════╦═══════╗ 
║ P_ID ║ ACCTNO ║ AMOUNT ║ B ║ 
╠══════╬════════╬════════╬═══════╣ 
║ 1 ║ 111A ║ -331 ║ -331 ║ 
║ 2 ║ 111A ║ 600 ║ 269 ║ 
║ 3 ║ 111A ║ 20000 ║ 20269 ║ 
║ 4 ║ 111A ║ -20000 ║ 269 ║ 
║ 5 ║ 111A ║ -260 ║  9 ║ 
║ 6 ║ 111B ║  2 ║  2 ║ 
║ 7 ║ 111B ║ 500 ║ 502 ║ 
║ 8 ║ 111B ║ -166 ║ 336 ║ 
║ 9 ║ 111B ║ -225 ║ 111 ║ 
╚══════╩════════╩════════╩═══════╝ 
+1

謝謝,這完美的作品。 – user1955215 2013-04-04 07:10:29

3

如果您使用SQL Server 2012中,這是一個非常簡單的查詢:

declare @t table (P_ID int,AcctNo char(4), [Date] date, Amount int) 
insert into @t(P_ID,AcctNo,Date,Amount) values 
(1,'111A','20110304',-331), 
(2,'111A','20110304',600), 
(3,'111A','20110304',20000), 
(4,'111A','20110305',-20000), 
(5,'111A','20110310',-260), 
(6,'111B','20110801',2), 
(7,'111B','20120912',500), 
(8,'111B','20120913',-166), 
(9,'111B','20120913',-225) 

select *,SUM(Amount) OVER (PARTITION BY AcctNo ORDER BY P_ID 
     RANGE UNBOUNDED PRECEDING) from @t order by P_ID 

結果:

P_ID  AcctNo Date  Amount  
----------- ------ ---------- ----------- ----------- 
1   111A 2011-03-04 -331  -331 
2   111A 2011-03-04 600   269 
3   111A 2011-03-04 20000  20269 
4   111A 2011-03-05 -20000  269 
5   111A 2011-03-10 -260  9 
6   111B 2011-08-01 2   2 
7   111B 2012-09-12 500   502 
8   111B 2012-09-13 -166  336 
9   111B 2012-09-13 -225  111 

它使用SQL Server 2012中的新功能爲它在範圍上應用集合函數 - 實際上,在這種情況下甚至不需要RANGE子句,因爲:

如果ROWS/RANGE未指定,而是指定ORDER BYRANGE UNBOUNDED PRECEDING AND CURRENT ROW作爲默認窗框

但我加入這裏以使其更清晰發生了什麼事。

相關問題