← Назад к вопросам

Написать SQL-запрос для отчёта по продажам

1.6 Junior🔥 151 комментариев
#Требования и их анализ

Условие

Даны таблицы:

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 категорий по сумме продаж за последний месяц.

Требования:

  1. Вывести название категории и сумму продаж
  2. Учитывать только заказы со статусом "completed"
  3. Отсортировать по сумме продаж по убыванию
  4. Ограничить результат 5 записями

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 обеспечивает точную математику для денежных значений

Этот запрос выполняет все требования задания и может быть выполнен даже на больших объёмах данных при правильном индексировании.

Написать SQL-запрос для отчёта по продажам | PrepBro