sql, column과 row를 바꾸기 - 90도 회전하기
•
infoqoch
•
•
column 과 row 를 잘 전환하기
- sql은 일종의 x축과 y축을 가진 2차원과 유사하다는 느낌을 받는다. 칼럼과 로우로 이뤄진 관계형 데이타베이스는 사실 2차원이 맞다.
- x축과 y축을 union 등을 사용하여 바꿀 수 있다.
승리한 횟수를 구한다. Grand Slam Titles
- https://leetcode.com/problems/grand-slam-titles/
- Championships 테이블에는 년도와 4개의 메이저 대회가 있다. 년도는 년도가 들어가고 대회에는 승리자의 고유번호가 들어간다.
- 문제는 승리자의 고유번호가 모든 연도에 모든 게임에서 총 몇 회를 승리를 했는지 판단하는 일이다.
Input:
Players table:
+-----------+-------------+
| player_id | player_name |
+-----------+-------------+
| 1 | Nadal |
| 2 | Federer |
| 3 | Novak |
+-----------+-------------+
Championships table:
+------+-----------+---------+---------+---------+
| year | Wimbledon | Fr_open | US_open | Au_open |
+------+-----------+---------+---------+---------+
| 2018 | 1 | 1 | 1 | 1 |
| 2019 | 1 | 1 | 2 | 2 |
| 2020 | 2 | 1 | 2 | 2 |
+------+-----------+---------+---------+---------+
Output:
+-----------+-------------+-------------------+
| player_id | player_name | grand_slams_count |
+-----------+-------------+-------------------+
| 2 | Federer | 5 |
| 1 | Nadal | 7 |
+-----------+-------------+-------------------+
문제의 해소
- 위의 문제는 어떤 게임에서 어떤 해에 이겼나가 중요하지 않다. 그냥 몇 번 이겼나가 중요하다.
- 이 경우 모든 column을 row로 변경하여 쉽게 해소 가능하다. 다음과 같이 변경된다.
before
+------+-----------+---------+---------+---------+
| year | Wimbledon | Fr_open | US_open | Au_open |
+------+-----------+---------+---------+---------+
| 2018 | 1 | 1 | 1 | 1 |
| 2019 | 1 | 1 | 2 | 2 |
| 2020 | 2 | 1 | 2 | 2 |
+------+-----------+---------+---------+---------+
after
+-----------
| Wimbledon
+-----------
| 1
| 1
| 2
+-----------
+---------
| Fr_open
+---------
| 1
| 1
| 1
+---------
| US_open
| 1
| 2
| 2
+---------+
| Au_open
| 1
| 2
| 2
쿼리
- column을 row로 만들 때 union 을 사용했다.
select
tb.player_id
, player_name
, count(tb.player_id) grand_slams_count
from (
select Wimbledon player_id
from Championships
union all
select Fr_open player_id
from Championships
union all
select US_open player_id
from Championships
union all
select Au_open player_id
from Championships
) tb
join players p
on tb.player_id = p.player_id
group by player_id