BBampaa

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 →
About 5–10 minutes · no sign-up needed

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

Result:

productrevenuerunning_share
Earbuds2400.293
Speaker2300.574
Smart watch1500.757

Step by step

  1. 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
  2. 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
  3. 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
  4. 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

Try each one in your head first, then open the answer.

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.8
2. 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 DESC
3. 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 DESC
4. 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.8
5. 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.8

Learn 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 →
About 5–10 minutes · no sign-up needed