SQL - Попытка получить сотрудников с зарплатой выше средней - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь получить среднюю зарплату для отдела, а затем использовать ее, чтобы получить любого сотрудника, который зарабатывает выше среднего.

Мой запрос:

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)

Что я делаю не так? Спасибо!

Ответы [ 3 ]

1 голос
/ 26 апреля 2020

Оконные функции, вероятно, являются лучшим решением - как в ответе @ 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
                 );

Здесь - это дБ <> скрипка.

Ключевые идеи:

  • Вам не нужно до join до departments. То, что у вас есть идея, не означает, что join необходим.
  • GROUP BY не нужен в подзапросе. Об этом заботится корреляционная оговорка.
0 голосов
/ 26 апреля 2020

Вы можете сделать что-то вроде этого, вот демо .

select  
    first_name,
    salary,
    department_id
from
(select
    department_id,
    first_name,
    salary,
    avg(salary) over () as avg_salary
from employee
) emp
where salary > avg_salary

Вывод:

+--------------------------------+
first_name  salary  department_id|
+--------------------------------+
| Ian       80000      2         |
| John      50000      3         |
+--------------------------------+
0 голосов
/ 26 апреля 2020

Начните только с зарплаты по отделу в одном предварительном запросе. Это должно быть основой для всех сотрудников после.

select
      e.*,
      JustAvgs.DptAvg
   from
      ( select 
              e.department_id,
              avg(e.salary) DptAvg
           from 
              employees as e
           group by 
              e.department_id) JustAvgs
         JOIN employees e
            on JustAvgs.Department_id = e.Department_ID
           AND e.Salary > JustAvgs.DptAvg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...