You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:21:00