💰 SQL Gym Pro #6 - Разбор

Приветствую всех, кто попробовал свои силы в задаче! 💡Давайте разберём решение)

Логика решения:

🔹Объединяем табель и ставки: Нам нужны и часы, и цена за час. Соединяем Employee_timesheet (факт) с Employee_hourly_rate (ставка) по empid.

🔹Вычисляем заработок за каждую строку (день): умножаем num_of_hours на hourly_rate.

🔹Приводим даты к формату "Месяц-Год": Это ключевой шаг для группировки.

🔹Агрегируем данные: группируем по сотруднику и месяцу, суммируем часы и заработок.

🔹Добавляем ФИО: присоединяем таблицу Employee, чтобы получить красивые имена в финальной выгрузке.

Решение: SELECT e.empid, e.empname, TO_CHAR(t.date, 'YYYY-MM') AS month_year, -- Форматируем дату SUM(t.num_of_hours) AS total_hours, SUM(t.num_of_hours * r.hourly_rate) AS total_salary FROM Employee_timesheet t JOIN Employee_hourly_rate r ON t.empid = r.empid JOIN Employee e ON t.empid = e.empid GROUP BY e.empid, e.empname, TO_CHAR(t.date, 'YYYY-MM') ORDER BY e.empid, month_year;

Альтернативный, более производительный вариант (CTE): Часто на собеседовании просят подумать об оптимизации. Сначала можно агрегировать данные в табеле, а потом делать JOIN.

WITH monthly_totals AS ( SELECT empid, DATE_TRUNC('month', date) AS month, -- Приводим к началу месяца SUM(num_of_hours) AS total_hours FROM Employee_timesheet GROUP BY empid, DATE_TRUNC('month', date) ) SELECT e.empid, e.empname, TO_CHAR(m.month, 'YYYY-MM') AS month_year, m.total_hours, (m.total_hours * r.hourly_rate) AS total_salary -- Умножаем уже агрегированные часы FROM monthly_totals m JOIN Employee_hourly_rate r ON m.empid = r.empid JOIN Employee e ON m.empid = e.empid ORDER BY e.empid, m.month;

Вот такая вот задачка на базовый SQL, который используется в 90% рабочих задач аналитика)