Category Revenue Leaders
Find category contributing highest revenue overall.
The challenge runs on the SQLabHub practice database (SQLite) and uses the products and order_items tables. You can solve it in the browser, with nothing to install.
The task
Find category contributing highest revenue overall.
A correct answer returns 1 row with 2 columns: category, revenue.
Tables used in this challenge
products 120 rows
id INTEGER (PK) · name TEXT · category TEXT · price REAL · cost REAL · stock INTEGER · sku TEXT · status TEXT · rating REAL · review_count INTEGER
| id | name | category | price | cost | stock | sku | status | rating | review_count |
|---|---|---|---|---|---|---|---|---|---|
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
| category | revenue |
|---|---|
The complete result: 1 row. 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
- Combining rows from two tables on a matching key with an inner join
- Sorting the result with ORDER BY
- Returning only the first rows with LIMIT
Hint and approach
Try the challenge first. Open these only when you need them.
Show the hint
JOIN products + order_items
Show the step-by-step approach
How the model solution is built, in the order the database evaluates it:
- Read from the
productstable. - Join
order_itemsonproducts.id=order_items.product_id. - Group the rows by
products.category, so the result has one row for each value. - For each group, compute
SUM(order_items.subtotal). - Sort the result by
revenuedescending. - Keep only the first row with
LIMIT 1.
Model solution
Checking your session…
What to watch for
- INNER JOIN. An inner join drops rows that have no partner on the other side, and it repeats a row once for every match, which inflates SUM and COUNT.
- 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.
- LIMIT. LIMIT without ORDER BY returns an arbitrary set of rows. LIMIT is also dialect-specific: SQL Server uses TOP and Oracle uses FETCH FIRST.
Related SQL challenges
- Find the City with the Highest Total RevenueSimilar levelHard
- Calculate Profit Generated by Each CustomerSimilar levelHard
- Find the Top 5 Customers by Total SpendEasierMedium
- Find the Week with the Highest RevenueSimilar levelHard
- Calculate Revenue and Units Sold per Product CategoryEasierMedium
Keep learning
- Lesson: INNER JOIN
- Lesson: GROUP BY
- Lesson: LIMIT / TOP / FETCH
- 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