PHP+SQL:如何按员工ID统计各任务状态的总数?
员工任务状态统计的正确SQL实现
你的问题出在使用COUNT函数统计状态任务量上——COUNT会统计所有非NULL的结果,哪怕表达式返回0(比如job_status = 12不满足时),它依然会把这一行算进去,所以每个状态列的数值都会等于总任务数。
修正后的SQL方案
用SUM替代COUNT来统计各状态任务量,同时调整关联逻辑确保包含无任务的员工:
SELECT u.user_fullName, COALESCE(COUNT(j.job_id), 0) AS Total, COALESCE(SUM(j.job_status = 12), 0) AS Complete, COALESCE(SUM(j.job_status = 1), 0) AS Scheduled, COALESCE(SUM(j.job_status = 3), 0) AS 'In Progress', COALESCE(SUM(j.job_status = 4), 0) AS 'Quote Required' FROM users u LEFT JOIN jobs j ON u.user_id = j.job_tech AND j.job_dateCompleted LIKE '2023%' GROUP BY u.user_fullName
关键说明
- 用SUM替代COUNT:当
job_status = 状态ID成立时返回1,不成立返回0,SUM会自动累加符合条件的行数,得到对应状态的任务量。 - 调整JOIN顺序与条件:
- 用
users LEFT JOIN jobs确保2023年没有任务的员工也会出现在结果里,不会被过滤。 - 将
job_dateCompleted LIKE '2023%'移到JOIN的ON条件中,避免WHERE子句过滤掉无任务的员工(否则LEFT JOIN会退化为INNER JOIN)。
- 用
- COALESCE处理NULL:当员工没有对应状态的任务时,SUM会返回NULL,COALESCE把它转为
0,结果更直观。
如果需要兼容更多数据库(比如不支持布尔值直接求和的),可以用CASE WHEN写法:
SELECT u.user_fullName, COALESCE(COUNT(j.job_id), 0) AS Total, COALESCE(SUM(CASE WHEN j.job_status = 12 THEN 1 ELSE 0 END), 0) AS Complete, COALESCE(SUM(CASE WHEN j.job_status = 1 THEN 1 ELSE 0 END), 0) AS Scheduled, COALESCE(SUM(CASE WHEN j.job_status = 3 THEN 1 ELSE 0 END), 0) AS 'In Progress', COALESCE(SUM(CASE WHEN j.job_status = 4 THEN 1 ELSE 0 END), 0) AS 'Quote Required' FROM users u LEFT JOIN jobs j ON u.user_id = j.job_tech AND j.job_dateCompleted LIKE '2023%' GROUP BY u.user_fullName
内容的提问来源于stack exchange,提问作者GhostWolf
相关产品推荐
相关产品推荐

