Oracle中基于不同条件对同一列求和的实现方法咨询
实现需求的Oracle SQL语句
嘿,针对你提出的汇总需求,我写了下面的Oracle SQL语句,用条件聚合和窗口函数就能完美实现你要的结果,而且和你期望的输出格式完全匹配:
SELECT Item, SubItem, Loc, -- Sum1: 按SubItem和Loc汇总所有Type的Qty SUM(Qty) AS Sum1, -- Sum2: 按SubItem和Loc仅汇总Type1、Type4的Qty SUM(CASE WHEN Type IN ('Type1', 'Type4') THEN Qty ELSE 0 END) AS Sum2, -- Sum3: 按Item和Loc汇总Type1、Type4的Qty(窗口函数实现跨SubItem的汇总) SUM(CASE WHEN Type IN ('Type1', 'Type4') THEN Qty ELSE 0 END) OVER (PARTITION BY Item, Loc) AS Sum3 FROM 你的表名 -- 记得替换成实际的表名 GROUP BY Item, SubItem, Loc ORDER BY Item, SubItem;
关键逻辑说明:
- Sum1:直接对
Qty求和,因为是按SubItem和Loc分组,自然会汇总该分组下所有Type的数量。 - Sum2:用
CASE WHEN筛选出Type1和Type4的记录,只对这些记录的Qty求和,其他Type的数量按0处理,不影响总和。 - Sum3:使用窗口函数
OVER (PARTITION BY Item, Loc),让同一个Item和Loc下的所有行共享同一个汇总值,这样每个SubItem行都会显示对应的Item+Loc级别Type1、Type4的总数量。
执行这个语句后,你会得到和期望完全一致的结果:
| Item | SubItem | Loc | Sum1 | Sum2 | Sum3 |
|---|---|---|---|---|---|
| D1 | SD1 | L1 | 30 | 20 | 55 |
| D1 | SD2 | L1 | 25 | 15 | 55 |
内容的提问来源于stack exchange,提问作者sqlpractice
相关产品推荐
相关产品推荐

