#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 .