본문 바로가기

카테고리 없음

[해커랭크] [SQL] Occupations

Occupations | HackerRank

 

Occupations | HackerRank

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

www.hackerrank.com

Sample Output

Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria

Doctor, Singer, Professor, Actor 순서대로 출력하는 문제

알파벳 순서대로 출력하며, 각 직업 중 최대 건수보다 적으면 null 값이 출력되어야한다. 

 

이번 문제는 어려웠다.

 

GROUP BY를 rank별로 출력할 생각을 못했다.

 

 

처음엔 oracle pivot으로 하려고 했으나 pivot 함수는 한 row만 출력이 되므로 안되었다.

 

mysql의 CASE WHEN을 사용했으나 에러 . 

# 오류 
WITH rank_table AS (
SELECT Name, Occupation, RANK() OVER (PARTITION BY OCCUPATION ORDER BY Name ASC) as ranking
FROM OCCUPATIONS 

)
SELECT CASE WHEN OCCUPATION='Doctor' THEN Name END as doctors
     , CASE WHEN OCCUPATION='Professor' THEN Name END  as Professors
     , CASE WHEN OCCUPATION='Singer' THEN Name END  as Singers
     , CASE WHEN OCCUPATION='Actor' THEN Name END  as Actors
FROM rank_table 
ORDER BY ranking <= max(ranking)

 

rank를 만들어 rank 순으로 그룹바이를 해주고, 거기에 맞게 case when 에 max를 사용하여 집계함수를 사용하여 출력되도록 함 

가장 중요한 건 그룹바이를 rank로 해주는 것

WITH rank_table AS (
SELECT Name, Occupation, RANK() OVER (PARTITION BY OCCUPATION ORDER BY Name ASC) as ranking
FROM OCCUPATIONS 

)
SELECT MAX(CASE WHEN OCCUPATION='Doctor' THEN Name END) as doctors
     , MAX(CASE WHEN OCCUPATION='Professor' THEN Name END)  as Professors
     , MAX(CASE WHEN OCCUPATION='Singer' THEN Name END)  as Singers
     , MAX(CASE WHEN OCCUPATION='Actor' THEN Name END)  as Actors
FROM rank_table 
GROUP BY ranking