2013-10-09 7 views
8

Hier ist mein Problem machen ..Wie eine Summe ohne Gruppe von

Actual Auction Ammanat id 
7000  500  100  228,229 
7000  100  100  228,229 
7000  900  100  228,229 
5000  0   0   230 

ich führen möchte, wie unten

gegeben
Actual Auction Ammanat Remaining id 
7000  500  100  5550  228,229 
7000  100  100  5550  228,229 
7000  900  100  5550  228,229 
5000  0   0   5000  230 

Hier Remaining ist (sum(auction)-actual).

Ich benutze PostgreSQL. Aber wenn jemand Lösung in SQL Server kennt, wird es OK sein.

+0

'(Summe (Auktion) -ist)' macht keinen Sinn. Sollte wahrscheinlich "tatsächlich - Summe (Auktion)" sein. –

Antwort

12

Sie müssen eine Fensterfunktion verwenden - http://www.postgresql.org/docs/9.3/static/tutorial-window.html

Etwas wie:

(Sum(Auction) OVER()) - actual AS Remaining 
+0

Vielen Dank ... ich möchte auch fragen, wie mit diesem Problem in SQL umzugehen? –

+1

SQL Server hat auch diese Funktion, mit der gleichen Syntax: http://technet.microsoft.com/en-us/library/ms189461.aspx –

+1

Ich denke, es sollte tatsächlich sein - Summe (Auktion) OVER (PARTITION VON ID) AS verbleibend' –

5

Idan ist 100% richtig. Ich möchte eine Erklärung dafür liefern:

(SUM (Auction) OVER()) 
  • OVER() schafft ein Fenster einschließlich alle Zeilen aus der ursprünglichen Abfrage.
  • SUM (Auction) ist eine Fensterfunktion, die die Summe von Auction berechnet.

ist hier eine weitere Erklärung:

  • Fenster ein vom Benutzer angegebene innerhalb eines Abfrageergebnis Satz von Zeilen ist.

  • Fenster Funktion berechnet einen Wert (z. B. SUM) über alle Zeilen im Fenster.

  • Alle Zeilen sind in dem Fenster, weil OVER() nicht PARTITION BY enthält. Mit PARTITION BY würde das Fenster eine Teilmenge von Zeilen enthalten.

From MSDN:

... definiert die OVER-Klausel ein Fenster oder vom Benutzer festgelegten Satz von Zeilen innerhalb eines Abfrageergebnisses. Eine Fensterfunktion berechnet dann einen Wert für jede Zeile im Fenster. Sie können die OVER-Klausel mit Funktionen zur Berechnung aggregierter Werte verwenden, wenn die OVER-Klausel PARTITION BY nicht enthält. Dies bedeutet, dass die Funktion auf alle von der Abfrage zurückgegebenen Zeilen angewendet wird.