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

Сумма оплат по заказу в отчёте втрое больше реальной: где ошибка в запросе

Вы сверяете витрину с данными сервиса:

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

По заказу с тремя позициями и одной оплатой на 1 500 рублей запрос показывает 4 500.

Что произошло?

  • Функция sum() пропускает пустые значения, из-за чего итог получается завышенным
  • Соединение с позициями размножило строки, и одна оплата просуммировалась столько раз, сколько в заказе позиций
  • Нужно заменить GROUP BY на DISTINCT: он уберёт задвоенные строки, и суммы в витрине совпадут
  • Оплаты попали в выборку несколько раз, потому что в запросе нет фильтра по статусу платежа

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

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

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

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