Аналитик пишет: SELECT o.user_id, SUM(o.amount) FROM orders o JOIN order_items i ON i.order_id = o.id GROUP BY o.user_id. У одного заказа несколько позиций. Что произойдёт с суммой?

AСумма будет точной — GROUP BY автоматически дедуплицирует строки перед агрегацией
BСумма будет меньше реальной — JOIN отбрасывает заказы без связанных позиций
CСумма будет точной — SUM игнорирует дублирующиеся значения при сложении
DСумма будет завышена — один заказ дублируется для каждой связанной позиции
Правильный ответ. При JOIN «один ко многим» строка заказа дублируется столько раз, сколько позиций у заказа. SUM(o.amount) посчитает сумму заказа несколько раз, завысив итог.

Разбор

Это классическая ошибка агрегации с JOIN. Если у заказа 3 позиции, JOIN порождает 3 строки с одинаковым o.amount. SUM сложит все три — итог утроится. Решения: агрегировать order_items в подзапросе до JOIN; использовать SUM(DISTINCT o.amount) с осторожностью; или применять COUNT(DISTINCT o.id) для подсчёта заказов.

Проверь себя · 1/3разбор после ответа
Нужно получить количество заказов по паре (user_id, status) из таблицы orders. Какой запрос верный?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»