Вступить в клуб →
средняявопросSQL и оптимизация запросов

Выручка в витрине выросла в разы после присоединения позиций заказа

В витрину продаж добавили присоединение таблицы позиций, чтобы потом вытащить категории товаров. Сумма выручки за месяц сразу выросла в несколько раз по сравнению с источником.

SELECT o.order_id,
       sum(o.amount) AS amount
FROM dds.orders o
JOIN dds.order_items i ON i.order_id = o.order_id
GROUP BY o.order_id;

В чём причина расхождения?

  • Соединение один-ко-многим размножает строку заказа по числу его позиций, и o.amount суммируется столько раз, сколько позиций в заказе.
  • В order_items есть строки-сироты без соответствующего заказа, и при соединении они добавляют в результат суммы по несуществующим заказам.
  • GROUP BY по order_id недостаточно: без client_id в группировке заказы разных клиентов с совпадающими номерами схлопываются в одну группу и суммы складываются.
  • sum() в PostgreSQL приводит numeric к типу большей разрядности и округляет промежуточные значения вверх, отчего итог заметно растёт на больших объёмах.

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела