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

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

关键说明

  1. 用SUM替代COUNT:当job_status = 状态ID成立时返回1,不成立返回0,SUM会自动累加符合条件的行数,得到对应状态的任务量。
  2. 调整JOIN顺序与条件:
    • 用users LEFT JOIN jobs确保2023年没有任务的员工也会出现在结果里,不会被过滤。
    • 将job_dateCompleted LIKE '2023%'移到JOIN的ON条件中,避免WHERE子句过滤掉无任务的员工(否则LEFT JOIN会退化为INNER JOIN)。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:10:20