如何在单条SQL查询中同时返回分组统计结果与总计值?
如何在分组统计结果中添加总计行
嗨,我明白你的需求了——既要保留按Record分组的统计结果,又要在结果里加上所有分组的总计值,而且想用单条SQL实现对吧?我给你两种常用的解决方案,都能完美解决这个问题:
方法1:使用GROUP BY ROLLUP(推荐)
ROLLUP是SQL标准里的分组扩展语法,它会自动在分组结果的最后添加一行总计行,非常方便。结合你的需求,调整后的SQL应该是这样的:
SELECT COALESCE(CAST(record AS VARCHAR), '总计') AS Record, SUM(record_count) AS Record_Count FROM table_name WHERE <conditions> GROUP BY ROLLUP(record) ORDER BY CASE WHEN record IS NULL THEN 1 ELSE 0 END, -- 让总计行排在最后 SUM(record_count);
说明:
ROLLUP(record)会先按record分组统计,然后自动计算所有行的总计值,此时总计行的record字段会是NULL。- 用
COALESCE(CAST(record AS VARCHAR), '总计')是把NULL替换成可读性更好的“总计”文本(如果你的数据库里record是数值类型,需要先转成字符串才能和文本拼接)。 ORDER BY里的CASE语句是确保总计行排在所有分组行的后面,同时分组行还是按Record_Count排序。
按照你的示例数据,执行后会得到这样的结果:
Record | Record_Count
1 | 55
6 | 97
5 | 108
3 | 119
总计 | 379
方法2:使用UNION ALL合并分组结果和总计
如果你用的数据库不支持ROLLUP(比如一些老版本的数据库),可以用UNION ALL把分组统计和单独计算的总计合并起来,SQL如下:
-- 先查询分组统计结果 SELECT CAST(record AS VARCHAR) AS Record, SUM(record_count) AS Record_Count, 0 AS sort_order -- 标记分组行的排序优先级 FROM table_name WHERE <conditions> GROUP BY record UNION ALL -- 再查询总计结果 SELECT '总计' AS Record, SUM(record_count) AS Record_Count, 1 AS sort_order -- 标记总计行的排序优先级 FROM table_name WHERE <conditions> ORDER BY sort_order, Record_Count;
简化版(用CTE避免重复写WHERE条件):
如果你的WHERE条件比较复杂,重复写两次太麻烦,可以用公用表表达式(CTE)来简化:
WITH grouped_data AS ( SELECT record, SUM(record_count) AS Record_Count FROM table_name WHERE <conditions> GROUP BY record ) SELECT CAST(record AS VARCHAR) AS Record, Record_Count, 0 AS sort_order FROM grouped_data UNION ALL SELECT '总计' AS Record, SUM(Record_Count) AS Record_Count, 1 AS sort_order FROM grouped_data ORDER BY sort_order, Record_Count;
另外,我注意到你原来的SQL里GROUP BY tcpa_code应该是笔误,要改成GROUP BY record才对,不然会和你要分组的字段不匹配哦~
内容的提问来源于stack exchange,提问作者Naveen Yadav
相关产品推荐
相关产品推荐

