SQL中当前行数据减去前一行数据的总和

Mar*_*das 5 sql-server sql-server-2014 running-totals

我想在 SSMS 中创建一个表或视图,它应该有一个名为qoh的列。在该列中应该计算列rel_qty 的总和值。IE

  1. qoh的第一个数据与rel_qty的第一行的值 相同
  2. qoh 的第二个值应该是rel_qty的第一行和第二行的值之
  3. qoh 的第三个值 应该是第一行、第二行和第三行的rel_qty值的总和

有没有可能做到这一点?

这是我的查询。但是这个查询只满足第一行和第二行,仅此而已,

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
Run Code Online (Sandbox Code Playgroud)

如果我的 id 跳过一个值,则此查询无法进行计算。我怎样才能解决这个问题?

这是我的结果截图

单击此处查看屏幕截图

Mar*_*ith 9

看来你需要一个运行总数。

如果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;
Run Code Online (Sandbox Code Playgroud)

ROWS UNBOUNDED PRECEDING是 的缩写版本ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

这个窗口框架选项意味着对于每一行,SUM将包括它自己和所有按顺序排列的前辈id

运行总计的最佳方法 - 针对 SQL Server 2012 更新中ROWS所述,该选项对于效率可能很重要