如何使用GROUP BY合并指定行,实现部分国家金额合并统计?
当然没问题!咱们可以通过先统一国家分组、再聚合的方式实现你要的结果。
原始数据
| ID | COUNTRY | AMOUNT |
|---|---|---|
| 1 | USA | 100 |
| 2 | USA | 100 |
| 3 | USA | 100 |
| 4 | FRA | 100 |
| 5 | ITA | 100 |
| 6 | ITA | 100 |
| 7 | FRA | 100 |
目标结果
| ID | COUNTRY | AMOUNT |
|---|---|---|
| 1 | USA | 300 |
| 2 | EUR | 400 |
实现方案
核心思路是先把FRA和ITA映射为统一的EUR,再按这个新的分组字段聚合金额,最后生成连续的ID。这里提供两种适配不同数据库版本的写法:
方法1:支持窗口函数的数据库(如PostgreSQL、MySQL 8+、SQL Server)
SELECT ROW_NUMBER() OVER (ORDER BY grouped_country) AS ID, grouped_country AS COUNTRY, SUM(AMOUNT) AS AMOUNT FROM ( SELECT CASE WHEN COUNTRY IN ('FRA', 'ITA') THEN 'EUR' ELSE COUNTRY END AS grouped_country, AMOUNT FROM your_table_name -- 替换成你的实际表名 ) AS mapped_data GROUP BY grouped_country ORDER BY ID;
方法2:不支持窗口函数的老版本数据库(如MySQL 5.x)
SET @id = 0; SELECT (@id := @id + 1) AS ID, grouped_country AS COUNTRY, SUM(AMOUNT) AS AMOUNT FROM ( SELECT CASE WHEN COUNTRY IN ('FRA', 'ITA') THEN 'EUR' ELSE COUNTRY END AS grouped_country, AMOUNT FROM your_table_name -- 替换成你的实际表名 ) AS mapped_data GROUP BY grouped_country ORDER BY grouped_country;
代码说明
- 内层子查询用
CASE WHEN完成国家分组的映射,把需要合并的FRA和ITA统一转为EUR; - 外层查询按映射后的国家分组,用
SUM()计算每组的总金额; - ID字段通过窗口函数
ROW_NUMBER()或变量自增的方式生成,保证结果里的ID是连续的序号。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

