2010-05-11 103 views
1

我有一個表像這樣SQL服務器多個運行總計

UserID Score Date 
5  6  2010-1-1 
7  8  2010-1-2 
5  4  2010-1-3 
6  3  2010-1-4 
7  4  2010-1-5 
6  1  2010-1-6 

我想獲得一個表像這樣

UserID Score RunningTotal Date 
5  6  6   2010-1-1 
5  4  10   2010-1-3 
6  3  3   2010-1-4 
6  1  4   2010-1-6 
7  8  8   2010-1-2 
7  4  12   2010-1-5 

謝謝!

+0

請參閱http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver – codeulike 2013-01-23 18:33:44

回答

1

Oracle,PostgreSQL甚至MySQL,SQL Server不同,沒有有效的方法來計算運行總數。

如果每個UserID分數很少,您可以使用此:

SELECT userId, 
     (
     SELECT SUM(score) 
     FROM scores si 
     WHERE si.UserID = so.UserID 
       AND si.rn <= so.rn 
     ) 
FROM (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY UserID) AS rn 
     FROM scores 
     ) so 

,不過,這將是較大的表非常低效的。

對於較大的表格,您可以使用(上帝幫助我)遊標獲益。

+0

感謝。幾個語法錯誤,但它足以讓我在我的路上。 「si.userId = so.UserID」正是我所需要的。 – super9 2010-05-12 08:54:29

0

會這樣的工作對你...?

SELECT UserID, Score, 
    (SELECT SUM(Score) 
    FROM TableName innerTable 
    WHERE innerTable.UserID = outerTable.userID 
     AND innerTable.Date <= outerTable.date) AS RunningTotal 
FROM TableName outerTable 

但是,這假定用戶每天不能有超過一個分數。 (你的PK是什麼?)