web-dev-qa-db-ja.com

SQLの現在の行のデータから前の行のデータの合計を引く

qohという列があるはずのSSMSでテーブルまたはビューを作成したいと思います。その列では、列の合計値を計算する必要がありますrel_qty。つまり.

  1. qohの最初のデータは、最初の行のrel_qtyの値と同じです。
  2. qohの2番目の値は、rel_qtyの1行目と2行目の値の合計である必要があります。
  3. qohの3番目の値は、1、2、3行目のrel_qtyの値の合計である必要があります。

これを行う可能性はありますか?

これが私の質問です。しかし、このクエリはそれ以上ではなく、最初と2番目の行のみを満たしました。

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

そして、私のidが1つの値をスキップした場合、このクエリは計算に失敗しました。どうすれば修正できますか?

これが私の結果のスクリーンショットです

click here to check the screenshot

5
Marin Mohanadas

現在の合計が必要なようです。

tot_qtyがすべての行で同じ場合は、

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 PRECEDINGROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWの略語です。

このウィンドウフレームオプションは、各行について、SUMidで順序付けられたそれ自体とすべての先行オブジェクトを含むことを意味します。

合計を実行するための最善のアプローチ– SQL Server 2012用に更新 で説明されているように、ROWSオプションは潜在的に効率にとって重要です。

9
Martin Smith