SQL - pivot, 그룹별 순위(case when)

항니·2022년 3월 19일
0


https://www.hackerrank.com/challenges/occupations/problem
➡️ 해커랭크 문제

https://techblog-history-younghunjo1.tistory.com/159
➡️ 참고한 블로그

sql로 서브쿼리 정도는 만들어봤어도 좀 더 상위 호환 느낌인 피벗테이블은 sql에서 만들어본 적이 없었는데, 오늘 이런 유형의 문제는 처음 접하게 되어서 많이 새롭고 당황스러웠지만, 그래도 이렇게 또 하나 배웠음에 의의를,,,✨


이왕 시작한김에, film 테이블 데이터를 가지고 좀 더 심화학습을 해보기로 했는데요.
저는 맥북 유저라 SQLGate 홈페이지에서 mysql을 다운/실행할 수가 없어서
밑져야 본전이라며 그냥 한번 접속해봤는데 접속이 됐습니다!ㅋㅋㅋ 와우🤭
역시 짬바가 좀 다져진걸까요~.~
(출처: https://m.blog.naver.com/sqlgate/221331409404)

이거 보고 평소 AWS database 접속하듯이 그대로 응용했더니 성공!!

반가운 Welcome to the MySQL~
입문자를 위한 샘플 제공 데이터 베이스라고 합니다.

23개의 테이블 중 오늘 사용할 것은 film테이블입니다.

desc film;

어떻게 생겼는지 확인.

select * from film limit 5;

이 film 데이터로 해보고 싶은 것은,
G, PG, R 등으로 나타난 영화 등급(rating)을 각각의 열로 구분해서, 즉 피벗테이블을 만들어서 각 등급별 대여료(release_year)가 높은 순서대로 영화제목(title)을 출력하는 것입니다.

  • n번째 행에는 그 등급에서 n번째로 대여료가 높은 영화가 출력되도록 합니다.
  • 대여료가 같을 때는 알파벳 순으로 출력하며, null값은 0으로 대체합니다.

먼저 각 등급별 index 수를 세기 위해 변수를 설정해줍니다.

set @r1=0, @r2=0, @r3=0, @r4=0, @r5=0;

이것을 mysql에서 구현하기 위해 case when 문을 사용하였습니다.

CASE
	WHEN 조건
	THEN '반환값'
	ELSE 'WHEN 조건에 해당하지 않을 때 반환 값'
END
select max(G) as 'G', max(PG) as 'PG', max(PG_13) as 'PG-13', max(R) as 'R',max(NC_17) as 'NC-17'
from (select case when rating = 'G' Then title else 0 END AS G,
case when rating ='PG' then title else 0 END as PG,
case when rating = 'PG-13' then title else 0 END as PG_13,
case when rating = 'R' then title else 0 END as R,
case when rating = 'NC-17' then title else 0 END as NC_17,
case when rating = 'G' then (@r1:=@r1+1)
when rating = 'PG' then (@r2:=@r2+1)
when rating = 'PG-13' then (@r3:=@r3+1)
when rating = 'R' then (@r4:=@r4+1)
when rating = 'NC-17' then (@r5:=@r5+1)
END as RowNumber
from film
order by rental_rate desc, title) sub
group by RowNumber;

from절의 서브쿼리에서 case-when 문을 이용해 로우넘버가 추가된 테이블을 만들고 대여료(내림차순)와 제목 순으로 정렬하여 출력하였습니다.

얼핏봐선 알파벳순 정렬과 비슷해보여 대여료 순으로 정렬된 것인지 확인해보았습니다.

맞는 것 같습니다ㅋㅋㅋ
휴,,, sql의 세계도 참으로 넓고 깊네요...!


그래도 판다스로만 만들어봤던 피벗테이블을 sql로 만들어보니 신기하고, 뿌듯합니다.

할 줄 아는 것이 하나 늘었습니다🤓👍

profile
3D 모델 플랫폼에서 데이터 분석을 하고 있습니다

0개의 댓글