web-dev-qa-db-fra.com

Comment utiliser SUM () OVER ()

Je ne comprends pas le bug de ce code

ID      AccountID       Quantity
1          1               10           Sum = 10
2          1               5                = 10 + 5 = 15
3          1               2                = 10 + 5 + 2 = 17
4          2               7                = 7
5          2               3                = 7 + 3 = 10  

SELECT ID, AccountID, Quantity, 
       SUM(Quantity) OVER (PARTITION BY AccountID ) AS TopBorcT, 
FROM tCariH
18
serkan

Il semble que vous vous attendiez à ce que la requête renvoie des totaux en cours d'exécution, mais elle doit vous avoir donné les mêmes valeurs pour les deux partitions de AccountID.

Pour obtenir des totaux cumulés avec SUM() OVER (), vous devez ajouter un ORDER BY sous-clause après PARTITION BY …, comme ça:

SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY ID)

Mais rappelez-vous, tous les systèmes de base de données ne prennent pas en charge ORDER BY dans la clause OVER d'une fonction d'agrégation de fenêtres. (Par exemple, SQL Server ne l'a pas pris en charge jusqu'à la dernière version, SQL Server 2012.)

27
Andriy M

si vous utilisez SQL 2012, vous devriez essayer

SELECT  ID, 
        AccountID, 
        Quantity, 
        SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY AccountID rows between unbounded preceding and current row ) AS TopBorcT, 
FROM tCariH

si disponible, meilleure commande par colonne de date.

7
UV.

La requête serait comme ceci:

SELECT ID, AccountID, Quantity, 
       SUM(Quantity) OVER (PARTITION BY AccountID ) AS TopBorcT 

       FROM #Empl ORDER BY AccountID

Partition par des œuvres comme group by. Ici, nous regroupons par AccountID donc la somme correspondrait à AccountID.

Premier premier cas, AccountID = 1, puis somme (quantité) = 10 + 5 + 2 => 17 & Pour AccountID = 2, puis somme (Quantité) = 7 + 3 => 10

donc le résultat apparaîtrait comme attaché instantané .

2
AjaySharma2061