Доля выручки каждой категории
// Условие
Для каждой категории товаров посчитайте долю от общей выручки (завершённые заказы). Выведите category, category_revenue и revenue_share (доля в процентах, округлить до 1 знака). Отсортируйте по revenue_share по убыванию.
// Таблицы
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) |
sandbox.order_items
item_id | INT |
order_id | INT |
product_id | INT |
quantity | INT |
unit_price | NUMERIC(10,2) |
sandbox.products
product_id | INT |
product_name | VARCHAR(100) |
category | VARCHAR(30) |
price | NUMERIC(10,2) |
seller_id | INT |
// Что тренирует
CTESUM OVERДоляПодзапрос
// Решение
Подсказка
Посчитайте выручку по категориям, а общую — подзапросом или через оконную функцию 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-части. Оба варианта принимаются.