Вы соединили заказы с order_items и payments по order_id, а потом посчитали SUM(paid_amount). Сумма оказалась завышенной. Что вероятнее всего произошло и как исправить?

AИспользуется INNER JOIN; заменить его на LEFT JOIN, тогда платежи перестанут дублироваться при соединении трёх таблиц
BСтроки умножились из-за нескольких записей в order_items и payments; агрегировать каждую до уровня order_id и затем делать JOIN
CДело в NULL в столбце paid_amount; обернуть сумму в COALESCE и заменить пустые значения на ноль для устранения завышения
DЗаменить JOIN на UNION между подзапросами и оставить ключ заказа, тогда повторяющиеся платежи уйдут автоматически
Правильный ответ. При соединении нескольких таблиц с отношением «один-ко-многим» по одному ключу строки могут размножаться и завышать суммы.

Разбор

Если у заказа три позиции в order_items и два платежа в payments, после соединения получится шесть строк на один заказ. Тогда SUM(paid_amount) посчитает один и тот же платёж несколько раз. Типичный фикс — сначала агрегировать order_items до одной строки на order_id и отдельно агрегировать payments до одной строки на order_id, и только затем соединять эти агрегаты с заказами. Замена типа соединения или COALESCE проблему не решают.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

Ещё вопросы по теме «JOIN и операции множеств»