Top Revenue Contribution Products
Find products contributing highest percentage to total revenue.
The challenge runs on the SQLabHub practice database (SQLite) and uses the order_items table. You can solve it in the browser, with nothing to install.
The task
Find products contributing highest percentage to total revenue.
A correct answer returns 119 rows with 2 columns: product_id, pct.
Tables used in this challenge
order_items 496 rows
id INTEGER (PK) · order_id INTEGER · product_id INTEGER · quantity INTEGER · unit_price REAL · subtotal REAL
| id | order_id | product_id | quantity | unit_price | subtotal |
|---|---|---|---|---|---|
The first rows of each table are shown. See how all the tables relate on the database schema page.
Expected output
| product_id | pct |
|---|---|
First 5 of 119 rows. This is the output of the model solution on the practice database.
What you practise
- Summarising many rows into one value with COUNT, SUM, AVG, MIN or MAX
- Grouping rows with GROUP BY to get one result row per group
- Attaching a total or average to every row with an aggregate OVER ()
- Sorting the result with ORDER BY
- Deriving a new column from an expression and naming it with an alias
Hint and approach
Try the challenge first. Open these only when you need them.
Show the hint
SUM subtotal / total SUM
Show the step-by-step approach
How the model solution is built, in the order the database evaluates it:
- Read from the
order_itemstable. - Group the rows by
product_id, so the result has one row for each value. - For each group, compute
SUM(subtotal). - Compute
SUM(SUM(subtotal))with an emptyOVER (), so the figure for the whole result is repeated on every row. - Combine those values into
pct:SUM(subtotal) * 100.0 / SUM(SUM(subtotal)) OVER (). - Sort the result by
pctdescending.
Model solution
Checking your session…
What to watch for
- Window aggregates. A window aggregate keeps every row, while a plain aggregate collapses them. Mixing the two in one SELECT without GROUP BY is an error.
- GROUP BY. Every selected column must either be in GROUP BY or sit inside an aggregate. SQLite accepts other columns and returns an arbitrary value for them; most databases raise an error.
- Calculated columns. Dividing one integer by another truncates the result in SQLite. Multiply one side by 1.0 to get decimals.
Related SQL challenges
- Calculate Each Category's Share of Total RevenueSimilar levelHard
- Calculate Each Order's Percentage of Total RevenueSimilar levelHard
- Find the Best-Selling Products by QuantityEasierMedium
- Calculate the Cumulative Percentage of RevenueSimilar levelHard
- Subtract the Overall Average from Each Salary with AVG() OVER ()Similar levelHard
Keep learning
- Lesson: Window Functions
- Lesson: GROUP BY
- Lesson: Comments & Aliases
- Lesson: ORDER BY
- All SQL practice challenges, by difficulty and topic
- SQL interview questions with answers
- SQL Playground: run any query on the same database