如何为SQL查询结果添加按code聚合的汇总行?
如何在SQL查询中添加Code级别的汇总行
当然可以实现这个需求!针对你已经完成的按category和code汇总的查询,我们可以通过两种常用方式添加同一code下所有category的汇总行(category字段显示为NULL):
方法1:使用ROLLUP自动生成汇总行
ROLLUP是SQL内置的分组汇总语法,能在现有分组结果的基础上,自动生成更高层级的汇总行,非常适合你的场景:
SELECT -- 判断是否为汇总行,是则返回NULL,否则保留原category值 CASE WHEN GROUPING(category) = 1 THEN NULL ELSE category END AS category, code, SUM(items_quantity) AS total_items_quantity FROM ( SELECT year_field, month_field, code, category, SUM((CAST(items as INT)) / 10) AS items_quantity FROM test WHERE category IN ('C', 'P') GROUP BY year_field, month_field, code, category ) a WHERE year_field = '2019' AND month_field = '01' AND code IN ('O', 'M') -- 按code分组,同时对category生成汇总行 GROUP BY code, ROLLUP(category) -- 排序让结果更清晰:先按code,再按category(汇总行排在对应code的最后) ORDER BY code, category;
关键细节说明:
GROUPING(category):专门用于识别ROLLUP生成的汇总行,返回1表示当前行是汇总行,此时我们把category设为NULL;返回0则是原始分组行,保留原category值。- 因为你的
year_field和month_field是字符串类型,所以WHERE条件里用'2019'和'01'匹配更规范,避免隐式转换的潜在问题。
方法2:使用UNION ALL合并原始结果与汇总结果
如果你的SQL环境不支持ROLLUP(比如部分轻量型数据库),可以用UNION ALL手动合并两类结果:
-- 第一部分:原有的按category+code分组的结果 SELECT category, code, SUM(items_quantity) AS total_items_quantity FROM ( SELECT year_field, month_field, code, category, SUM((CAST(items as INT)) / 10) AS items_quantity FROM test WHERE category IN ('C', 'P') GROUP BY year_field, month_field, code, category ) a WHERE year_field = '2019' AND month_field = '01' AND code IN ('O', 'M') GROUP BY code, category -- 合并code级别的汇总结果 UNION ALL -- 第二部分:按code单独汇总,category设为NULL SELECT NULL AS category, code, SUM(items_quantity) AS total_items_quantity FROM ( SELECT year_field, month_field, code, SUM((CAST(items as INT)) / 10) AS items_quantity FROM test WHERE category IN ('C', 'P') GROUP BY year_field, month_field, code ) a WHERE year_field = '2019' AND month_field = '01' AND code IN ('O', 'M') GROUP BY code -- 统一排序 ORDER BY code, category;
关键细节说明:
- 第一部分完全保留你原有的查询逻辑,确保得到按
category和code的明细汇总。 - 第二部分去掉
category分组,专门统计每个code下所有category的总和,并将category设为NULL。 - 使用
UNION ALL而非UNION,避免系统自动去重,保证结果的完整性。
示例结果验证
用你提供的测试数据执行上述任一查询,都会得到如下结构的结果:
| category | code | total_items_quantity |
|---|---|---|
| C | M | 110 |
| P | M | 41 |
| NULL | M | 151 |
| C | O | 103 |
| P | O | 5 |
| NULL | O | 108 |
既保留了原有的分组明细,又添加了你需要的code级汇总行。
内容的提问来源于stack exchange,提问作者tube-builder
相关产品推荐
相关产品推荐

