Многократные итоги SQL Server - PullRequest
1 голос
/ 11 мая 2010

У меня есть такая таблица

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 мая 2010

В отличие от 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 голосов
/ 11 мая 2010

Хотелось бы что-нибудь подобное для вас ...?

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

Это предполагает, однако, что пользователь не может иметь более одного балла в день. (Какой у тебя ПК?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...