2010-05-11 167 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是什么?)