Войти Регистрация
Data base

223. Зарплата сотрудников по месяцам из табеля

Лёгкая

employees — сотрудники, timesheet — отработанные часы по дням, hourly_rates — часовая ставка в рублях. Ставка есть не у всех: новичку её ещё не завели.

Для каждого сотрудника и каждого месяца, в котором у него есть часы, верните emp_id, full_name, month (первое число месяца) и salary_rub — часы за месяц × ставка.

Если ставки нет, сотрудник всё равно в отчёте, salary_rub — NULL. Порядок — по emp_id, затем month.

В работе: Сверка фонда оплаты почасовых сотрудников перед выплатой.

Таблицы

employees — сотрудник

КолонкаТипЧто значит
emp_idintключ
full_nametextФИО

timesheet — часы за день

КолонкаТипЧто значит
emp_idintсотрудник
work_datedateдень
hoursnumericчасы

hourly_rates — одна ставка на сотрудника

КолонкаТипЧто значит
emp_idintключ
rate_rubnumericруб. в час

Пример: данные

employees · 3 строки

emp_idfull_name
1Гусева Ольга
2Ткаченко Артём
3Бойко Нина

timesheet · 4 строки

emp_idwork_datehours
12025-10-018
12025-10-026,5
12025-11-038
22025-10-154

hourly_rates · 3 строки

emp_idrate_rub
1650
2480
3900

Ожидаемый ответ

emp_idfull_namemonthsalary_rub
1Гусева Ольга2025-10-019425
1Гусева Ольга2025-11-015200
2Ткаченко Артём2025-10-011920
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
emp_id, full_name, month, salary_rub
JOINLEFT JOINGROUP BYдатыNULL

Источник: тестовое аналитика данных (Middle) в Авито, сборник No Data No Growth. Условие пересказано своими словами.