2016-08-05 8 views
0

Ich bin für eine SQL-Abfrage sucht den Unterschied zwischen zwei Werten wie im folgenden Beispiel zu berechnen:SQL Query Unterschiede zwischen den Werten erhalten aus zwei Reihen

Date  | OrderNr | TotalDelivered | -> DeliveredToday 
01.08.2016 | 123  | 1000   | -> 1000 
01.08.2016 | 456  | 250   | -> 250 
01.08.2016 | 789  | 3400   | -> 3400 
02.08.2016 | 123  | 1300   | -> 300 
02.08.2016 | 456  | 400   | -> 150 
02.08.2016 | 789  | 4000   | -> 600 
05.08.2016 | 123  | 1300   | -> 0 
05.08.2016 | 456  | 500   | -> 100 
05.08.2016 | 789  | 4050   | -> 50 

Also die Abfrage automatisch berechnen die "DeliveredToday" -Wert für jeden BestellNr und jeden Tag.

Ist das möglich?

Danke für Ihre Hilfe

+1

Was ist die Logik dahinter? – Jens

+0

Ja, was ist die Logik und können Sie auch die Abfrage, die Sie versucht haben zu schreiben? –

Antwort

1

können Sie LAG function verwenden, um die vorherige Zeile in der gleichen Größenordnung für den Zugriff auf und dann die Differenz berechnen:

SELECT t.Date, 
    t.OrderNr, 
    t.TotalDelivered, 
    t.TotalDelivered - t.PreviousDelivered as DeliveredToday 
FROM 
    (SELECT 
     Date, 
     OrderNr, 
     TotalDelivered, 
     LAG(TotalDelivered, 1, 0) OVER (PARTITION BY OrderNr ORDER BY Date ASC) AS PreviousDelivered 
    FROM tableName 
    ) t 

ich hier in Unterabfrage-Funktion verwendet LAG den vorherigen Wert zu erhalten von TotalDelivered für die gleiche Bestellung (dies wird durch PARTITION BY OrderNr spezifiziert) und nach Datum bestellt (ORDER BY Date ASC). Dann subtrahiere ich in der äußeren Abfrage den Wert PreviousDelivered von TotalDelivered und das Ergebnis ist die Anzahl der heute gelieferten.

Edit: Wie @SandipPatel in den Kommentaren erwähnt, ist es möglich, nicht Unterabfrage zu verwenden:

SELECT 
     Date, 
     OrderNr, 
     TotalDelivered, 
     TotalDelivered-LAG(TotalDelivered, 1, 0) OVER (PARTITION BY OrderNr ORDER BY Date ASC) AS PreviousDelivered 
FROM tableName 
+0

Gute, können Sie direkt verwenden Unterabfrage-Anweisung ohne obere Auswahl Abfrage –

+0

@SandipPatel Ja, Sie könnten alles ohne die Unterabfrage schreiben, aber ich dachte, der Code wäre verständlicher mit Unterabfrage – dotnetom

+0

kann ich woher kann ich diese Art von finden Funktion wie (Verzögerung), ich bin nicht in der Lage, in meinem sql Server Standardsystemfunktion zu finden –

Verwandte Themen