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

43. Выручка продавца за вычетом частичных возвратов

Средняя

Позиция заказа (order_items) — товар продавца в нескольких штуках. Покупатель может вернуть часть штук, и не за один раз: каждый возврат — строка в returns с количеством qty.

Для каждого продавца верните seller_id, gross_rub — сумму qty * price_rub по позициям, returned_rub — стоимость возвращённых штук по цене позиции и net_rub — разницу. Порядок — по net_rub по убыванию, затем по seller_id.

В работе: Выплата продавцу: деньги за возвращённые штуки удерживаются из выручки.

Таблицы

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

КолонкаТипЧто значит
item_idintключ
order_idintзаказ
seller_idintпродавец
skuintтовар
qtyintштук
price_rubnumericцена за штуку

returns — возвраты, по позиции может быть несколько

КолонкаТипЧто значит
return_idintключ
item_idintпозиция
qtyintвозвращено штук
returned_attimestampвремя

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

order_items · 4 строки

item_idorder_idseller_idskuqtyprice_rub
1100175013890
21001860114500
31002750221200
4100386024350

returns · 2 строки

return_iditem_idqtyreturned_at
1112025-11-10T12:00:00
2442025-11-12T15:00:00

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

seller_idgross_rubreturned_rubnet_rub
8590014004500
750708904180
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
seller_id, gross_rub, returned_rub, net_rub
LEFT JOINCTEGROUP BYNULL

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

Давали на собеседовании? Ответов пока мало — ваш поможет.