Написать SQL-запрос для отчёта по продажам
Условие
Даны таблицы:
orders (id, user_id, created_at, status) order_items (id, order_id, product_id, quantity, price) products (id, name, category_id) categories (id, name)
Задача: Напишите SQL-запрос, который выведет топ-5 категорий по сумме продаж за последний месяц.
Требования:
- Вывести название категории и сумму продаж
- Учитывать только заказы со статусом "completed"
- Отсортировать по сумме продаж по убыванию
- Ограничить результат 5 записями
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
SQL-запрос для отчёта по продажам
Основное решение
SELECT
c.id,
c.name AS category_name,
ROUND(SUM(oi.quantity * oi.price)::numeric, 2) AS total_sales
FROM categories c
INNER JOIN products p ON c.id = p.category_id
INNER JOIN order_items oi ON p.id = oi.product_id
INNER JOIN orders o ON oi.order_id = o.id
WHERE o.status = 'completed'
AND o.created_at >= NOW() - INTERVAL '1 month'
GROUP BY c.id, c.name
ORDER BY total_sales DESC
LIMIT 5;
Анализ запроса
Структура соединений: Запрос связывает категории с продуктами, продукты с элементами заказов, элементы с самими заказами. Это позволяет получить полную информацию о каждой покупке.
Фильтрация данных:
- o.status = 'completed' отбирает только завершённые заказы
- o.created_at >= NOW() - INTERVAL '1 month' ограничивает данные последним месяцем
Агрегация:
- SUM(oi.quantity * oi.price) вычисляет общую сумму для каждой категории
- GROUP BY группирует результаты по категориям
- ROUND(..., 2) округляет до 2 десятичных знаков
Сортировка и ограничение:
- ORDER BY total_sales DESC сортирует по убыванию продаж
- LIMIT 5 возвращает только топ-5
Ключевые моменты
Оптимизация: Используйте индексы на полях orders(status, created_at), order_items(order_id, product_id), products(category_id)
INNER JOIN: Гарантирует, что включены только категории с хотя бы одной продажей
Типизация: ::numeric обеспечивает точную математику для денежных значений
Этот запрос выполняет все требования задания и может быть выполнен даже на больших объёмах данных при правильном индексировании.