1.Необходимо написать запрос, чтобы выбрать всех сотрудников вместе с их зарплатными начислениями. 2.Выбрать сотрудников у которых сумма начислений > 15.

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

Необходимо:

  1. Вывести всех сотрудников вместе с их зарплатными начислениями.

  2. Вывести сотрудников, у которых общая сумма начислений больше 15.


Спойлеры к решению

Подсказки
💡 В первой части начинай запрос с Persons и используй LEFT JOIN, чтобы не потерять сотрудников без начислений.
💡 Во второй части сгруппируй начисления по сотруднику.
💡 Для подсчёта общей суммы используй SUM().
💡 Условие на результат агрегирования задаётся через HAVING.

Решение
  1. Все сотрудники вместе с их начислениями:
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
  1. Сотрудники, у которых сумма начислений больше 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.