sql - SQL - 试图让员工的工资高于平均部门工资
问题描述
我试图获得一个部门的平均工资,然后用它来获得任何高于该平均水平的员工。
我的查询是:
select e.first_name, e.salary, e.department_id from
employees as e
inner join departments as d
on d.id = e.department_id
where salary > (select avg(e.salary)
from employees as e
where e.department_id = d.id
group by e.department_id);
但它只返回一个结果“Ian”。
first_name | salary | department_id
------------+--------+---------------
Ian | 80000 | 2
(1 row)
avg
--------------------
35000.000000000000
(1 row)
id | first_name | last_name | salary | department_id
----+------------+-----------+--------+---------------
1 | John | Smith | 20000 | 1
2 | Ava | Muffinson | 10000 | 5
3 | Cailin | Ninson | 30000 | 2
4 | Mike | Peterson | 20000 | 2
5 | Ian | Peterson | 80000 | 2
6 | John | Mills | 50000 | 3
(6 rows)
id | name
----+-------------
1 | Reporting
2 | Engineering
3 | Marketing
4 | Biz Dev
5 | Silly Walks
(5 rows)
我究竟做错了什么?谢谢!
解决方案
窗口函数可能是最好的解决方案——就像@zealous 的回答一样。但是,子查询也很合理。这个想法是:
select e.first_name, e.salary, e.department_id
from employees as e
where e.salary > (select avg(e2.salary)
from employees e2
where e2.department_id = e.department_id
);
这是一个 db<>fiddle。
关键思想:
- 你不需要
join
。departments
仅仅因为你有这个想法并不意味着它join
是必要的。 - 在
GROUP BY
子查询中是不必要的。相关性子句负责这一点。
推荐阅读
- sql - 单个 SQL 查询上的几个 COUNTS:寻找效率
- angular - Dexie db 加班速度变慢
- typescript - Typescript WebDriver/Selenium 和 PDF 文件
- python - 我想以一定的概率翻转数组中的数字
- javascript - Javascript将字节字符串转换为图像
- python - 我如何在 Python 中重复这些 pyautogui.click() 函数?
- javascript - 如何通过使用 jQuery 单击按钮来获得下一个问题
- wso2 - 在 WSO2 APIM 3.1.0 中执行在 MySQL 数据库上创建表的数据库脚本失败
- azure - 我们需要更改 Azure 中的 UPN。我们需要在 Snowflake 中/使用 Snowflake 做什么才能继续登录吗?
- sql - 选择列在哪里连续包含三个大写字母