인프런- 데이터 분석을 위한 고급 SQL 문제풀이 : 섹션 1 - Occupations(틀림)

르네·2023년 10월 11일
0

SQL

목록 보기
43/63
본 내용은 데이터리안 '데이터 분석을 위한 고급 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 함수는 해당 직업에 속하는 이름 중 가장 작은 값을 선택합니다.

배운점

  • 순위 정하기 -> WINDOW 함수 ROW_NUMBER()활용
SELECT ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) rn
  • 피봇 기능은 데이터의 행을 열로 변화하는 것. 피봇 테이블은 CASE문을 활용해 만들 수 있다.
  • AGGREGATION 함수는 NULL값은 다 무시한다. 그래서 위의 풀이에서 MIN 대신 MAX를 써도 똑같은 답이 도출된다.
profile
데이터분석 공부로그

0개의 댓글