SQLПодзапросы и CTEMediumБесплатно

Доля выручки каждой категории

// Условие

Для каждой категории товаров посчитайте долю от общей выручки (завершённые заказы). Выведите category, category_revenue и revenue_share (доля в процентах, округлить до 1 знака). Отсортируйте по revenue_share по убыванию.

// Таблицы

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

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

CTESUM OVERДоляПодзапрос
▶ Решить в SQL-песочнице

// Решение

Подсказка

Посчитайте выручку по категориям, а общую — подзапросом или через оконную функцию SUM() OVER().

Сначала попробуй сам → Показать решение
WITH cat_rev AS (
  SELECT
    p.category,
    SUM(oi.unit_price * oi.quantity) AS category_revenue
  FROM sandbox.orders o
  JOIN sandbox.order_items oi ON o.order_id = oi.order_id
  JOIN sandbox.products p ON oi.product_id = p.product_id
  WHERE o.status = 'completed'
  GROUP BY p.category
)
SELECT
  category,
  ROUND(category_revenue, 2) AS category_revenue,
  ROUND(100.0 * category_revenue / SUM(category_revenue) OVER (), 1) AS revenue_share
FROM cat_rev
ORDER BY revenue_share DESC;

SUM(...) OVER () (пустое окно) — элегантный способ получить общую сумму без подзапроса. Формула доли: 100.0 * часть / целое. Множитель 100.0 (а не 100) гарантирует дробное деление. Альтернатива: подзапрос (SELECT SUM(...) FROM ...) в SELECT-части. Оба варианта принимаются.

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

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

→ CTE против подзапросов