首页 > 解决方案 > SQL:按条件求和

问题描述

我正在与 Oracle 合作,目前无法实现我需要的查询。

假设我有下表:

- ID    Date    Type    Value
 - 1    01/12/2016  prod    1
 - 2    01/01/2017  test    10
 - 3    01/06/2017  test    20
 - 4    01/12/2017  prod    30
 - 5    15/12/2017  test    40
 - 6    01/01/2018  test    50
 - 7    01/06/2018  test    60
 - 8    01/12/2018  prod    70

我需要将“prod”类型+最后一个“prod”值之间的值相加。结果应该是:

- 1 01/01/2016 - 1
- 2 01/01/2017 - 60
- 3 01/06/2017 - 60
- 4 01/12/2017 - 60
- 5 15/12/2017 - 220
- 6 01/01/2018 - 220
- 7 01/06/2018 - 220
- 8 01/12/2018 - 220

我首先必须在不考虑 TYPES 的情况下按 YEAR 对 VALUES 求和。需求发生了变化,我不知道如何开始为每一行识别前一个“prod”DATE 并将每个 VALUE 相加,包括最后一个“prod”类型。

谢谢

标签: sqloraclesumcriteria

解决方案


您可以使用 -- 上的累积总和来定义组type = 'PROD',然后使用窗口函数进行最终总和:

select t.*,
       sum(value) over (partition by grp) as total
from (select t.*,
             sum(case when type = 'PROD' then 1 else 0 end) over (order by id desc) as grp
      from t
     ) t
 order by id;

要查看分组逻辑,请查看:

ID    Date    Type    Value      Grp
1    01/12/2016  prod    1        3
2    01/01/2017  test    10       2
3    01/06/2017  test    20       2
4    01/12/2017  prod    30       2
5    15/12/2017  test    40       1
6    01/01/2018  test    50       1
7    01/06/2018  test    60       1
8    01/12/2018  prod    70       1

这标识了需要求和的组。这DESC是因为“prod”结束了一个组。如果“prod”开始了一个组(即包含在下一行的总和中),那么ASC将被使用。

Rextester 演示


推荐阅读