꿈은 데이터분석가, 취미는 계획

[해커랭크: SQL] SQL로 피봇하기 본문

SQL/SQL문풀

[해커랭크: SQL] SQL로 피봇하기

data_2080 2025. 2. 7. 08:36
728x90

출처[해커랭] : Occupations

문제: occupation컬럼과 name컬럼을 사용하여, 직업별 컬럼을 생성하고 이름 순으로 조회 


ROW_NUMBER + PARTITION BY 활용

STEP 1

occupation별로 name의 알파벳순으로 순위부여

*ROW_NUMBER를 사용해야 동일 직업-동일 이름이더라도 다른 순위를 부여한다

SELECT occupation,
        name,
        ROW_NUMBER() OVER(PARTITION BY occupation ORDER BY name) AS num
FROM occupations

STEP 2

 

1) 직업별 순위를 부여한 쿼리를 서브쿼리로 FROM 절에서 사용
     *서브쿼리에 별칭을 반드시 지정해야 함.

2) CASE문을 사용하여 직업(occupation)별 컬럼을 생성하고, 해당 순위에 해당하는 이름을 표시
    *특정 직업에 해당하는 값이 없을 경우 NULL로 출력.

3) GROUP BY를 사용하여 동일한 순위(num)를 가진 행을 그룹화
    *CASE 문을 사용하여 직업별로 나눈 값을 MIN()으로 감싸서 그룹 내 최소값을 가져옴.

4) ORDER BY num을 사용하여 순위(num) 기준으로 오름차순 정렬

 

SELECT
    MIN(CASE WHEN occupation = 'Doctor' THEN name ELSE NULL END)    AS Doctor,
    MIN(CASE WHEN occupation = 'Professor' THEN name ELSE NULL END) AS Professor,
    MIN(CASE WHEN occupation = 'Singer' THEN name ELSE NULL END)    AS Singer,
    MIN(CASE WHEN occupation = 'Actor' THEN name ELSE NULL END)     AS Actor
FROM(SELECT occupation,
        name,
        ROW_NUMBER() OVER(PARTITION BY occupation ORDER BY name) AS num
    FROM occupations) n
GROUP BY num
ORDER BY num

728x90