출처
문제
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.
문제에 대한 해석
- Doctor, Professor, Singer, Actor 순으로 컬럼 지정
- 해당 직업에 포함된 이름 열로 알파벳순으로 나열
- 빈곳은 NULL
- PIVOT : 행을 직업 종류 열에 순서 값에는 이름
- row_number :직업별로 이름의 순서를 작성
- PIVOT > caew when 통해 직업별 행과 값에 이름을 저장
- group by : row_number별로 그룹화
|
순서(생략) | 직업1 | 직업1 | 직업3 | 직업4 |
1 | 이름 | 이름 | 이름 | 이름 | |
2 | 이름 | 이름 | 이름 | 이름 |
풀이(MYSQL)
-- 오답
SELECT
CASE WHEN occupation = 'Doctor' THEN name END AS Doctor,
CASE WHEN occupation = 'Professor' THEN name END AS Professor,
CASE WHEN occupation = 'Singer' THEN name END AS Singer,
CASE WHEN occupation = 'Actor' THEN name END AS Actor
FROM OCCUPATIONS
-- 정답
WITH tmp AS (
SELECT name, occupation, ROW_NUMBER() OVER(PARTITION BY occupation order by name) as rn
FROM OCCUPATIONS
)
SELECT
max(CASE WHEN occupation = 'Doctor' THEN name END) AS Doctor,
max(CASE WHEN occupation = 'Professor' THEN name END) AS Professor,
max( CASE WHEN occupation = 'Singer' THEN name END) AS Singer,
max(CASE WHEN occupation = 'Actor' THEN name END) AS Actor
FROM tmp
GROUP BY rn
오답 | 정답 |
첫행부터 이름이 있아야 함 |
작동순서
💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환
- with 절: OCCUPATIONS 테이블에서
- name, occupation과 occupation별로 name의 순서를 작성(컬럼명 rn)하여 조회
-
- GROUP BY 절: rn을 기준으로 그룹화 > actor에서 1번,doctor 1번, professor1번 끼리 그룹화
- SELECT 절: occupation 에서 'Doctor'일 경우 NAME조회, occupation 에서 ' Professor'일 경우 NAME조회, occupation 에서 ' Singer'일 경우 NAME조회, occupation 에서 ' Actor'일 경우 NAME조회
* 집계함수를 사용하지 않을 경우 그룹화가 불가능하므로, MAX함수(의미X) 사용
그룹화 하지 않은 경우 | 순서에 따른 그룹화 |
다른사람 풀이
https://techblog-history-younghunjo1.tistory.com/159
배운점
1) ROW_NUMBER() : PARTITION BY 절을 사용하여 그룹화된 데이터에 대해 각 그룹별로 순차적인 번호를 부여
2) 사용자변수는 아직 어렵다..
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Hacker Rank - The Blunder (0) | 2024.06.07 |
---|---|
[문제풀이] Hacker Rank - Top Earners (0) | 2024.06.07 |
[문제풀이] Hacker Rank - Type of Triangle (0) | 2024.06.05 |
[문제풀이] Hacker Rank - 나머지 구하기 (0) | 2024.06.04 |
[문제풀이] Hacker Rank - THE PADS (0) | 2024.06.04 |