Вы хотели посчитать средний чек по заказам как AVG(order_total). Но перед этим соединили orders с order_items по order_id (связь один-ко-многим). Почему AVG() может измениться по сравнению с расчётом на таблице orders?

AПосле соединения AVG() пересчитывается по новой формуле и игнорирует строки, у которых order_total совпадает с уже учтёнными заказами
BПосле соединения связь становится один-к-одному, поэтому каждый order_total учитывается ровно один раз и среднее всегда оказывается выше прежнего
CПосле соединения каждый order_total повторился по числу строк в order_items, и AVG() стал взвешен по числу позиций в заказе
DПосле соединения DISTINCT автоматически убирает крупные order_total и оставляет только типичные суммы, поэтому среднее заметно меняется
Правильный ответ. После соединения один-ко-многим AVG() по полю заказа становится взвешенным из-за дублирования строк.

Разбор

В исходной таблице orders один заказ равен одной строке, поэтому AVG(order_total) — простой средний чек по заказам. После соединения с order_items каждый заказ повторяется столько раз, сколько у него позиций, и влияет на среднее несколько раз. Чтобы избежать искажения, считайте AVG() на уровне заказа или предварительно агрегируйте order_items до order_id перед соединением.

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

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