web-dev-qa-db-fra.com

Soustraire la somme des données des lignes précédentes des données de la ligne actuelle dans SQL

Je veux créer une table ou une vue dans SSMS qui devrait avoir une colonne appelée qoh . Dans cette colonne doit être calculée la somme des valeurs de la colonne rel_qty . c'est à dire.

  1. Les premières données de qoh sont identiques à la valeur de la première ligne de rel_qty .
  2. La deuxième valeur de qoh doit être la somme des valeurs des première et deuxième lignes de rel_qty .
  3. La troisième valeur de qoh doit être la somme des valeurs des première, deuxième et troisième lignes de rel_qty .

existe-t-il des possibilités pour ce faire?

Voici ma requête. mais cette requête ne satisfait que les première et deuxième lignes pas plus que cela,

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

Et si mon identifiant saute une valeur, cette requête n'a pas réussi à faire le calcul. Comment puis-je réparer cela?

voici une capture d'écran de mon résultat

click here to check the screenshot

5
Marin Mohanadas

Il semble que vous ayez besoin d'un total cumulé.

Si tot_qty est le même dans toutes les lignes, vous pouvez utiliser

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 est la version abrégée de ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Cette option d'encadrement de fenêtre signifie que pour chaque ligne, le SUM s'inclura lui-même et tous ses prédécesseurs comme ordonné par id.

L'option ROWS est potentiellement importante pour l'efficacité, comme décrit dans Meilleures approches pour l'exécution des totaux - mise à jour pour SQL Server 2012

9
Martin Smith