2010-05-11 4 views
1

J'ai une table comme celui-ciSQL Server exécution de plusieurs Totaux

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 

Je voudrais obtenir une table comme celui-ci

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 

Merci!

+0

voir http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver – codeulike

Répondre

1

Contrairement Oracle, PostgreSQL et même MySQL, SQL Server n'a aucun moyen efficace pour calculer les totaux en cours d'exécution.

Si vous avez quelques scores par UserID, vous pouvez utiliser ceci:

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 

, cependant, ce sera très inefficace pour les grandes tables.

Pour des tables plus grandes, vous pourriez bénéficier d'utiliser (Dieu m'aide) un curseur.

+0

merci pour cela. quelques erreurs de syntaxe mais c'était assez pour me mettre sur mon chemin. le "si.userId = so.UserID" était exactement ce dont j'avais besoin. – super9

0

Quelque chose comme ceci fonctionnerait pour vous ...? Cela suppose, cependant, qu'un utilisateur ne peut pas avoir plus d'un score par jour. (Quel est votre PK?)

Questions connexes