67. Выбрать сотрудников с начислениями и найти сотрудников с суммой выплат больше 15
Условие задачи:
Даны две таблицы:
Persons— список сотрудников;Payments— зарплатные начисления сотрудников.
Связь между таблицами — один ко многим: у одного сотрудника может быть несколько начислений или не быть ни одного.
Пример данных:
Persons
id | name
---+------
1 | Petya
2 | Vasya
3 | Kolya
Payments
id | person_id | value
---+-----------+------
1 | 1 | 10
2 | 1 | 20
3 | 3 | 15
Необходимо:
Вывести всех сотрудников вместе с их зарплатными начислениями.
Вывести сотрудников, у которых общая сумма начислений больше
15.
Спойлеры к решению
Подсказки
Persons и используй LEFT JOIN, чтобы не потерять сотрудников без начислений.💡 Во второй части сгруппируй начисления по сотруднику.
💡 Для подсчёта общей суммы используй
SUM().💡 Условие на результат агрегирования задаётся через
HAVING.Решение
- Все сотрудники вместе с их начислениями:
SELECT
p.id,
p.name,
pay.id AS payment_id,
pay.value
FROM Persons p
LEFT JOIN Payments pay
ON pay.person_id = p.id
ORDER BY p.id, pay.id;
Используется LEFT JOIN, поэтому в результат попадёт даже сотрудник, у которого пока нет ни одного начисления. Для такого сотрудника поля из Payments будут NULL.
Для приведённых данных результат будет выглядеть так:
id | name | payment_id | value
---+-------+------------+------
1 | Petya | 1 | 10
1 | Petya | 2 | 20
2 | Vasya | NULL | NULL
3 | Kolya | 3 | 15
- Сотрудники, у которых сумма начислений больше
15:
SELECT
p.id,
p.name,
SUM(pay.value) AS total_payments
FROM Persons p
JOIN Payments pay
ON pay.person_id = p.id
GROUP BY
p.id,
p.name
HAVING SUM(pay.value) > 15;
Сначала начисления группируются по сотруднику, после чего:
SUM(pay.value)
вычисляет их общую сумму, а:
HAVING SUM(pay.value) > 15
оставляет только сотрудников, у которых она строго больше 15.
Для приведённых данных в результат попадёт только:
id | name | total_payments
---+-------+---------------
1 | Petya | 30
Kolya не попадает в результат, потому что его сумма начислений равна 15, а по условию требуется значение строго больше 15.