В payments(order_id, amount, status) для одного order_id может быть несколько попыток оплаты (one-to-many), например повторные списания или ошибки. Вы хотите посчитать выручку по заказам из orders. Что наиболее безопасно сделать перед соединением, чтобы SUM() не завысилась из-за duplication?

AСоединить как есть и потом применить distinct ко всем строкам
BСначала pre-aggregate payments до одной строки на order_id, затем соединить с orders
CСоединить payments с orders по user_id, так будет больше совпадений
DЗаменить SUM() на COUNT(*)
Правильный ответ. При one-to-many по order_id деньги нужно сводить до одного факта на заказ через pre-aggregate, иначе появится duplication в SUM().

Разбор

Если у заказа несколько платежных строк, то orders начнёт дублироваться при JOIN, и каждая попытка попадёт в расчёт. В зависимости от бизнес-логики нужно выбрать правило: только успешные платежи, последний успешный или сумма успешных. После pre-aggregate соединение становится ближе к one-to-one, и денежные метрики становятся интерпретируемыми.

Проверь себя · 1/3разбор после ответа
В orders 120 строк (по одной на order_id). В order_items ровно по 3 строки на каждый order_id. Сколько строк будет после соединения ordersorder_items по order_id и почему?
Открыть Карьерник в Telegram

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