如何让SQL查询对无Completed状态的EmployeeID返回0而非统计值?
解决方法
首先纠正你原查询的语法错误:WHERE子句必须放在GROUP BY之前,原写法会触发语法报错。
要实现“所有EmployeeID都显示,无Completed记录时返回0”的需求,分两种场景处理:
场景1:所有需要统计的EmployeeID都在tbl1表中(即使没有Completed状态的记录)
用CASE表达式配合COUNT函数即可,COUNT会自动忽略NULL值:
SELECT EmployeeID, COUNT(CASE WHEN Status = 'Completed' THEN 1 END) AS CompletedCount FROM tbl1 GROUP BY EmployeeID;
当某EmployeeID没有Completed记录时,CASE返回NULL,COUNT不会统计这些NULL,最终结果就是0。
场景2:有单独的员工表(比如tblEmployees)存储所有EmployeeID(tbl1可能没有部分员工的记录)
此时需要用左连接+COALESCE函数把NULL转为0:
SELECT e.EmployeeID, COALESCE(t.CompletedCount, 0) AS CompletedCount FROM tblEmployees e LEFT JOIN ( -- 先统计有Completed记录的员工数量 SELECT EmployeeID, COUNT(*) AS CompletedCount FROM tbl1 WHERE Status = 'Completed' GROUP BY EmployeeID ) t ON e.EmployeeID = t.EmployeeID;
为什么原查询不行?
原查询的WHERE Status = 'Completed'会直接过滤掉所有非Completed的记录,导致没有Completed记录的EmployeeID根本不会出现在结果集中,自然无法返回0。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

