섭섭의 공부/SQL

[22.01.15] HackerRank 문제 풀이

seobbseob 2022. 1. 15. 13:33

Occupations

set @D=0, @A=0, @S=0, @P=0; 

select min(sub.c1),min(sub.c2),min(sub.c3),min(sub.c4)
from
(select
       case when Occupation = 'Doctor' then name end as c1,
       case when Occupation = 'Professor' then name end as c2,
       case when Occupation = 'Singer' then name end as c3,
       case when Occupation = 'Actor' then name end as c4,
       case
            when Occupation = 'Doctor' then (@D:=@D+1)
            when Occupation = 'Actor' then (@A:=@A+1)
            when Occupation = 'Singer' then (@S:=@S+1)
            when Occupation = 'Professor' then (@P:=@P+1)
        end as num
from occupations
order by name) sub
group by sub.num

안 그래도 피봇에 대해서 어려워했는데, 이 문제는 많이 어려웠다.

@로 변수를 만들 수 있는 것도 처음 알았다.

 

서브 쿼리의 Case when Occupation ~ then name end as ~ 에서는 각 직업의 열을 만들고 그 값으로 name을 넣는다.

그리고 그 다음 case문이 중요한데, 문제의 아웃풋을 보면 한 행에 각 직업을 가진 사람들의 이름이 알파벳 순서대로 나온다. 그래서 각 직업별로 (@D:=@D+1)을 사용해서 몇 번째 행에 이 이름이 나올 것인지를 입력한다. 그래서 order by name을 함께 써야 한다.

 

그 이후 바깥 쿼리에서 sub.num으로 각 행의 인덱스에 맞춰서 name을 select 해주면 되는데, group by를 사용하며 이때 select 뒤에는 집계 함수가 들어가야 한다. 그래서 알파벳 순으로 제일 앞에 있는 값을 출력하는 min을 사용한다.

 

피봇을 실무에서 많이 쓰는지는 모르겠는데, 피봇을 쓸 일이 생기면 애를 많이 먹을 것 같다.

기억해둬야겠다.

 

Binary Tree Nodes

select t1.N,
       case when inx = 1 then 'Root'
            when inx = 2 then 'Inner'
            when inx = 3 then 'Leaf'
        end
from(
select N,
       case when P is null then 1
            when N in (select distinct P from BST) then 2
            else 3
            end as inx
from BST) t1
order by t1.N

복잡해 보일수록 쉬운 방법이 존재한다.

간단하게 생각하자.

 

(문제 출처 - https://www.hackerrank.com/domains/sql)