使用子查询关联两张表:获取Tech1部门工单量最多的员工
解决Tech1部门工单量最多员工的查询问题
我看了你的SQL语句,问题主要出在这几个地方:
- 子查询里写错了表名,你写的
tbl_ambilmk应该是performance吧? - 部门过滤的条件放错位置了,
departement应该属于员工表employee的字段(通常部门信息会存在员工表中),你放到绩效表的子查询里,根本没过滤出Tech1部门的员工 - 原查询用了
LEFT JOIN,会带出没有绩效记录的员工(Ticket为NULL),这不符合你要找有工单量员工的需求
下面给你两种可行的解决方案:
方案一:先获取Tech1部门的最大工单量,再匹配员工
这种写法逻辑直观,先算出Tech1部门所有员工的最大工单数,再找出对应员工:
SELECT e.Emp_name, p.Ticket FROM employee e JOIN performance p ON e.id = p.id WHERE e.departement = 'Tech1' -- 先过滤Tech1部门的员工 AND p.Ticket = ( SELECT MAX(p2.Ticket) FROM employee e2 JOIN performance p2 ON e2.id = p2.id WHERE e2.departement = 'Tech1' -- 子查询里也限定Tech1部门 );
方案二:用窗口函数处理并列最大值的情况
如果存在多个员工工单量相同且都是最大值的情况,这个方法能一次性把所有符合条件的员工都查出来,比方案一更灵活:
SELECT Emp_name, Ticket FROM ( SELECT e.Emp_name, p.Ticket, RANK() OVER (PARTITION BY e.departement ORDER BY p.Ticket DESC) AS rank_num FROM employee e JOIN performance p ON e.id = p.id WHERE e.departement = 'Tech1' ) AS ranked_employees WHERE rank_num = 1;
补充说明
- 我把
LEFT JOIN改成了JOIN,因为你要找有工单量的员工,LEFT JOIN会包含没有绩效记录的员工,这不是你需要的结果 - 如果你的部门字段确实在绩效表
performance里,那把上面语句里的e.departement改成p.departement即可
内容的提问来源于stack exchange,提问作者Betran Gustama
相关产品推荐
相关产品推荐

