본 내용은 데이터리안 '데이터 분석을 위한 고급 SQL 문제풀이'을 수강하며 작성한 내용입니다.
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.
Input Format
The OCCUPATIONS table is described as follows:
Occupation will only contain one of the following values: Doctor, Professor, Singer or Actor.
나의 풀이과정
: 피봇 테이블 만드는 법을 까먹었다!!!
선생님 풀이
SELECT MIN(CASE WHEN occupation = 'Doctor' THEN Name ELSE NULL END) doctor
, MIN(CASE WHEN occupation = 'Professor' THEN Name ELSE NULL END) professor
, MIN(CASE WHEN occupation = 'Singer' THEN Name ELSE NULL END) singer
, MIN(CASE WHEN occupation = 'Actor' THEN Name ELSE NULL END) actor
FROM (
SELECT occupation
, name
, ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) rn
FROM Occupations
) t
GROUP BY rn
ORDER BY rn
이 SQL 쿼리는 CASE 문을 사용하여 피봇 기능을 수행하고 있습니다. 각각의 MIN(CASE WHEN ...) 절은 특정 직업(Doctor, Professor, Singer, Actor)에 따라서 피봇을 수행하고 해당하는 이름(Name)을 가져오고 있습니다.
피봇 기능은 원래 데이터의 행을 열로 변환하는 것을 의미합니다. 각 직업에 대한 열을 만들기 위해 CASE 문이 사용되었고, MIN 함수는 해당 직업에 속하는 이름 중 가장 작은 값을 선택합니다.
SELECT ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) rn