SQL 如何从当前行的数据中减去前几行数据的总和

How to Subtracting sum of previous rows data from current row's data in SQL

我有一个名为 t1 的 table firebird,它有 3 列(周、日期、数量)。 我需要根据周列和

对数据库进行分组
  1. 总和正数(库存)
  2. 求和负数(已售出)
  3. 从已售出(当前记录)中减去库存(先前记录)

我附上了 t1 和 t2 的图片

t1:

week    date    amount
18/06/2016  14/06/2016  94
18/06/2016  15/06/2016  0
18/06/2016  16/06/2016  0
18/06/2016  17/06/2016  0
18/06/2016  18/06/2016  -1
25/06/2016  19/06/2016  -2
25/06/2016  20/06/2016  -1
25/06/2016  21/06/2016  0
25/06/2016  22/06/2016  -1
25/06/2016  23/06/2016  -1
25/06/2016  24/06/2016  -3
25/06/2016  25/06/2016  -1
02/07/2016  26/06/2016  -1
02/07/2016  27/06/2016  -2
02/07/2016  28/06/2016  0
02/07/2016  29/06/2016  1
02/07/2016  30/06/2016  0
02/07/2016  01/07/2016  -1
09/07/2016  03/07/2016  -1
09/07/2016  04/07/2016  -1
09/07/2016  05/07/2016  -2
09/07/2016  06/07/2016  0
09/07/2016  07/07/2016  -2
09/07/2016  08/07/2016  -1
09/07/2016  09/07/2016  -3

t2:

week      sold     stock
          null      94
18/06/2016  1       93
25/06/2016  9       84
02/07/2016  3       81
09/07/2016  9       72

我正在使用 Firebird,我的最终脚本应该是 运行 firebird 或标准 sql 谢谢

基本查询似乎是:

select week, sum(case when amount > 0 then amount else 0 end) as stock,
       sum(case when amount < 0 then amount else 0 end) as sold
from t1
group by week;

Firebird 不支持 window 函数,但您也可以使用相关子查询。 CTE 有帮助。我认为是:

with t as (
      select week, sum(case when amount > 0 then amount else 0 end) as stock,
             sum(case when amount < 0 then amount else 0 end) as sold
      from t1
      group by week
     )
select t.*,
       (select sum(t2.stock) + sum(t2.sold)
        from t t2
        where t2.week <= t.week
       ) as stock
from t;

编辑:

使用 window 函数(在 Firebird 3 中)这更容易:

select week, sum(case when amount > 0 then amount else 0 end) as stock,
       sum(case when amount < 0 then amount else 0 end) as sold,
       sum(amount) over (order by week) as 
from t1
group by week;

感谢您的帮助 -- 一切正常

以t为( select 周,总和(金额 > 0 则金额 else 0 结束的情况)作为库存, 总和(当金额 < 0 然后金额 else 0 结束)作为售出 从 t1 按周分组 ) select t.*, (select 总和(t2.stock) + 总和(t2.sold) 从 t t2 其中 t2.week <= t.week ) 作为股票 来自 t;