Маркетплейс в SQL. 18 задач для продавца и аналитика

- -
- 100%
- +

Перед первой задачей
Маркетплейс любит маленькие ошибки
Карточка может быть опубликована, но не продаваться из-за нулевого остатка, заморозки, карантина или убыточной цены.
Просмотры без корзин, корзины без оплат и продажи без чистой прибыли — разные проблемы. Их нельзя чинить одним и тем же действием.
Эта книга показывает, как разложить витрину на проверяемые SQL-метрики и быстрее увидеть реальный блокер роста.
Как читать задачи
Каждая задача использует короткую синтетическую выгрузку: офферы, остатки, просмотры, заказы, расходы, конкуренты или доставка.
Перед решением полезно назвать управленческое действие: пополнить остаток, переписать карточку, снизить риск буста, поднять цену или снять товар.
Это учебные примеры, а не инструкция по конкретному кабинету. Задача — научиться считать логику, которую потом можно перенести в реальную выгрузку.
Маршрут по задачам
1. Конверсия карточки в корзину и оплату
2. Найти реально доступные к продаже товары
3. Чистая прибыль по оплаченным заказам
4. Безопасный процент буста от продажи
5. Сравнить цену с минимальной ценой конкурента
6. Потерянный спрос из-за нулевого остатка
7. Карточки с просмотрами, но без корзин
8. Возвраты по SKU
9. Остатки по складам
10. Запросы покупателей без оплат
11. Позиция в выдаче и CTR
12. Опоздания доставки
13. Комиссия и прибыль по категориям
14. Отобрать товары с безопасной маржой
15. Трёхдневный тренд просмотров
16. Карточки без базового контента
17. Разделить органику и буст в продажах
18. Финальный дневной отчёт продавца
Практические задачи
Задача 1. Конверсия карточки в корзину и оплату
Рабочий вопросНужно сравнить просмотры, добавления в корзину и оплаченные заказы по SKU, чтобы не смешивать проблемы трафика и карточки.
ДанныеCREATE TABLE offer_stats(sku TEXT, views INTEGER, carts INTEGER, paid_orders INTEGER);
INSERT INTO offer_stats VALUES
('A',100,5,2),
('B',60,1,0),
('C',40,0,0);
ЗапросSELECT sku,
views,
carts,
paid_orders,
ROUND(carts * 100.0 / views, 2) AS cart_conversion_pct,
CASE WHEN carts = 0 THEN 0
ELSE ROUND(paid_orders * 100.0 / carts, 2)
END AS order_from_cart_pct
FROM offer_stats
ORDER BY views DESC;
Ожидаемый результат[["A", 100, 5, 2, 5.0, 40.0], ["B", 60, 1, 0, 1.67, 0.0], ["C", 40, 0, 0, 0.0, 0]]
Почему работаетcart_conversion_pct показывает реакцию на карточку.
order_from_cart_pct показывает, сколько корзин дошло до оплаты.
Для нулевой корзины нужен отдельный CASE, чтобы не делить на ноль.
Где легко ошибитьсяЕсли смотреть только просмотры, SKU C может казаться живым, хотя у него нет ни одной корзины.
Самостоятельная проверкаКакой SKU первым требует проверки названия, цены или обложки карточки?
Ответ: SKU C: просмотры есть, но корзин нет, значит карточка не убеждает покупателя.
Задача 2. Найти реально доступные к продаже товары
Рабочий вопросНужно отделить опубликованные и покупаемые товары от карточек, которые формально есть, но заблокированы остатком или статусом.
ДанныеCREATE TABLE offers(sku TEXT, status TEXT, stock INTEGER, freeze INTEGER, quarantine INTEGER);
INSERT INTO offers VALUES
('A','PUBLISHED',25,0,0),
('B','PUBLISHED',0,0,0),
('C','PUBLISHED',10,1,0),
('D','PUBLISHED',8,0,1),
('E','DRAFT',30,0,0);
ЗапросSELECT sku, stock
FROM offers
WHERE status = 'PUBLISHED'
AND stock > 0
AND freeze = 0
AND quarantine = 0
ORDER BY sku;
Ожидаемый результат[["A", 25]]
Почему работаетA опубликован и имеет положительный остаток.
B опубликован, но остаток равен нулю.
C и D исключены из-за freeze и quarantine.
Где легко ошибитьсяСчитать все PUBLISHED карточки активным ассортиментом опасно: часть витрины может быть недоступна к покупке.
Самостоятельная проверкаПочему DRAFT с остатком 30 не считается доступным товаром?
Ответ: Покупатель не видит черновик на витрине, поэтому остаток у DRAFT не создаёт продажу.
Задача 3. Чистая прибыль по оплаченным заказам
Рабочий вопросНужно посчитать прибыль после комиссии, эквайринга, налога и себестоимости только по фактически оплаченным заказам.
ДанныеCREATE TABLE orders(id INTEGER, status TEXT, gross INTEGER, market_fee INTEGER, acquiring INTEGER, tax INTEGER, cost INTEGER);
INSERT INTO orders VALUES
(1,'paid',1000,140,20,60,200),
(2,'paid',500,70,10,30,100),
(3,'new',900,126,18,54,180);
ЗапросSELECT id,
gross,
gross - market_fee - acquiring - tax - cost AS net_profit
FROM orders
WHERE status = 'paid'
ORDER BY id;
Ожидаемый результат[[1, 1000, 580], [2, 500, 290]]
Почему работаетВ расчёт попадают только paid-заказы.
Заказ 1 даёт 1000 - 140 - 20 - 60 - 200.
Новый заказ 3 не должен попадать в прибыль.
Где легко ошибитьсяКонец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.


