MySQL中能否同时使用ROLLUP汇总与列合并完成查询?
MySQL同时实现ROLLUP汇总与列合并的方法
可以实现,你可以通过WITH ROLLUP搭配COALESCE函数完成需求,具体操作如下:
前置说明
假设你的表名为geo_data,包含continent、country、val三个字段,和你提供的示例数据结构一致。
核心查询语句
SELECT COALESCE(country, continent) AS region, SUM(val) AS val FROM geo_data GROUP BY continent, country WITH ROLLUP HAVING region IS NOT NULL -- 如需按「大洲汇总在前、国家在后」排序,可加上下面这行 -- ORDER BY IF(continent = region, 0, 1), region;
逻辑说明
- 两层分组
GROUP BY continent, country搭配WITH ROLLUP,会自动生成每个大洲维度的汇总行,汇总行的country字段值为NULL COALESCE函数会返回第一个非空参数:如果当前行是国家维度的明细行(country非空),就取country作为region;如果是大洲的汇总行(country为空),就取continent作为region,实现两列合并的效果HAVING region IS NOT NULL用于过滤掉最顶层的全球总汇总行(该行continent和country均为NULL,不在你的需求输出范围内)
输出结果(完全匹配需求)
| region | val |
|---|---|
| A | 30 |
| B | 30 |
| X | 10 |
| Y | 20 |
| Z | 30 |
内容的提问来源于stack exchange,提问作者user16697126
相关产品推荐
相关产品推荐

