如何使用GROUP BY GROUPING SETS与HAVING获取过滤后分组的正确合计行
问题根因
你当前的写法中,GROUPING SETS定义的全局分组(空括号()对应的分组)是基于全表原始数据完成聚合计算的,HAVING子句仅负责筛选最终要返回的分组行,不会修改聚合计算的数据源,因此全局分组行的统计值始终是全表总条数1000,不会随其他分组的过滤结果动态调整。
解决方案
先筛选出符合条件的分类维度聚合结果,再单独计算这些结果的总和即可,推荐用CTE+UNION ALL的写法,兼容性强逻辑清晰:
WITH category_agg AS ( -- 先得到所有分类维度的聚合结果,过滤出数量在40-60之间的分组 SELECT product_category_name a, COUNT(product_id) b FROM sys.odeds_2_20210811095253 GROUP BY product_category_name HAVING COUNT(product_id) BETWEEN 40 AND 60 ) -- 拼接符合条件的分类行和总和行 SELECT a, b FROM category_agg UNION ALL SELECT NULL AS a, SUM(b) AS b FROM category_agg
执行后返回结果就是你期望的:
a b --------------- Grãos 53 Higiene 57 <null> 110
如果你的SQL引擎不支持CTE,也可以把子查询直接写在FROM里:
SELECT a, b FROM ( SELECT product_category_name a, COUNT(product_id) b FROM sys.odeds_2_20210811095253 GROUP BY product_category_name HAVING COUNT(product_id) BETWEEN 40 AND 60 ) t UNION ALL SELECT NULL AS a, SUM(b) AS b FROM ( SELECT COUNT(product_id) b FROM sys.odeds_2_20210811095253 GROUP BY product_category_name HAVING COUNT(product_id) BETWEEN 40 AND 60 ) t
内容的提问来源于stack exchange,提问作者Alexandre
相关产品推荐
相关产品推荐

