STUDY_SEONMIN
HackerRank SQL - Occupations 본문
해커랭크에서 문제를 풀다가 피봇 테이블을 만드는 문제를 만났습니다.

위와 같은 테이블이 주어졌을 때 아래와 같은 결과를 만드는 문제였습니다.

아웃풋 결과를 보면 피봇 테이블의 컬럼은 각각 Doctor, Professor, Singer, Actor 입니다.
그렇다면 행 레이블은 무엇일까요??
해커랭크에서 문제를 읽어보면 이름은 알파벳 순서로 정렬이 되어야 한다고 나와있습니다. 이를 토대로 생각해본다면 행 레이블은 각 직업 내에서 해당 이름이 몇 번째 순서인지를 의미한다는 것을 알 수 있습니다.
직업별 이름 순서를 먼저 표현하기 위해서 ROW_NUMBER()를 사용해주었습니다.
SELECT NAME, OCCUPATION, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS "RNUM"
FROM OCCUPATIONS;
쿼리를 실행하면 결과가 다음과 같이 나옵니다.
NAME | OCCUPATION | RNUM |
Jane | Actor | 1 |
Julia | Actor | 2 |
Maria | Actor | 3 |
Jenny | Doctor | 1 |
Samantha | Doctor | 2 |
Ashley | Professor | 1 |
Christeen | Professor | 2 |
Ketty | Professor | 3 |
Meera | Singer | 1 |
Priya | Singer | 2 |
이 테이블을 피봇 테이블로 만드는 과정에서 행레이블이 RNUM이 되어야 하기 때문에 RNUM으로 GROUP BY를 해주어야 합니다.
그룹으로 묶어준 다음 원하는 결과물이 나오기 위해서 어떻게 해야되는지는 데이터를 살펴보면서 이야기하겠습니다.
RNUM = 1 인 데이터는 Jane Actor, Jenny Doctor, Ashley Professor, Meera Singer 가 있습니다.
최종 결과물의 첫 번째 컬럼인 'Doctor'컬럼을 살펴보겠습니다.
IF(OCCUPATION='Doctor', NAME, NULL) AS "Doctor"
이렇게 쿼리를 사용하게 되면 집계함수가 쓰이지 않았기에 오류가 나지만 어떤 데이터 집합일지 생각해보면 NULL, Jenny, NULL, NULL 과 같은 데이터 집합임을 알 수 있습니다.
NULL은 어떤 값보다도 크기 때문에 MIN() 집계함수를 사용하면 우리가 원하는 Jenny를 추출해낼 수 있습니다.
또한 RNUM=3의 경우 데이터가 Ketty Professor, Maria Actor 밖에 없으므로
IF(OCCUPATION='Doctor', NAME, NULL) AS "Doctor"
이 쿼리를 사용하게 되면 데이터 집합이 NULL, NULL이 됩니다. 이 중에서 NULL 하나만 뽑는 것도 역시 MIN() 집계함수를 사용하면 됩니다.
지금까지 생각한 내용들을 하나로 정리해 쿼리를 작성해보겠습니다.
SELECT
MIN(IF(T.OCCUPATION='Doctor', NAME, NULL)) AS "Doctor",
MIN(IF(T.OCCUPATION='Professor', NAME, NULL)) AS "Professor",
MIN(IF(T.OCCUPATION='Singer', NAME, NULL)) AS "Singer",
MIN(IF(T.OCCUPATION='Actor', NAME, NULL)) AS "Actor"
FROM(
SELECT NAME, OCCUPATION, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS "RNUM"
FROM OCCUPATIONS) AS T
GROUP BY T.RNUM;
위 쿼리문을 사용해서 실제로 우리가 원했던 결과를 얻어 문제를 통과했습니다 :)

'STUDY > SQL' 카테고리의 다른 글
MEDIAN 찾기 (0) | 2021.07.22 |
---|---|
SQLD 시험 후기 (0) | 2021.06.25 |
SELECT FROM tables (0) | 2021.04.19 |
SELF JOIN (0) | 2021.04.17 |
집계함수의 사용 (0) | 2021.04.16 |