it-swarm.com.de

Subtrahieren der Summe der Daten früherer Zeilen von den Daten der aktuellen Zeile in SQL

Ich möchte eine Tabelle oder Ansicht in SSMS erstellen, die eine Spalte mit dem Namen qoh haben sollte. In dieser Spalte sollten Summenwerte der Spalte rel_qty berechnet werden. d.h.

  1. Die ersten Daten von qoh entsprechen dem Wert der ersten Zeile von rel_qty.
  2. Der zweite Wert von qoh Sollte die Summe aus dem Wert der ersten und zweiten Zeile von rel_qty sein.
  3. Der dritte Wert von qoh Sollte die Summe aus dem Wert der ersten, zweiten und dritten Zeile von rel_qty sein.

gibt es dafür Möglichkeiten?

Hier ist meine Anfrage. aber diese Abfrage erfüllte nur die erste und zweite Zeile nicht mehr als das,

SELECT  a.id, a.tot_qty, a.rel_qty, 
    (a.tot_qty - 
        COALESCE (a.rel_qty +
            (SELECT b.rel_qty
        FROM    dbo.foo AS b
        WHERE   (b.id = a.id - 1)), 
        a.rel_qty)
    ) AS qoh 
FROM    dbo.foo AS a
ORDER BY    a.id

Und wenn meine ID einen Wert überspringt, konnte diese Abfrage die Berechnung nicht durchführen. Wie kann ich das beheben?

hier ist ein Screenshot meines Ergebnisses

(click here to check the screenshot

5
Marin Mohanadas

Es scheint, dass Sie eine laufende Summe brauchen.

Wenn tot_qty ist in allen Zeilen gleich, dann können Sie verwenden

SELECT  id, 
        tot_qty, 
        rel_qty, 
        tot_qty - SUM(rel_qty) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING) AS qoh 
FROM dbo.foo
ORDER BY id;

ROWS UNBOUNDED PRECEDING ist die abgekürzte Version von ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Diese Fensterrahmenoption bedeutet, dass für jede Zeile das SUM sich selbst und alle Vorgänger enthält, wie von id geordnet.

Die Option ROWS ist möglicherweise wichtig für die Effizienz, wie in Beste Ansätze zum Ausführen von Summen - aktualisiert für SQL Server 2012 beschrieben

9
Martin Smith