SQL 如何从当前行的数据中减去前几行数据的总和
How to Subtracting sum of previous rows data from current row's data in SQL
我有一个名为 t1 的 table firebird,它有 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;
我有一个名为 t1 的 table firebird,它有 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;