Oracle多列分组并合并指定国家行的实现方法
Oracle合并指定国家分组求和解决方案
首先看你的需求:把FRA、ITA合并为EUR,按月份和处理后的国家分组计算总金额。这里用CASE表达式配合分组聚合就能轻松实现。
先确认你的原始数据表:
COUNTRY | AMOUNT | MONTH USA | 100 | 1 USA | 100 | 1 USA | 100 | 2 FRA | 100 | 1 ITA | 100 | 1 ITA | 100 | 2 FRA | 100 | 2
期望得到的结果:
COUNTRY | AMOUNT | MONTH USA | 200 | 1 EUR | 200 | 1 USA | 100 | 2 EUR | 200 | 2
实现代码
下面是兼容所有Oracle版本的写法:
SELECT CASE WHEN COUNTRY IN ('FRA', 'ITA') THEN 'EUR' ELSE COUNTRY END AS COUNTRY, SUM(AMOUNT) AS AMOUNT, MONTH FROM your_table_name -- 替换成你实际的表名 GROUP BY CASE WHEN COUNTRY IN ('FRA', 'ITA') THEN 'EUR' ELSE COUNTRY END, MONTH ORDER BY MONTH, COUNTRY;
代码解释
- CASE表达式:核心逻辑,判断国家是否是FRA或ITA,是的话替换成EUR,其他国家保持原名;
- SUM(AMOUNT):对每个分组内的金额求和,得到每个国家/EUR在对应月份的总金额;
- GROUP BY:必须和SELECT里的分类逻辑完全一致,这样才能把FRA和ITA的记录归到同一个EUR分组里;
- ORDER BY:让结果按月份升序,再按国家排序,和你期望的输出顺序匹配。
如果你的Oracle版本是12c及以上,还可以简化GROUP BY部分(支持使用SELECT中的别名):
SELECT CASE WHEN COUNTRY IN ('FRA', 'ITA') THEN 'EUR' ELSE COUNTRY END AS COUNTRY, SUM(AMOUNT) AS AMOUNT, MONTH FROM your_table_name GROUP BY COUNTRY, MONTH -- 这里的COUNTRY是SELECT里的别名,12c+支持 ORDER BY MONTH, COUNTRY;
这个方案非常灵活,以后如果需要调整合并的国家列表,只需要修改IN ('FRA', 'ITA')里的内容就可以了。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

