본문 바로가기
TIL - 프로그래밍/SQL

[해커랭크] Occupations - MySQL

by chaemj97 2023. 7. 11.
728x90

https://www.hackerrank.com/challenges/occupations/problem?isFullScreen=true 

 

Occupations | HackerRank

Pivot the Occupation column so the Name of each person in OCCUPATIONS is displayed underneath their respective Occupation.

www.hackerrank.com


  • 문제
    • Doctor, Professor, Singer, and Actor에 해당하는 사람의 이름을 각 컬럼으로 출력하라
      • 없으면 NULL
    • 이름은 순서대로

 

  • 풀이

각 직업별 이름 순위 구하기 -> 윈도우 함수 ROW_NUMBER() 사용

SELECT Occupation
     , Name
     , ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS R
FROM OCCUPATIONS;

Doctor, Professor, Singer, Actor 각 직업에 해당하면 이름, 아니면 NULL -> CASE 문

SELECT CASE WHEN Occupation = 'Doctor' THEN Name ELSE NULL END
     , CASE WHEN Occupation = 'Professor' THEN Name ELSE NULL END
     , CASE WHEN Occupation = 'Singer' THEN Name ELSE NULL END
     , CASE WHEN Occupation = 'Actor' THEN Name ELSE NULL END
FROM (SELECT Occupation
            , Name
            , ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS R
      FROM OCCUPATIONS
) AS R_T;

순위가 같은 이름은 같은 행에 출력 되어야 한다. -> GROUP BY 순위

GROUP BY를 사용하기 위해서는 집계함수를 사용해야 한다.

값이 존재하지 않는다면 NULL 값으로 처리해주기 위해 MIN 사용(MIN이 아닌 다른 집계함수를 사용해도 결과 동일)

 

  • 정답 코드
SELECT MIN(CASE WHEN Occupation = 'Doctor' THEN Name ELSE NULL END)
     , MIN(CASE WHEN Occupation = 'Professor' THEN Name ELSE NULL END)
     , MIN(CASE WHEN Occupation = 'Singer' THEN Name ELSE NULL END)
     , MIN(CASE WHEN Occupation = 'Actor' THEN Name ELSE NULL END)
FROM (SELECT Occupation
            , Name
            , ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS R
      FROM OCCUPATIONS
) AS R_T
GROUP BY R;

728x90
반응형

댓글