SQL/HackerRank

HackerRank | Occupations (sql에서 pivot하기)

kimmalgu 2024. 9. 30. 22:04

문제

데이터를 피벗(Pivot)하여 각 직업(Doctor, Professor, Singer, Actor)별로 이름을 알파벳순으로 정렬하고, 각 직업에 해당하는 이름을 출력해야 합니다. 각 직업별로 가장 많은 이름이 포함된 직업에 맞춰 빈 칸은 NULL로 채웁니다.

 

풀이

FROM에서 occupation을 대상으로 name별로 오름차순 정렬한 row_number를 생성한 서브쿼리 작성

 

SELECT에서 CASE WHEN으로 직업별로 이름 출력하게 작성 

※ 쿼리에서는 ROW_NUMBER()를 사용하여 각 직업별로 행 번호를 부여하고, 그 번호를 기준으로 *그룹화(GROUP BY)*하여 결과를 생성합니다. 이 과정에서 각 직업별로 CASE 문을 사용하여 각 행에서 해당 직업에 해당하는 이름을 가져오는데, 각 그룹에서 이름을 하나만 반환해야 합니다.

※ GROUP BY를 사용할 때, 각 그룹에서 반환할 값을 명확히 정의하지 않으면 에러가 발생!

 

GROUP BY에서 서브쿼리의 row_num으로 그룹화

 

ORDER BY에서 row_num 오름차순 정렬

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 (
    SELECT name, occupation,
           ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) AS row_num
    FROM OCCUPATIONS
) AS subquery
GROUP BY row_num
ORDER BY row_num;