SQL Server中查询高于部门平均薪资员工时第二条SQL无返回的原因
问题解答
第二种SQL无返回结果的原因
你第二种写法的GROUP BY子句指定了按empid、deptid、salary三个字段分组,由于empid是员工唯一标识,每个分组实际上仅对应单条员工记录。此时分组聚合计算得到的avg(salary),就是当前分组内唯一一条记录的salary值本身。
因此Having salary > avg(salary)等价于判断「薪资大于自身薪资」,这个条件永远不成立,自然不会返回任何结果。
补充说明:第一种写法的逻辑错误
你提到第一种写法可以正确返回结果,实际上该写法不符合你的需求:你需要筛选薪资高于所属部门平均薪资的员工,但第一种写法的子查询计算的是全表所有员工的平均薪资,最终返回的是薪资高于全公司平均的员工,和预期目标不符。
符合需求的正确写法
写法1:窗口函数实现(SQL Server 2008及以上版本支持,性能更优)
SELECT empid, deptid, salary FROM ( SELECT empid, deptid, salary, AVG(salary) OVER(PARTITION BY deptid) AS dept_avg_salary FROM employee ) t WHERE salary > dept_avg_salary
写法2:关联子查询实现
SELECT e1.empid, e1.deptid, e1.salary FROM employee e1 WHERE e1.salary > ( SELECT AVG(salary) FROM employee e2 WHERE e2.deptid = e1.deptid )
内容的提问来源于stack exchange,提问作者SASHI PANDA
相关产品推荐
相关产品推荐

