SQL使用GROUP BY分组时如何同时返回分组汇总与总合计行?
实现方案
有两种常用的实现方式,可根据你使用的数据库类型选择:
方案1:使用ROLLUP扩展聚合语法(性能更优)
这是SQL标准支持的聚合扩展功能,仅需扫描一次表,执行效率更高,不同数据库的语法细节略有差异:
MySQL 写法
SELECT IFNULL(name, 'Total') AS name, SUM(amount) AS balance FROM `table` GROUP BY name WITH ROLLUP;
PostgreSQL/Oracle 写法
SELECT COALESCE(name, 'Total') AS name, SUM(amount) AS balance FROM "table" GROUP BY ROLLUP(name);
说明:ROLLUP会自动在分组结果末尾追加全局聚合行,该行的name字段默认返回NULL,因此用IFNULL/COALESCE函数将NULL替换为自定义的Total标识即可。
方案2:使用UNION ALL拼接结果(全版本兼容)
如果你的数据库不支持ROLLUP语法,可以用UNION ALL手动拼接分组结果和总计行,所有SQL环境都支持该写法:
SELECT name, SUM(amount) AS balance FROM `table` GROUP BY name UNION ALL SELECT 'Total' AS name, SUM(amount) AS balance FROM `table`;
说明:该写法会两次扫描表,数据量较大时执行效率低于ROLLUP方案。
注意:
table是SQL保留关键字,作为表名使用时需要用对应数据库的标识符包裹(MySQL用反引号`,PostgreSQL/Oracle用双引号"),避免触发语法错误。
内容的提问来源于stack exchange,提问作者js_new
相关产品推荐
相关产品推荐

