728x90
https://www.hackerrank.com/challenges/occupations/problem?isFullScreen=true
- 문제
- Doctor, Professor, Singer, and Actor에 해당하는 사람의 이름을 각 컬럼으로 출력하라
- 없으면 NULL
- 이름은 순서대로
- Doctor, Professor, Singer, and Actor에 해당하는 사람의 이름을 각 컬럼으로 출력하라
- 풀이
각 직업별 이름 순위 구하기 -> 윈도우 함수 ROW_NUMBER() 사용
SELECT Occupation
, Name
, ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS R
FROM OCCUPATIONS;
Doctor, Professor, Singer, Actor 각 직업에 해당하면 이름, 아니면 NULL -> CASE 문
SELECT CASE WHEN Occupation = 'Doctor' THEN Name ELSE NULL END
, CASE WHEN Occupation = 'Professor' THEN Name ELSE NULL END
, CASE WHEN Occupation = 'Singer' THEN Name ELSE NULL END
, CASE WHEN Occupation = 'Actor' THEN Name ELSE NULL END
FROM (SELECT Occupation
, Name
, ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS R
FROM OCCUPATIONS
) AS R_T;
순위가 같은 이름은 같은 행에 출력 되어야 한다. -> GROUP BY 순위
GROUP BY를 사용하기 위해서는 집계함수를 사용해야 한다.
값이 존재하지 않는다면 NULL 값으로 처리해주기 위해 MIN 사용(MIN이 아닌 다른 집계함수를 사용해도 결과 동일)
- 정답 코드
SELECT MIN(CASE WHEN Occupation = 'Doctor' THEN Name ELSE NULL END)
, MIN(CASE WHEN Occupation = 'Professor' THEN Name ELSE NULL END)
, MIN(CASE WHEN Occupation = 'Singer' THEN Name ELSE NULL END)
, MIN(CASE WHEN Occupation = 'Actor' THEN Name ELSE NULL END)
FROM (SELECT Occupation
, Name
, ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS R
FROM OCCUPATIONS
) AS R_T
GROUP BY R;
728x90
반응형
'TIL - 프로그래밍 > SQL' 카테고리의 다른 글
[해커랭크] Weather Observation Station 20 - MySQL (0) | 2023.07.15 |
---|---|
[해커랭크] Ollivander's Inventory - MySQL (0) | 2023.07.14 |
[프로그래머스] LV4. 입양 시각 구하기(2) - MySQL (0) | 2023.07.11 |
[리트코드] 185. Department Top Three Salaries - MySQL (0) | 2023.07.09 |
[SQL] 누적합 구하는 3가지 방법 (0) | 2023.07.09 |
댓글