sql, column과 row를 바꾸기 - 90도 회전하기

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