Войти Регистрация
Data base

213. Сумма товаров и сумма оплат по покупателю

Средняя

Заказ в orders состоит из позиций order_items и оплачивается одним или несколькими платежами payments: например, часть баллами, часть картой. Неоплаченный заказ платежей не имеет.

Для каждого покупателя, у которого есть заказы, верните user_id, items_rub — сумму qty * price_rub по всем позициям его заказов и paid_rub — сумму его платежей (0, если платежей нет). Порядок — по user_id.

В работе: Сверка финансов: у кого оплачено меньше, чем заказано, и где искать недоплату.

Таблицы

orders — заказы

КолонкаТипЧто значит
order_idintключ
user_idintпокупатель
created_attimestampоформление

order_items — позиции заказа

КолонкаТипЧто значит
order_idintзаказ
sku_idintтовар
qtyintштук
price_rubnumericцена за штуку

payments — платежи по заказу

КолонкаТипЧто значит
payment_idintключ
order_idintзаказ
methodtextcard / points / sbp
amount_rubnumericсумма

Пример: данные

orders · 2 строки

order_iduser_idcreated_at
1712026-02-10T12:00:00
2722026-02-11T09:30:00

order_items · 3 строки

order_idsku_idqtyprice_rub
110012450
1100211290
210031799

payments · 3 строки

payment_idorder_idmethodamount_rub
11points300
21card1890
32sbp799

Ожидаемый ответ

user_iditems_rubpaid_rub
7121902190
72799799
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 5 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
user_id, items_rub, paid_rub
JOINLEFT JOINCTEGROUP BYNULL

Источник: наша задача на данных Ozon: состав заказа и оплаты частями. Условие пересказано своими словами.