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

40. Использование промокодов

Лёгкая

В promo_codes коды хранятся заглавными буквами (OSEN25), у каждого — фиксированная скидка discount_rub. В orders.promo_code код записан так, как его ввёл покупатель, регистр бывает любым; NULL — без промокода.

Для каждого промокода верните code, uses — число неотменённых заказов с ним и discount_total — сумму скидок по этим заказам. Неиспользованный код — с нулями. Порядок — по uses по убыванию, затем по code.

В работе: Отчёт маркетинга после акции: какие коды сработали, а какие никто не ввёл.

Таблицы

promo_codes — промокоды

КолонкаТипЧто значит
codetextключ, заглавными
discount_rubintскидка на заказ
valid_todateдействует до

orders — заказы

КолонкаТипЧто значит
order_idintключ
user_idintпокупатель
promo_codetextвведённый код или NULL
created_attimestampвремя
statustextcreated / delivered / cancelled

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

promo_codes · 3 строки

codediscount_rubvalid_to
OSEN253002025-11-30
PERVYI5002025-12-31
ZIMA2002026-02-28

orders · 5 строк

order_iduser_idpromo_codecreated_atstatus
111OSEN252025-10-01T10:00:00delivered
212OSEN252025-10-02T11:00:00delivered
313PERVYI2025-10-03T12:00:00delivered
414NULL2025-10-03T13:00:00delivered
515OSEN252025-10-04T09:00:00cancelled

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

codeusesdiscount_total
OSEN252600
PERVYI1500
ZIMA00
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
code, uses, discount_total
LEFT JOINGROUP BYстрокиNULL

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

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