본문 바로가기
SQL/MySQL

[MySQL] HackerRank - Occupations 문제 풀이

by 취준생 져니 2024. 8. 30.

문제 사이트

아래 문제는 해커랭크에서 추출해온 문제입니다. 문제의 저작권은 해커랭크에 있으며 문제를 풀어보시려면 아래 링크를 클릭해주세요 🙂


 

Occupations | HackerRank

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

www.hackerrank.com

 

 

 

 

 

 

 

👉문제 설명

 

 

 

  • column은 Doctor, Professor, Singer, and Actor 순으로 분류
    아래에는 직업에 해당하는 이름을 알파벳 순으로 정렬하고, 직업에 해당하는 이름이 더 이상 없을 때는 NULL 출력

 

 

 

👉문제 풀이

시작부터 어떻게 해야하는지 감이 오지 않는다,, 큰일이다

일단 조건부터 입력을 하면

 

1. 컬럼의 headers는 Doctor, Professor, Singer, Actor 순

2. 더이상 출력될 이름이 없으면 NULL 이라고 출력

 

 

 

👉문제 풀이 과정

1. 직업별로 나눈 후 이름순으로 순서 지정

select *,
    row_number() over (partition by occupation order by name)
from occupations

 

 

 

 

  • partition을 활용해 직업별로 이름순으로 순서를 지정해줌
  • 나온 결과로는 Actor가 직업인 사람은 Eve, Jennifer, Ketty, Samantha 총 4명
  • 위의 결과에서 이름만을 출력해서 세로로 줄세우면 답이 나올 거 같음

 

2. 직업별로 분류, 줄세우기

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 occupations

 

  •  occupation에 따른 결과값을 출력해야 하므로 case when절 사용
  • Ashley는 직업이 Professor 여서 doctor, singer, actor에서는 NULL값이 출력되고 professor부분에서만 이름이 출력되는 것을 확인할 수 있음

 

 

위 두개를 합하여

 

👉최종 답안

select
    max(case when occupation = "DOCTOR" then name else null end),
    max(case when occupation = "PROFESSOR" then name else null end),
    max(case when occupation = "SINGER" then name else null end),
    max(case when occupation = "ACTOR" then name else null end)
from (select *,
    row_number() over (partition by occupation order by name) rn
    from occupations) as part
group by part.rn

 

  • group by를 해준 이유 : 순서가 1인 아이들부터 출력이 되서 select문이 돌아감
  • EX) rn이 1인 Eve, Amina, Ashely, Christeen이 먼저 select문에 들어가게 되고 case when문을 거쳐 해당하는 직업 블럭에 들어가 name이 출력된다
  • max를 한 이유 : 한 행에 rn이 1인 이름들을 출력하기 위해 group by를 사용했지만 group by가 돌아가기 위해서는 select문에 집계함수가 있어야 함. name은 문자열이기 때문에 MAX 집계함수에 영향을 받지 않아 MAX를 사용, (MIN을 써도 됨)
  • 서브쿼리를 사용할 때는 '(as) 이름' 을 꼭 해주어야 한다! 안 그러면 오류남

 

 

 

 

👉고찰

partition이나 row_number를 자주 사용 안 하다보니 이런 문제가 나오면 머리가 굳어버리는 거 같다,,

다양한 문제를 풀어볼 필요를 느꼈음