Lessons › SQL › Go further in SQL: Business questions
SQL lesson
Which products make up the top 80% of revenue?
Which products make up the top 80% of revenue? Total each product, sort biggest first, then work out a running share of the grand total: SUM OVER (ORDER BY revenue DESC) divided by SUM OVER (). Keep the products whose running share is 0.8 or less.
Try this lesson free →Example
Pareto: biggest first, a running share, then a cut-off
WITH t AS (
SELECT product, SUM(revenue) AS revenue
FROM orders
GROUP BY product
), r AS (
SELECT product,
revenue,
1.0 * SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER () AS running_share
FROM t
)
SELECT product, revenue, running_share
FROM r
WHERE running_share <= 0.8| product | revenue | running_share |
|---|---|---|
| Earbuds | 240 | 0.293 |
| Speaker | 230 | 0.574 |
| Smart watch | 150 | 0.757 |
Step by step
- Biggest first.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product), r AS (SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t) SELECT product, revenue, running_share FROM r WHERE running_share <= 0.8 - No join.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product), r AS (SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t) SELECT product, revenue, running_share FROM r WHERE running_share <= 0.8 - WHERE running_share <= 0.8, after it's worked out.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product), r AS (SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t) SELECT product, revenue, running_share FROM r WHERE running_share <= 0.8 - Two CTEs: totals, then the running share.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product), r AS (SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t) SELECT product, revenue, running_share FROM r WHERE running_share <= 0.8
Practice
1. Which products make up the top 80% of revenue? Show product, revenue and running_share as a decimal, for products up to 0.8.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product), r AS (SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t) SELECT product, revenue, running_share FROM r WHERE running_share <= 0.82. Show every product with its running share of revenue, biggest first. Show product, revenue and running_share.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product) SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t ORDER BY revenue DESC3. What share of revenue does each product bring, biggest first? Show product and share.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product) SELECT product, 1.0 * revenue / SUM(revenue) OVER () AS share FROM t ORDER BY revenue DESC4. Which customers make up the top 80% of revenue? Show customer_id, spend and running_share.
WITH t AS (SELECT customer_id, SUM(revenue) AS spend FROM orders GROUP BY customer_id), r AS (SELECT customer_id, spend, 1.0 * SUM(spend) OVER (ORDER BY spend DESC) / SUM(spend) OVER () AS running_share FROM t) SELECT customer_id, spend, running_share FROM r WHERE running_share <= 0.85. How many products make up the top 80% of revenue? Show one number, products.
WITH t AS (SELECT product, SUM(revenue) AS revenue FROM orders GROUP BY product), r AS (SELECT product, revenue, 1.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER () AS running_share FROM t) SELECT COUNT(*) AS products FROM r WHERE running_share <= 0.8Learn it by doing. This lesson is a short hands-on level on Bampaa: see it work, then build and write it yourself, with instant feedback.
Try this lesson free →