求助:统计薪资高于平均值的员工数SQL语句报错问题
解决薪资高于平均薪资的员工统计问题
嘿,这个问题我碰到过不少次,咱们来一步步解决它~
首先得搞懂你原来的SQL为什么报错:
SELECT COUNT(workers_id) FROM flight_company.workers WHERE Salary > AVG(Salary);
问题出在WHERE子句不能直接使用聚合函数(比如AVG())。SQL的执行顺序是先处理FROM和WHERE筛选行,之后才会执行聚合计算(比如AVG、COUNT这些)。这时候WHERE执行时,AVG(Salary)还没计算出来,自然会报错。
下面给你两种靠谱的解决方案:
方案1:使用子查询先计算平均薪资
这是最通用的方法,几乎所有数据库都支持:
SELECT COUNT(workers_id) FROM flight_company.workers WHERE Salary > (SELECT AVG(Salary) FROM flight_company.workers);
原理很简单:先执行括号里的子查询,算出整个workers表的平均薪资,然后外部查询再筛选出薪资高于这个平均值的员工,最后统计他们的数量。
方案2:使用窗口函数(适用于支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),可以用这种方式:
SELECT COUNT(*) FROM ( SELECT Salary, AVG(Salary) OVER () AS avg_salary FROM flight_company.workers ) AS sub WHERE Salary > avg_salary;
这里的AVG(Salary) OVER ()会给每一行员工数据都附加一个整个表的平均薪资值,子查询生成带平均薪资的临时结果集后,外部查询再筛选并统计符合条件的员工数。
内容的提问来源于stack exchange,提问作者user13269342
相关产品推荐
相关产品推荐

