如何在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
相关产品推荐
相关产品推荐

