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 11
The report combines the whole chapter: a fixed period, CASE categories, CTE steps and aggregates. The period is a half-open interval: order_date >= DATE '2024-02-01' AND order_date < DATE '2024-03-01'. It includes every day from 1 to 29 February and excludes 1 March — no complex date functions and no "last day of the month" guessing. DATE '2024-02-01' is a date literal; the next chapter covers dates in depth.
Conditional aggregation is CASE inside an aggregate: COUNT(CASE WHEN total >= 50 THEN 1 END) counts only matching rows (CASE without ELSE yields NULL and COUNT skips NULL). SUM(CASE WHEN ... THEN total END) sums a subset; wrap it in COALESCE(..., 0) when there may be no rows. ROUND(x, 2) rounds money.
Without ORDER BY the result order is not guaranteed, so order the categories explicitly.
Common mistakes: <= '2024-02-29' or BETWEEN (brittle, and wrong for TIMESTAMP values); different bounds in different CTEs; forgetting rounding; ELSE 0 inside COUNT(CASE …) — that counts every row.
Small example:
WITH march AS (SELECT total FROM orders WHERE order_date >= DATE '2024-03-01' AND order_date < DATE '2024-04-01') SELECT COUNT(*) AS orders_count, ROUND(SUM(total), 2) AS revenue FROM march;
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: size, orders_count, revenue · row order is checked
Expected result (displayed data):
Loading…The report combines the whole chapter: a fixed period, CASE categories, CTE steps and aggregates. The period is a half-open interval: order_date >= DATE '2024-02-01' AND order_date < DATE '2024-03-01'. It includes every day from 1 to 29 February and excludes 1 March — no complex date functions and no "last day of the month" guessing. DATE '2024-02-01' is a date literal; the next chapter covers dates in depth. Conditional aggregation is CASE inside an aggregate: COUNT(CASE WHEN total >= 50 THEN 1 END) counts only matching rows (CASE without ELSE yields NULL and COUNT skips NULL). SUM(CASE WHEN ... THEN total END) sums a subset; wrap it in COALESCE(..., 0) when there may be no rows. ROUND(x, 2) rounds money. Without ORDER BY the result order is not guaranteed, so order the categories explicitly. Common mistakes: <= '2024-02-29' or BETWEEN (brittle, and wrong for TIMESTAMP values); different bounds in different CTEs; forgetting rounding; ELSE 0 inside COUNT(CASE …) — that counts every row.
QUERY STANDBY
›