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