【问题标题】:How to Subtracting sum of previous rows data from current row's data in SQL如何从SQL中的当前行数据中减去前行数据的总和
【发布时间】:2016-11-19 09:34:48
【问题描述】:

我有一个名为 t1 的表 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 中运行 谢谢

【问题讨论】:

  • 这不是 SQL 编写服务,这里的人宁愿帮助你改进你已经尝试过的东西。请包含您已经编写的一些查询以尝试解决此问题,或者至少包含您在研究如何使用GROUP BY 执行 SQL SELECT 时阅读的一些链接。
  • 如果你用的是Firebird 3,可以看window functions

标签: sql group-by firebird


【解决方案1】:

基本查询似乎是:

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 不支持窗口函数,但您也可以使用相关子查询。 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;

编辑:

使用窗口函数(在 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;

【讨论】:

  • Firebird 3 支持窗口函数。
  • 不幸的是,Firebird 版本是 2.5,并且 t 为(选择周,总和(金额 > 0 时的情况,然后金额为 0 结束)作为库存,总和(金额 0时的情况,然后金额其他0结束)作为库存,总和(金额
【解决方案2】:

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

用 t 作为 ( 选择周,总和(金额> 0然后金额为0结束的情况)作为库存, 总和(金额

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多