sql - 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”类型。
谢谢
解决方案
您可以使用 -- 上的累积总和来定义组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
将被使用。
推荐阅读
- c - 如何通过STM32L010接收来自HCRS04传感器的ECHO信号
- google-coral - macOS BigSur 无法识别 Google Edge TPU 开发板
- javascript - Navigator - getCurrentPosition() 承诺在找到位置之前解决
- python - 理解 Python 中的 [foo for bar, foo in arr]
- python - ValueError:具有多个元素的数组的真值不明确。遍历掩码数组时使用 a.any() 或 a.all()
- c# - 我如何制作它以使物品独一无二且不重复?
- javascript - 为什么 ReduxDevTools 不更新购物车操作?
- ios - userdefaults 不保存按钮状态
- java - 例外情况下使用策略模式好吗?
- facebook - 像 facebook 这样的平台可以阻止扫描 facebook 页面的能力吗?