Oracle中使用左外连接统计员工各任务分配次数的问题
实现员工任务分配次数统计的SQL方案
没问题,我来帮你搞定这个统计需求!要得到每位员工在三个任务角色(generator、analyzer、tester)中的分配次数,我们可以通过左外连接+分组统计的方式实现,确保所有员工都能被展示,哪怕某个任务没有分配记录也会显示0次。
核心思路
- 分别统计每个任务角色中各员工的出现次数;
- 将这三个统计结果与
employee表做左外连接,保证所有员工都被包含; - 用
COALESCE函数把空值(无分配记录的情况)转换为0,最终得到目标格式。
完整SQL代码
SELECT e.empid, e.empname, COALESCE(g.generator_count, 0) AS generator, COALESCE(a.analyzer_count, 0) AS analyzer, COALESCE(t.tester_count, 0) AS tester FROM employee e LEFT JOIN ( -- 统计generator角色的分配次数 SELECT generator, COUNT(*) AS generator_count FROM allocation GROUP BY generator ) g ON e.empid = g.generator LEFT JOIN ( -- 统计analyzer角色的分配次数 SELECT analyzer, COUNT(*) AS analyzer_count FROM allocation GROUP BY analyzer ) a ON e.empid = a.analyzer LEFT JOIN ( -- 统计tester角色的分配次数 SELECT tester, COUNT(*) AS tester_count FROM allocation GROUP BY tester ) t ON e.empid = t.tester ORDER BY e.empid;
结果验证
执行这段SQL后,会完美匹配你需要的结果:
| empid | empname | generator | analyzer | tester |
|---|---|---|---|---|
| 101 | Tom | 1 | 1 | 1 |
| 102 | Jerry | 1 | 2 | 0 |
| 103 | Jack | 1 | 0 | 1 |
| 104 | Tim | 0 | 0 | 1 |
这个方案适用于绝大多数主流SQL数据库(MySQL、PostgreSQL、SQL Server等),COALESCE是标准SQL函数,能很好地兼容不同数据库环境。
内容的提问来源于stack exchange,提问作者Siva R
相关产品推荐
相关产品推荐

