如何用单条SELECT语句实现多分组,同时汇总类别和子类别总价
问题原因分析
你现有SQL的分组维度是Category + Subcategory,两个SUM(Price)统计的都是同一个子分类分组下的价格总和,无法得到整个分类的总价格。
解决方案
方案1:窗口函数实现(推荐,支持MySQL 8.0+/PostgreSQL/SQL Server等主流新版本数据库)
利用窗口函数可以在不压缩原数据行的前提下,按不同维度聚合计算:
SELECT DISTINCT Category, Subcategory, SUM(Price) OVER (PARTITION BY Category) AS `Total Category Price`, SUM(Price) OVER (PARTITION BY Category, Subcategory) AS `Total Subcategory Price` FROM `table`
PARTITION BY Category指定按分类维度聚合,得到整个分类的总价格PARTITION BY Category, Subcategory指定按分类+子分类维度聚合,得到子分类总价格- 加
DISTINCT是为了对相同子分类的重复行去重,最终每个子分类只返回一行结果,完全匹配你的预期输出。
方案2:子查询关联实现(兼容不支持窗口函数的低版本数据库)
分别计算分类总价格、子分类总价格,再通过关联得到结果:
SELECT t_sub.Category, t_sub.Subcategory, t_cat.total_cat_price AS `Total Category Price`, t_sub.total_sub_price AS `Total Subcategory Price` FROM -- 计算每个子分类的总价格 ( SELECT Category, Subcategory, SUM(Price) AS total_sub_price FROM `table` GROUP BY Category, Subcategory ) AS t_sub INNER JOIN -- 计算每个分类的总价格 ( SELECT Category, SUM(Price) AS total_cat_price FROM `table` GROUP BY Category ) AS t_cat ON t_sub.Category = t_cat.Category
内容的提问来源于stack exchange,提问作者Hirasawa Yui
相关产品推荐
相关产品推荐

