如何用SQL统计排除Result为N/A的ID出现次数并新增Count列
解决方案
方法一:使用窗口函数(推荐)
窗口函数可以直接在原表每行计算对应ID的有效记录数,无需额外关联,语法更简洁:
SELECT ID, `Group`, -- 注意Group是SQL关键字,不同数据库可能需要用[](SQL Server)或""(Oracle)包裹 Result, -- 仅统计Result不为N/A的记录,按ID分组计算次数 COUNT(CASE WHEN Result != 'N/A' THEN 1 END) OVER (PARTITION BY ID) AS Count FROM 你的表名;
原理:OVER (PARTITION BY ID) 将数据按ID拆分分组,COUNT(CASE...) 只在Result不是N/A时计数,最终每行都会带上所属ID的有效记录总数。
方法二:子查询关联
先预统计每个ID的有效次数,再关联回原表:
SELECT t.ID, t.`Group`, t.Result, cnt.Count FROM 你的表名 t -- 子查询算出每个ID排除N/A后的记录数 JOIN ( SELECT ID, COUNT(*) AS Count FROM 你的表名 WHERE Result != 'N/A' GROUP BY ID ) cnt ON t.ID = cnt.ID;
如果某些ID全是N/A,这个方法会过滤掉这些行;要是想保留所有行,把JOIN改成LEFT JOIN即可。
常见错误原因
你之前用CASE函数出错,大概率是没结合窗口函数或分组逻辑:
- 直接用
COUNT(CASE...)但没加GROUP BY ID,会把整个表当成一组统计 - 用聚合函数但没把非聚合字段放到
GROUP BY里,触发语法错误
内容的提问来源于stack exchange,提问作者rvandy
相关产品推荐
相关产品推荐

