SQL如何同时输出分类合计值与各子分类单独统计结果
实现方案
方案1:通用UNION ALL写法(兼容所有SQL数据库)
无需依赖数据库高阶特性,所有版本的MySQL、PostgreSQL、Oracle等都可直接使用:
-- 合计行查询 SELECT 'CAT' AS categories, SUM(number_units) AS `sum` FROM 你的实际表名 WHERE categories LIKE 'CAT%' UNION ALL -- 子分类行查询 SELECT categories, SUM(number_units) AS `sum` FROM 你的实际表名 WHERE categories LIKE 'CAT%' GROUP BY categories -- 排序控制合计行展示在最顶部 ORDER BY CASE WHEN categories = 'CAT' THEN 1 ELSE 2 END, categories
注意把
你的实际表名替换为自己的表名即可,使用UNION ALL而非UNION可避免去重逻辑,查询性能更高。
方案2:高阶聚合写法(支持MySQL8.0+/PostgreSQL/Oracle等现代数据库)
仅需扫描一次表,性能比UNION方案更好:
GROUPING SETS写法
SELECT COALESCE(categories, 'CAT') AS categories, SUM(number_units) AS `sum` FROM 你的实际表名 WHERE categories LIKE 'CAT%' GROUP BY GROUPING SETS ((), (categories)) ORDER BY CASE WHEN categories = 'CAT' THEN 1 ELSE 2 END, categories
GROUPING SETS中()代表全局合计维度,(categories)代表子分类聚合维度,一次查询即可返回两种聚合结果,COALESCE用于将合计行的空分类值替换为CAT。
MySQL专属WITH ROLLUP写法
SELECT IFNULL(categories, 'CAT') AS categories, SUM(number_units) AS `sum` FROM 你的实际表名 WHERE categories LIKE 'CAT%' GROUP BY categories WITH ROLLUP ORDER BY CASE WHEN categories = 'CAT' THEN 1 ELSE 2 END, categories
内容的提问来源于stack exchange,提问作者1.618
相关产品推荐
相关产品推荐

