Выручка продавцов с названием и городом
// Условие
Для каждого продавца посчитайте выручку от завершённых заказов (сумма unit_price * quantity из order_items). Выведите seller_name, city, revenue (округлить до 2 знаков). Только продавцы с выручкой > 100 000. Отсортируйте по revenue по убыванию.
// Таблицы
sandbox.sellers
seller_id | INT |
seller_name | VARCHAR(100) |
registration_date | DATE |
city | VARCHAR(50) |
sandbox.products
product_id | INT |
product_name | VARCHAR(100) |
category | VARCHAR(30) |
price | NUMERIC(10,2) |
seller_id | INT |
sandbox.order_items
item_id | INT |
order_id | INT |
product_id | INT |
quantity | INT |
unit_price | NUMERIC(10,2) |
sandbox.orders
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
// Что тренирует
Multiple JOINGROUP BYHAVINGSUM
// Решение
Подсказка
Цепочка: sellers → products → order_items → orders. Выручка считается по order_items (unit_price * quantity), а не по orders.amount. Фильтр выручки — через HAVING.
Сначала попробуй сам → Показать решение
SELECT
s.seller_name,
s.city,
ROUND(SUM(oi.unit_price * oi.quantity), 2) AS revenue
FROM sandbox.sellers s
JOIN sandbox.products p ON s.seller_id = p.seller_id
JOIN sandbox.order_items oi ON p.product_id = oi.product_id
JOIN sandbox.orders o ON oi.order_id = o.order_id
WHERE o.status = 'completed'
GROUP BY s.seller_id, s.seller_name, s.city
HAVING SUM(oi.unit_price * oi.quantity) > 100000
ORDER BY revenue DESC;
Четыре JOIN в цепочке — типичная задача для маркетплейса. Важно: выручка считается как SUM(unit_price * quantity), а не SUM(orders.amount), потому что orders.amount — это сумма всего заказа, а нам нужна выручка конкретного продавца. GROUP BY включает seller_id (для корректности) и seller_name + city (для вывода).