Reporting in SQL
Tyler Pernes
Learning & Development Consultant
+--------+-----------------+
| order | price_per_unit |
|--------|-----------------|
| 1 | 4.50 |
| 2 | 2.25 |
| 3 | null |
+--------+-----------------+
soccer_games
+---------+-------+-------+
| game_id | home | away |
|---------|-------|-------|
| 123 | 3 | 2 |
| 124 | 2 | null |
| 125 | null | 1 |
+---------+-------+-------+
SELECT *, home + away AS total_goals
FROM soccer_games;
+---------+-------+-------+--------------+
| game_id | home | away | total_goals |
|---------|-------|-------|--------------|
| 123 | 3 | 2 | 5 |
| 124 | 2 | null | null |
| 125 | null | 1 | null |
+---------+-------+-------+--------------+
SELECT
region,
COUNT(DISTINCT athlete_id) AS athletes
FROM summer_games AS s
JOIN countries AS c
ON s.country_id = c.id
GROUP BY region;
+----------+-----------+
| region | athletes |
|----------|-----------|
| BALTICS | 42 |
| OCEANIA | 62 |
| null | 10 |
+----------+-----------+
original_table
+--------+-----------------+
| order | price_per_unit |
|--------|-----------------|
| 1 | 4.50 |
| 2 | 2.25 |
| 3 | null |
+--------+-----------------+
SELECT *
FROM original_table
WHERE price_per_unit IS NOT NULL;
+--------+-----------------+
| order | price_per_unit |
|--------|-----------------|
| 1 | 4.50 |
| 2 | 2.25 |
+--------+-----------------+
Syntax:COALESCE(field, null_replacement)
SELECT
COALESCE(region,'Independent Athletes') AS region,
COUNT(DISTINCT athlete_id) AS athletes
FROM summer_games AS s
JOIN countries AS c
ON s.country_id = c.id;
+-----------------------+-----------+
| region | athletes |
|-----------------------|-----------|
| BALTICS | 42 |
| OCEANIA | 62 |
| Independent Athletes | 10 |
+-----------------------+-----------+
soccer_games
+---------+-------+-------+
| game_id | home | away |
|---------|-------|-------|
| 123 | 3 | 2 |
| 124 | 2 | null |
| 125 | null | 1 |
+---------+-------+-------+
SELECT *, COALESCE(home,0) + COALESCE(away,0) AS total_goals
FROM soccer_games;
+---------+-------+-------+--------------+
| game_id | home | away | total_goals |
|---------|-------|-------|--------------|
| 123 | 3 | 2 | 5 |
| 124 | 2 | null | 2 |
| 125 | null | 1 | 1 |
+---------+-------+-------+--------------+
Causes:
LEFT JOIN
does not match all rowsCASE
statement conditional is satisfiedRatio of rows that are null
SELECT SUM(CASE when country IS NULL then 1 else 0 end) / SUM(1.00)
FROM orders;
+-------+
| .12 |
+-------+
Ratio of revenue that is null
SELECT SUM(CASE when country IS NULL then revenue else 0 end) / SUM(revenue)
FROM orders;
+-------+
| .25 |
+-------+
Reporting in SQL