力扣之1783.大满贯数量
文章目录
- 1. 1783.大满贯数量
- 1.1 题干
- 1.2 建表
- 1.3 题解
- 1.4 结果截图
1. 1783.大满贯数量
1.1 题干
表:Players
±---------------±--------+
| Column Name | Type |
±---------------±--------+
| player_id | int |
| player_name | varchar |
±---------------±--------+
player_id 是这个表的主键(具有唯一值的列)
这个表的每一行给出一个网球运动员的 ID 和 姓名
表:Championships
±--------------±--------+
| Column Name | Type |
±--------------±--------+
| year | int |
| Wimbledon | int |
| Fr_open | int |
| US_open | int |
| Au_open | int |
±--------------±--------+
year 是这个表的主键(具有唯一值的列)
该表的每一行都包含在每场大满贯网球比赛中赢得比赛的球员的 ID
编写解决方案,找出每一个球员赢得大满贯比赛的次数。结果不包含没有赢得比赛的球员的ID 。
结果集 无顺序要求 。
结果的格式,如下所示。
示例 1:
输入:
Players 表:
±----------±------------+
| player_id | player_name |
±----------±------------+
| 1 | Nadal |
| 2 | Federer |
| 3 | Novak |
±----------±------------+
Championships 表:
±-----±----------±--------±--------±--------+
| year | Wimbledon | Fr_open | US_open | Au_open |
±-----±----------±--------±--------±--------+
| 2018 | 1 | 1 | 1 | 1 |
| 2019 | 1 | 1 | 2 | 2 |
| 2020 | 2 | 1 | 2 | 2 |
±-----±----------±--------±--------±--------+
输出:
±----------±------------±------------------+
| player_id | player_name | grand_slams_count |
±----------±------------±------------------+
| 2 | Federer | 5 |
| 1 | Nadal | 7 |
±----------±------------±------------------+
解释:
Player 1 (Nadal) 获得了 7 次大满贯:其中温网 2 次(2018, 2019), 法国公开赛 3 次 (2018, 2019, 2020), 美国公开赛 1 次 (2018)以及澳网公开赛 1 次 (2018) 。
Player 2 (Federer) 获得了 5 次大满贯:其中温网 1 次 (2020), 美国公开赛 2 次 (2019, 2020) 以及澳网公开赛 2 次 (2019, 2020) 。
Player 3 (Novak) 没有赢得,因此不包含在结果集中。
1.2 建表
Create table If Not Exists Players (player_id int, player_name varchar(20))
Create table If Not Exists Championships (year int, Wimbledon int, Fr_open int, US_open int, Au_open int)
Truncate table Players
insert into Players (player_id, player_name) values ('1', 'Nadal')
insert into Players (player_id, player_name) values ('2', 'Federer')
insert into Players (player_id, player_name) values ('3', 'Novak')
Truncate table Championships
insert into Championships (year, Wimbledon, Fr_open, US_open, Au_open) values ('2018', '1', '1', '1', '1')
insert into Championships (year, Wimbledon, Fr_open, US_open, Au_open) values ('2019', '1', '1', '2', '2')
insert into Championships (year, Wimbledon, Fr_open, US_open, Au_open) values ('2020', '2', '1', '2', '2')
1.3 题解
select p.player_id,
p.player_name,
sum(player_id=wimbledon)+sum(player_id=fr_open)+sum(player_id=us_open)+sum(player_id=au_open) as grand_slams_count
from players p,championships c
group by p.player_id, p.player_name
having grand_slams_count>0
;