首页 > 解决方案 > 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)

我究竟做错了什么?谢谢!

标签: sqlpostgresql

解决方案


窗口函数可能是最好的解决方案——就像@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。

关键思想:

  • 你不需要joindepartments仅仅因为你有这个想法并不意味着它join是必要的。
  • GROUP BY子查询中是不必要的。相关性子句负责这一点。

推荐阅读