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

如何在MySQL中按empid统计各状态的出现次数?

按empid维度统计各状态数量的MySQL实现方法

假设你的输入表名为emp_status,包含empid(员工ID)和status(状态)两个核心字段,要实现按员工ID分组,把不同状态的统计结果作为列展示,可以用条件聚合的方式写SQL,这是处理这类行转列统计的常用方法。

静态状态的实现方案(适合状态固定的场景)

如果你的状态是固定的(比如只有「已完成」「待处理」「已取消」这几种),直接写如下SQL即可:

SELECT 
    empid,
    -- 统计每个员工的已完成状态数量
    COUNT(CASE WHEN status = '已完成' THEN 1 END) AS 已完成数量,
    -- 统计待处理状态数量
    COUNT(CASE WHEN status = '待处理' THEN 1 END) AS 待处理数量,
    -- 统计已取消状态数量
    COUNT(CASE WHEN status = '已取消' THEN 1 END) AS 已取消数量
FROM emp_status
-- 按员工ID分组统计
GROUP BY empid
-- 按员工ID排序,可选
ORDER BY empid;

代码说明

  • GROUP BY empid:确保统计结果是按每个员工单独计算的
  • COUNT(CASE ...):利用CASE语句筛选出对应状态的记录,符合条件返回1,不符合返回NULL;而COUNT函数会忽略NULL值,最终得到对应状态的记录数
  • 如果还有其他状态,直接复制COUNT(CASE...)这一行,替换状态值和列名即可

动态状态的实现方案(适合状态不固定的场景)

如果状态可能随时新增,不想每次修改SQL,可以用MySQL的动态SQL生成语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'COUNT(CASE WHEN status = ''',
      status,
      ''' THEN 1 END) AS ',
      CONCAT('`', status, '_数量`')
    )
  ) INTO @sql
FROM emp_status;

SET @sql = CONCAT('SELECT empid, ', @sql, ' FROM emp_status GROUP BY empid ORDER BY empid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这段代码会自动读取表中所有不同的状态值,生成对应的统计列,无需手动修改SQL。

内容的提问来源于stack exchange,提问作者www.friend0.in

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:35:01