SQLJOINMediumБесплатно

Выручка продавцов с названием и городом

// Условие

Для каждого продавца посчитайте выручку от завершённых заказов (сумма unit_price * quantity из order_items). Выведите seller_name, city, revenue (округлить до 2 знаков). Только продавцы с выручкой > 100 000. Отсортируйте по revenue по убыванию.

// Таблицы

sandbox.sellers
seller_idINT
seller_nameVARCHAR(100)
registration_dateDATE
cityVARCHAR(50)
sandbox.products
product_idINT
product_nameVARCHAR(100)
categoryVARCHAR(30)
priceNUMERIC(10,2)
seller_idINT
sandbox.order_items
item_idINT
order_idINT
product_idINT
quantityINT
unit_priceNUMERIC(10,2)
sandbox.orders
order_idINT
user_idINT
order_dateTIMESTAMP
amountNUMERIC(10,2)
statusVARCHAR(20)
delivery_daysINT
promo_codeVARCHAR(20)

// Что тренирует

Multiple JOINGROUP BYHAVINGSUM
▶ Решить в SQL-песочнице

// Решение

Подсказка

Цепочка: 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 (для вывода).

// Похожие задачи

// Разобраться в теме

→ Типы JOIN в SQL