SQL 报表制作
Tyler Pernes
Learning & Development Consultant





PARTITION BY = 计算范围ORDER BY = 运行计算的行序铜牌总数
SELECT
country_id,
athlete_id,
SUM(bronze) OVER () AS total_bronze
FROM summer_games;
+-------------+-------------+---------------+
| country_id | athlete_id | total_bronze |
|-------------|-------------|---------------|
| 11 | 77505 | 141 |
| 11 | 11673 | 141 |
| 14 | 85554 | 141 |
| 14 | 76433 | 141 |
+-------------+-------------+---------------+
各国铜牌数
SELECT
country_id,
athlete_id,
SUM(bronze) OVER (PARTITION BY country_id) AS total_bronze
FROM summer_games
+-------------+-------------+---------------+
| country_id | athlete_id | total_bronze |
|-------------|-------------|---------------|
| 11 | 77505 | 12 |
| 11 | 11673 | 12 |
| 14 | 85554 | 5 |
| 14 | 76433 | 5 |
+-------------+-------------+---------------+
SUM()AVG()MIN()MAX()LAG() 与 LEAD()
LAG() 与 LEAD()
ROW_NUMBER() 与 RANK()
original_table
+----------+-----------+---------+
| team_id | player_id | points |
|----------|-----------|---------|
| 1 | 4123 | 3 |
| 1 | 5231 | 6 |
| 2 | 8271 | 5 |
+----------+-----------+---------+
desired_report
+----------+-------------+---------------+
| team_id | team_points | league_points |
|----------|-------------|---------------|
| 1 | 9 | 43 |
| 2 | 12 | 43 |
| 3 | 22 | 43 |
+----------+-------------+---------------+
最终查询
SELECT
team_id,
SUM(points) AS team_points,
SUM(SUM(points)) OVER () AS league_points
FROM original_table
GROUP BY team_id;
SELECT
team_id,
SUM(points) AS team_points,
SUM(points) OVER () AS league_points
FROM original_table
GROUP BY team_id;
ERROR: points must be an aggregation or appear in a GROUP BY statement.
步骤 1:各国铜牌总数
SELECT country_id, SUM(bronze) as bronze_medals
FROM summer_games
GROUP BY country_id;
步骤 2:转为子查询并取最大值
SELECT MAX(bronze_medals)
FROM
(SELECT country_id, SUM(bronze) as bronze_medals
FROM summer_games
GROUP BY country_id) AS subquery;


SQL 报表制作