2012-04-06 18 views
13

nie mogę zrozumieć błąd ten kod zaJak mogę użyć 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

Popraw jakość prezentacji i kadrowania. Co tu jest? – Marshal

+2

Proszę o oczekiwane i rzeczywiste wyniki? –

Odpowiedz

24

Wydaje się oczekiwany zapytanie do powrotu działa sumy, ale musi dać Ci te same wartości dla obu partycje AccountID.

Aby uzyskać sumy działa z SUM() OVER(), trzeba dodać ORDER BY Subklauzuli po PARTITION BY …, tak:

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

jednak pamiętać, że nie wszystkie systemy baz danych obsługują ORDER BY w klauzuli okna kruszywa OVER funkcjonować. (Na przykład, SQL Server nie obsługują go do najnowszej wersji SQL Server 2012.)

+7

Aby to wyjaśnić: a sum() bez 'order by' po prostu sumuje wszystkie wartości dla grupy zdefiniowanej przez partycję. Btw: SQL Server był/jest jedynym (AFAIK) DBMS wspierającym funkcje okienkowania bez obsługi zamówienia w klauzuli partycji. Inne (PostgreSQL, Oracle, DB2, Teradata) nie mają tego ograniczenia. –

+0

Myślę, że musisz mieć rację co do systemów z ograniczoną obsługą funkcji agregujących okna. Podejrzewałem to, ale nie byłem do końca pewien. Patrząc na inne (powiązane) zagadnienie PO, mogę teraz zauważyć, że SQL Server * jest * systemem baz danych OP, szczególnie w tym przypadku, i przed 2012 r. Też. –

+0

Z tego, co mogę powiedzieć, "ORDER BY" został dodany w Sql 2005: http://msdn.microsoft.com/en-us/library/ms189461(v=sql.100).aspx –

6

jeśli używasz SQL 2012 należy spróbować

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

jeśli są dostępne, lepiej Sortuj według Data kolumnie.

1

Zapytanie byłoby tak:

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

     FROM #Empl ORDER BY AccountID 

podziału przez dzieła takich jak grupy przez. Tutaj grupujemy według AccountID, więc suma będzie odpowiadać AccountID.

pierwsze pierwszym przypadku, identyfikator konta = 1, a suma (ilość) = 10 + 5 + 2 => Na accountid = 2, a suma (liczby) = 7 + 3 => 10

, więc wynik będzie wyglądał jak dołączony snapshot.