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

AПоявилась duplication: каждый order_total повторился по числу строк в order_items, и AVG() стал взвешен по количеству позиций
BAVG() всегда игнорирует строки после JOIN
CПотому что one-to-one cardinality делает среднее выше
DПотому что distinct автоматически удаляет большие чеки
Правильный ответ. После one-to-many JOIN AVG() по полю заказа становится взвешенным из-за duplication строк.

Разбор

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

Проверь себя · 1/3разбор после ответа
Для одного order_id в order_items есть 3 строки, а в payments есть 2 строки. Вы соединили всё в одну таблицу по order_id без предварительной агрегации. Сколько строк получится для этого заказа и почему?
Открыть Карьерник в Telegram

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