Агрегаты и CASE
SQL агрегаты, GROUP BY и CASE¶
Этот блок учит «считать» и «группировать» данные: сколько заказов, сколько потратил пользователь и как писать условия прямо в SQL.
Агрегатные функции¶
Самые популярные:
COUNT()— количествоSUM()— суммаAVG()— среднееMIN()/MAX()— минимум/максимум
Пример: сколько заказов всего?¶
Пример: сколько заказов по статусам?¶
GROUP BY: сжать строки в группы¶
Если вы написали агрегат + обычные колонки, почти всегда нужен GROUP BY.
✅ корректно:
❌ некорректно (непонятно, какую created_at брать):
HAVING: фильтр по группам¶
WHERE фильтрует строки до группировки, а HAVING — после.
Покажем пользователей, у кого 2+ заказа:
Считаем суммы заказов¶
Сумма по каждому заказу:
SQL
SELECT
o.id AS order_id,
SUM(oi.qty * oi.price) AS order_total
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
GROUP BY o.id
ORDER BY o.id;
Сумма покупок по пользователю:
SQL
SELECT
u.id,
u.name,
SUM(oi.qty * oi.price) AS total_spent
FROM users u
JOIN orders o ON o.user_id = u.id
JOIN order_items oi ON oi.order_id = o.id
GROUP BY u.id, u.name
ORDER BY total_spent DESC;
CASE: если..., то...¶
CASE — это как if/else в SQL.
SQL
SELECT
id,
status,
CASE
WHEN status = 'paid' THEN 'Оплачен'
WHEN status = 'new' THEN 'Новый'
WHEN status = 'canceled' THEN 'Отменен'
ELSE 'Неизвестно'
END AS status_label
FROM orders
ORDER BY id;
GROUP BY vs оконные функции¶
GROUP BY уменьшает количество строк, оконные функции сохраняют строки и добавляют вычисления.