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