문제
데이터를 피벗(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;
'SQL > HackerRank' 카테고리의 다른 글
HackerRank | Draw The Triangle 1 (재귀적CTE) (0) | 2024.10.26 |
---|---|
HackerRank | Higher Than 75 Marks (0) | 2024.10.12 |
HackerRank | Draw The Triangle 2 (재귀적CTE) (0) | 2024.10.05 |
HackerRank | Weather Observation Station 20 (sql로 중위수 구하기) (1) | 2024.09.30 |