Заказ в orders состоит из позиций order_items и оплачивается одним или несколькими платежами payments: например, часть баллами, часть картой. Неоплаченный заказ платежей не имеет.
Для каждого покупателя, у которого есть заказы, верните user_id, items_rub — сумму qty * price_rub по всем позициям его заказов и paid_rub — сумму его платежей (0, если платежей нет). Порядок — по user_id.
В работе: Сверка финансов: у кого оплачено меньше, чем заказано, и где искать недоплату.
Таблицы
orders — заказы
| Колонка | Тип | Что значит |
|---|---|---|
order_id | int | ключ |
user_id | int | покупатель |
created_at | timestamp | оформление |
order_items — позиции заказа
| Колонка | Тип | Что значит |
|---|---|---|
order_id | int | заказ |
sku_id | int | товар |
qty | int | штук |
price_rub | numeric | цена за штуку |
payments — платежи по заказу
| Колонка | Тип | Что значит |
|---|---|---|
payment_id | int | ключ |
order_id | int | заказ |
method | text | card / points / sbp |
amount_rub | numeric | сумма |
Пример: данные
orders · 2 строки
| order_id | user_id | created_at |
|---|---|---|
| 1 | 71 | 2026-02-10T12:00:00 |
| 2 | 72 | 2026-02-11T09:30:00 |
order_items · 3 строки
| order_id | sku_id | qty | price_rub |
|---|---|---|---|
| 1 | 1001 | 2 | 450 |
| 1 | 1002 | 1 | 1290 |
| 2 | 1003 | 1 | 799 |
payments · 3 строки
| payment_id | order_id | method | amount_rub |
|---|---|---|---|
| 1 | 1 | points | 300 |
| 2 | 1 | card | 1890 |
| 3 | 2 | sbp | 799 |
Ожидаемый ответ
| user_id | items_rub | paid_rub |
|---|---|---|
| 71 | 2190 | 2190 |
| 72 | 799 | 799 |
SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
user_id, items_rub, paid_rub
Источник: наша задача на данных Ozon: состав заказа и оплаты частями. Условие пересказано своими словами.
Посмотреть данные, проверить кусок запроса. На зачёт не влияет.
Здесь появится результат отправки.