Аналитик пишет: 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 сам по себе дедуплицирует строки заказов перед вычислением агрегата SUM
BСумма меньше реальной: JOIN отбрасывает заказы, у которых нет связанных строк в order_items
CСумма завышена: одна строка заказа дублируется по числу позиций и складывается несколько раз подряд
DСумма точная: SUM пропускает повторяющиеся значения внутри одной группы при сложении автоматически
Правильный ответ. При JOIN «один ко многим» строка заказа дублируется по числу позиций, и SUM(o.amount) завышает итог.

Разбор

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

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

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