Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
SQL / POSTGRESQL / Learn / LESSON 07
A subquery in FROM acts like a temporary table for this query and must have an alias: FROM (SELECT ...) AS t. The outer query then works on already summarized rows. That gives you a second layer of calculation, such as the average of sums — AVG(SUM(...)) is not allowed directly, but AVG over a subquery containing SUM is.
Use clear aliases for the subquery (t, customer_totals) and for computed columns (spent, orders_count), because the outer query refers to them by name.
Common mistakes: a missing alias (PostgreSQL raises an error); nesting an aggregate inside an aggregate without a subquery; averaging over all orders instead of over per-customer sums; forgetting to exclude the NULL customer when you do not want it as a group.
Small example:
SELECT t.customer_id, t.spent FROM (SELECT customer_id, SUM(total) AS spent FROM orders GROUP BY customer_id) AS t WHERE t.spent > 100;
Working tables for this task. Grading also uses other datasets with the same schema.
| id | name | category | price |
|---|---|---|---|
| 1 | Atlas | books | 30 |
| 2 | Novel | books | 15 |
| 3 | Comic | books | 14.99 |
| 4 | Lamp | home | 29.99 |
| 5 | Vase | home | 30 |
| 6 | Rug | home | 45 |
| 7 | Hammer | tools | 15 |
| 8 | Drill | tools | 60 |
| 9 | Tape | tools | 15 |
| 10 | Candle | NULL | 8.5 |
| 11 | Gift Card | NULL | 25 |
| id | name | city |
|---|---|---|
| 1 | Mira | Sofia |
| 2 | Niko | Varna |
| 3 | Iva | Sofia |
| 4 | Alex | NULL |
| 5 | Boris | Plovdiv |
| 6 | Lena | Varna |
| 7 | Petya | Sofia |
| id | customer_id | total | order_date |
|---|---|---|---|
| 1 | 1 | 120 | 2024-01-05 |
| 2 | 1 | 35.5 | 2024-01-20 |
| 3 | 2 | 40 | 2024-01-20 |
| 4 | 3 | 99.99 | 2024-01-31 |
| 5 | NULL | 60 | 2024-02-01 |
| 6 | 1 | 40 | 2024-02-01 |
| 7 | 2 | 75.25 | 2024-02-14 |
| 8 | 3 | 100 | 2024-02-15 |
| 9 | 5 | 22 | 2024-02-15 |
| 10 | 1 | 39.99 | 2024-02-29 |
| 11 | 2 | 55 | 2024-03-01 |
| 12 | 3 | 18 | 2024-03-10 |
| 13 | 1 | 130 | 2024-03-15 |
| 14 | 2 | 40 | 2024-03-15 |
| 15 | 2 | 12.5 | 2024-03-31 |
| 16 | 3 | 47 | 2024-04-01 |
Expected columns: avg_spent · row order is not required
Expected result (displayed data):
Loading…A subquery in FROM acts like a temporary table for this query and must have an alias: FROM (SELECT ...) AS t. The outer query then works on already summarized rows. That gives you a second layer of calculation, such as the average of sums — AVG(SUM(...)) is not allowed directly, but AVG over a subquery containing SUM is. Use clear aliases for the subquery (t, customer_totals) and for computed columns (spent, orders_count), because the outer query refers to them by name. Common mistakes: a missing alias (PostgreSQL raises an error); nesting an aggregate inside an aggregate without a subquery; averaging over all orders instead of over per-customer sums; forgetting to exclude the NULL customer when you do not want it as a group.
QUERY STANDBY
›