部门半年平均薪资≤50000的员工数量统计SQL查询求助
正确SQL语句写法及问题解析
原语句的错误点
- 语法顺序错误:
WHERE子句必须放在GROUP BY之前,不能后置。 - 聚合条件过滤错误:对聚合函数(如
AVG())的过滤不能用WHERE,必须使用HAVING子句——WHERE用于过滤单条行数据,HAVING用于过滤分组后的聚合结果。
需求对应的两种场景写法
场景1:统计每个符合条件部门的员工数量
如果要得到每个半年平均薪资≤50000的部门各自的员工数,语句如下:
SELECT DEPARTMENT_ID, COUNT(EMPLOYEE_ID) AS Total FROM HR.EMPLOYEES GROUP BY DEPARTMENT_ID HAVING AVG(SALARY * 6) <= 50000;
也可以简化计算(AVG(SALARY*6)=6*AVG(SALARY)),提升查询效率:
SELECT DEPARTMENT_ID, COUNT(EMPLOYEE_ID) AS Total FROM HR.EMPLOYEES GROUP BY DEPARTMENT_ID HAVING AVG(SALARY) <= 50000/6;
场景2:统计所有符合条件部门的员工总数
如果要得到所有属于半年平均薪资≤50000部门的员工总数量,可以用子查询先筛选出符合条件的部门ID,再统计对应员工:
SELECT COUNT(EMPLOYEE_ID) AS Total FROM HR.EMPLOYEES WHERE DEPARTMENT_ID IN ( SELECT DEPARTMENT_ID FROM HR.EMPLOYEES GROUP BY DEPARTMENT_ID HAVING AVG(SALARY * 6) <= 50000 );
内容的提问来源于stack exchange,提问作者Mr.Marshal
相关产品推荐
相关产品推荐

