Вы соединили таблицы users и orders (один ко многим) и посчитали AVG(order_amount), интерпретируя это как «средняя выручка на пользователя». Почему это неверно и как правильно?

AНеверно, потому что AVG() считает только по целым числам и пропускает дробные суммы; правильно использовать SUM() и затем поделить на пользователей
BВерно: AVG(order_amount) всегда равно средней выручке на пользователя при условии, что у каждого пользователя есть хотя бы один заказ в выборке
CНеверно, потому что INNER JOIN удаляет пользователей без заказов; нужно LEFT JOIN и тогда средняя выручка на пользователя посчитается корректно из коробки
DНеверно, потому что AVG() считает среднее по строкам заказов, а не по пользователям; нужно сначала агрегировать выручку до user_id через SUM(), а затем взять AVG() по пользователям
Правильный ответ. При связи один ко многим AVG() по полю заказа даёт среднее по заказам, а не по пользователям, из-за разной мощности связи между таблицами.

Разбор

Пользователь с десятью заказами будет весить в среднем в десять раз больше пользователя с одним заказом, поэтому получается среднее по строкам заказов. Если цель — метрика на пользователя, сначала посчитайте выручку на user_id через SUM() по заказам, а уже потом усредняйте. Это базовое правило выбора уровня агрегации перед JOIN и после него. Версии с LEFT JOIN или ограничением по типам данных задачу не решают, так как смещение возникает из-за разной мощности связи.

Проверь себя · 1/3разбор после ответа
Вы соединяете таблицы пользователей и заказов по user_id, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?
Открыть Карьерник в Telegram

Ещё вопросы по теме «JOIN и кардинальность»