Вы соединили заказы с 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 проблему не решают.

Проверь себя · 1/3разбор после ответа
Как переписать запрос без RIGHT JOIN, используя только LEFT JOIN? Исходный запрос: SELECT u.user_id, o.order_id FROM users u RIGHT JOIN orders o ON u.user_id = o.user_id;
Тренировать SQL в Telegram

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