Occupations | HackerRank
Pivot the Occupation column so the Name of each person in OCCUPATIONS is displayed underneath their respective Occupation.
www.hackerrank.com
문제 설명
Pivot the Occupation column in OCCUPATIONS so that each Name is sorted alphabetically and displayed underneath its corresponding Occupation. The output column headers should be Doctor, Professor, Singer, and Actor, respectively.
Note: Print NULL when there are no more names corresponding to an occupation.
문제 풀이 및 함수 정리
1. PARTITION BY
- 특정 열을 기준으로 하여 데이터를 분할한 뒤, 소그룹 내에서 순위를 매긴다.
- 쿼리는 다음과 같다.
SELECT 칼럼명,
순위함수() OVER (PARTITION BY 그룹 분할의 기준이 되는 열 ORDER BY 순위 매기는 것에 기준이 되는 열)
FROM 테이블명
- 문제의 서브퀴리를 뜯어보자
SELECT *, ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME) RN
FROM OCCUPATIONS
순위 함수는 ROW_NUMBER()을 사용했다. 공동 순위를 무시하는 순위 함수 중 하나다.
OCCUPATION을 기준으로 그룹이 묶였고, 이름에 의해 그룹 내 순위가 매겨진 것을 확인할 수 있다.
2. GROUP BY
RN으로 GROUP BY를 하면 같은 순위가 매겨진 이름끼리 묶이게 된다.
RN으로 묶이는 것이 헷갈려서 SELECT절에 RN을 포함해 출력했다.
SELECT RN,
MIN(CASE WHEN OCCUPATION='Doctor' THEN NAME END) AS 'Doctor',
MIN(CASE WHEN OCCUPATION='Professor' THEN NAME END) AS 'Professor',
MIN(CASE WHEN OCCUPATION='Singer' THEN NAME END) AS 'Singer',
MIN(CASE WHEN OCCUPATION='Actor' THEN NAME END) AS 'Actor'
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME) RN
FROM OCCUPATIONS) temp
GROUP BY RN
* CASE WHEN절을 MIN으로 묶은 이유는 GROUP BY는 집계함수가 있어야 사용이 가능하기 때문이다.
NAME이 string이기 때문에 MIN, MAX 상관은 없다. 결국 이름을 출력하고 빈 셀에는 NULL이 출력된다.
< 정답 코드 >
SELECT
MIN(CASE WHEN OCCUPATION='Doctor' THEN NAME END) AS 'Doctor',
MIN(CASE WHEN OCCUPATION='Professor' THEN NAME END) AS 'Professor',
MIN(CASE WHEN OCCUPATION='Singer' THEN NAME END) AS 'Singer',
MIN(CASE WHEN OCCUPATION='Actor' THEN NAME END) AS 'Actor'
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME) RN
FROM OCCUPATIONS) temp
GROUP BY RN
'CODING TEST > SQL - 문제' 카테고리의 다른 글
[LEETCODE] 180. Consecutive Numbers - MySQL (0) | 2023.04.19 |
---|---|
[프로그래머스] 상품 별 오프라인 매출 구하기 / JOIN - MYSQL (0) | 2023.03.09 |
[LEETCODE] 184. Department Highest Salary - MySQL 풀이 (0) | 2023.02.14 |
[solvesql] 작품이 없는 작가 찾기 (0) | 2023.01.16 |
[프로그래머스] 조건에 맞는 도서 리스트 출력하기 - MySQL (0) | 2023.01.12 |