Аналитик пишет: 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 сам по себе дедуплицирует строки заказов перед вычислением агрегата SUMBСумма меньше реальной:
JOIN отбрасывает заказы, у которых нет связанных строк в order_itemsCСумма завышена: одна строка заказа дублируется по числу позиций и складывается несколько раз подряд
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. Какой запрос верный?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →