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

不使用HAVING子句,如何让SQL仅在总计≥5时显示COUNT列求和值?

解决方法:不使用HAVING实现仅显示总计≥5的聚合结果

首先得指出你原SQL的核心问题:

  • 你错误地把[ICN]加入了GROUP BY子句,这会让每个[ID]+[ICN]的组合成为独立分组,导致COUNT(CASE...)只能统计单个ICN值的满足情况,根本无法计算每个ID的总计值。
  • DISTINCT在这里完全多余,GROUP BY本身就会返回唯一的分组结果,加了它不会改变任何输出。

接下来是两种符合你需求的实现方式,都不需要用到HAVING:

方式一:仅返回总计≥5的ID及对应数值

如果你的需求是只保留那些满足ICN≥5的记录数≥5的ID,可以用子查询先计算每个ID的统计值,再在外层用WHERE过滤:

SELECT [ID], [COUNT]
FROM (
    -- 先按ID分组,计算每个ID中ICN≥5的记录数
    SELECT 
        [ID], 
        COUNT(CASE WHEN [ICN] >= 5 THEN 1 END) AS 'COUNT'
    FROM DBO.[OFD]
    WHERE [YEAR] = 2018 AND [LOCATION-ID] = '0021'
    GROUP BY [ID]
) AS ID_Stats
-- 外层过滤出总计≥5的结果
WHERE [COUNT] >= 5

方式二:显示所有ID,但仅在总计≥5时展示数值

如果需要保留所有ID,只是在总计不足5时让COUNT列显示NULL,可以在外层用CASE语句处理:

SELECT 
    [ID], 
    -- 仅当总计≥5时显示数值,否则返回NULL
    CASE WHEN [COUNT] >= 5 THEN [COUNT] ELSE NULL END AS 'COUNT'
FROM (
    SELECT 
        [ID], 
        COUNT(CASE WHEN [ICN] >= 5 THEN 1 END) AS 'COUNT'
    FROM DBO.[OFD]
    WHERE [YEAR] = 2018 AND [LOCATION-ID] = '0021'
    GROUP BY [ID]
) AS ID_Stats

补充说明

如果你的“总计”指的是ICN的求和值(而不是满足条件的记录数),只需要把子查询里的COUNT换成SUM即可:

SELECT [ID], [Total_ICN]
FROM (
    SELECT 
        [ID], 
        SUM([ICN]) AS 'Total_ICN'
    FROM DBO.[OFD]
    WHERE [YEAR] = 2018 AND [LOCATION-ID] = '0021'
    GROUP BY [ID]
) AS ID_Stats
WHERE [Total_ICN] >= 5

内容的提问来源于stack exchange,提问作者user3491260

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:44