Как мне выбрать работников, которые зарабатывают больше денег, чем их руководитель в соответствующем отделе в sql?

#mysql #sql #select

#mysql #sql #выберите

Вопрос:

У меня есть следующая таблица:

  --------------------------------------------------- 
| ID EMPNAME DEPARTMENT ROLE       SALARY   EXTRA   |
| 1  brian   10         sales      2000     500     |
| 2  jenny   10         leader     3000     100     |
| 3  sam     20         office     1500     500     |
| 4  cory    20         leader     1200     300     |
| 5  tifa    30         custservice4000     1000    |
| 6  sammy   30         leader     3000     200     |
| 7 anne     30         sales      4500     200     |
 --------------------------------------------------- 
  

Моя задача — найти людей, которые зарабатывают больше, чем их руководитель (зарплата дополнительные) в каждой роли. Затем я id отобразю , empname , и department этого человека. Мне нужен способ сравнить заработную плату дополнительные (дополнительные — это бонусы, которые они получают каждый год) между ролями в каждом отделе. Я пробовал что-то вроде следующего кода, но это не сработало, он неправильно вычислял наибольшее значение по сравнению с лидером.

 SELECT a.id, a.empname, a.department
FROM MyTable a
JOIN (SELECT MAX(Salary   extra) As Highest, Dept FROM MyTable GROUP BY Dept) b
ON a.Dept = b.Dept amp;amp; (a.Salary   a.extra) = b.Highest
  

Как мне отобразить первые три столбца по критериям, по которым они зарабатывают больше, чем их руководитель в их конкретном отделе? Приведенная выше таблица должна выводить следующее:

  ----------------------- 
| ID EMPNAME DEPARTMENT |
| 3  sam     20         |
| 5  tifa    30         |
| 7  anne    30         |
 ----------------------- 
  

Это делается в sql developer.

РЕДАКТИРОВАТЬ: Забыл добавить, что некоторые значения EXTRA могут быть NULL .

Ответ №1:

Хммм … я думаю о коррелированном подзапросе:

 select t.*
from mytable t
where (t.salary   t.extra) > (select t2.salary   t2.extra
                              from mytable t2
                              where t2.department = t.department and
                                    t2.role = 'leader'
                             );
  

Комментарии:

1. Когда я запускаю это, я просто получаю пустую таблицу. Я забыл упомянуть, но некоторые из зарплат или дополнительных значений могут быть нулевыми. поэтому это не работает? Спасибо.

2. @BlackShard . , , (1) В этом вопросе нет пропущенных значений. (2) Эти строки будут отфильтрованы. Если значения отсутствуют, то неясно, как проводить сравнение.

Ответ №2:

Здесь можно использовать подход объединения:

 SELECT mt1.id, mt1.empname, mt1.department
FROM MyTable mt1
INNER JOIN
(
    SELECT department, salary   COALESCE(extra, 0) AS total
    FROM MyTable
    WHERE ROLE = 'leader'
) mt2
    ON mt1.department = mt2.department
WHERE
    mt1.salary   COALESCE(mt1.extra, 0) > mt2.total;
  

Комментарии:

1. Я забыл добавить, что некоторые значения extra могут быть нулевыми, если они не получат бонус, повлияет ли это на результат? Когда я запустил ваш запрос, я получил пустую таблицу.

2. @BlackShard Конечно, просто оберните extra COALESCE и присвоите ему значение по умолчанию, равное нулю, в случае null .