2012-04-06 7 views
13

Non riesco a capire bug di questo codiceCome posso usare SUM() OVER()

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 
+4

Si prega di migliorare la presentazione delle domande e l'inquadratura. Qual è la domanda qui? – Marshal

+2

Risultati attesi e attuali per favore? –

risposta

24

Sembra come vi aspettavate la query per restituire totali parziali, ma deve vi ho dato gli stessi valori per entrambi partizioni di AccountID.

Per ottenere totali parziali con SUM() OVER(), è necessario aggiungere un sub-clausola di ORDER BY dopo PARTITION BY …, in questo modo:

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

Ma ricordate, non tutti i sistemi di database supportano ORDER BY nella clausola OVER di un aggregato finestra funzione. (Per esempio, SQL Server non supportava fino a quando l'ultima versione, SQL Server 2012.)

+7

Per chiarire questo: un sum() senza un 'order by' sommerà semplicemente tutti i valori per il gruppo definito dalla partizione. Btw: SQL Server era/è l'unico (AFAIK) DBMS che supporta le funzioni di windowing senza supportare un ordine nella clausola di partizione. Gli altri (PostgreSQL, Oracle, DB2, Teradata) non hanno questa limitazione –

+0

Penso che tu abbia ragione riguardo ai sistemi con supporto limitato delle funzioni di aggregazione di finestre. Lo sospettavo ma non ne ero sicuro. Dando un'occhiata a un'altra domanda (correlata) degli OP, ora posso vedere che SQL Server * è * il sistema di database dell'OP in particolare in questo caso, e anche uno pre-2012. –

+0

Da quello che posso dire, 'ORDER BY' è stato aggiunto in Sql 2005: http://msdn.microsoft.com/en-us/library/ms189461(v=sql.100).aspx –

6

se si utilizza SQL 2012 si dovrebbe cercare

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

se disponibile, meglio ordinare per colonna data.

1

Query sarebbe come questo:

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

     FROM #Empl ORDER BY AccountID 

partizione da opere come il raggruppamento. Qui stiamo raggruppando per AccountID, quindi la somma corrisponderebbe a AccountID.

primo primo caso, AccountID = 1, allora sum (quantità) = 10 + 5 + 2 => Per AccountID = 2, quindi somma (quantità) = 7 + 3 => 10

quindi il risultato apparirebbe come allegato snapshot.