문제
Pivot the Occupation column in OCCUPATIONS so that each Name is sorted alphabetically and displayed underneath its corresponding Occupation. The output should consist of four columns (Doctor, Professor, Singer, and Actor) in that specific order, with their respective names listed alphabetically under each column.
Note: Print NULL when there are no more names corresponding to an occupation.
해석
- Occupation 열을 기준으로 데이터를 피벗하여 다음 네 개의 열을 생성
- Doctor
- Professor
- Singer
- Actor
- 각 열에는 해당 직업에 속하는 사람들의 Name이 알파벳 순으로 정렬
- 각 직업에 속하는 사람 수가 다를 수 있으므로, 짧은 직업 목록의 경우 NULL로 채워라.
정답
WITH Ranked_Occupations AS (
SELECT
Name,
Occupation,
ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS row_num
FROM OCCUPATIONS
)
SELECT
MAX(CASE WHEN Occupation = 'Doctor' THEN Name END) AS Doctor,
MAX(CASE WHEN Occupation = 'Professor' THEN Name END) AS Professor,
MAX(CASE WHEN Occupation = 'Singer' THEN Name END) AS Singer,
MAX(CASE WHEN Occupation = 'Actor' THEN Name END) AS Actor
FROM Ranked_Occupations
GROUP BY row_num;
배운 점
- row_number 과 max(case)문의 결합 형태에 대해 알게 되었다.
- row_number에 partition을 넣게 되면 정렬한 대로 번호가 매기게 되고 row_number는 그냥 1~6까지 번호가 들어가진다.
- 다른 값을 가졌던 데이터들을 세로가 아닌 가로로 넣기 위해서는 row_number로 숫자로 매핑하고 이를 max(case) 함수로 진행한다.
- 굳이 max를 쓰는 이유는 row_num 그룹에는 서로 다른 직업을 가진 데이터들이 있긴 하지만 sql이 어떤 값 하나만 선택해야한다는 보장이 없다.
- group by 를 하면 집계함수가 필요하다
- max()는 null을 제외한 값 중 하나를 선택하게 만들어서 각 직업별로 딱 하나씩만 남게된다.
'일일 문제 풀이 > HackerRank' 카테고리의 다른 글
[SQL] 해커랭크 HackerRank New Companies 문제 풀이 (0) | 2025.03.15 |
---|---|
[SQL] 해커랭크 HackerRank Binary Tree Nodes 문제 풀이 (0) | 2025.03.14 |
[SQL] 해커랭크 HackerRank The PADS 문제 풀이 (0) | 2025.03.12 |
[SQL] 해커랭크 HackerRank 문제 풀이 Type of Triangle - Advanced Select (0) | 2025.03.11 |
[SQL] 해커랭크 HackerRank 문제 풀이 Employee Salaries (0) | 2025.03.10 |