不使用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
相关产品推荐
相关产品推荐

