2024. 11. 20. 14:31ㆍOracle
[문제 및 예시 ]
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.
Sample Input

Sample Output
Jenny Ashley Meera Jane
Samantha Christeen Priya Julia
NULL Ketty NULL Maria
Explanation
The first column is an alphabetically ordered list of Doctor names.
The second column is an alphabetically ordered list of Professor names.
The third column is an alphabetically ordered list of Singer names.
The fourth column is an alphabetically ordered list of Actor names.
The empty cell data for columns with less than the maximum number of names per occupation (in this case, the Professor and Actor columns) are filled with NULL values.
문제를 어떻게 해야 제대로 옮길 수 있는지 모르겠다..
일단 Occupation 별로 분류하고, 이름의 순서대로 번호를 매기고
pivot 함수를 사용하여 행과 열을 전환시켜주면 되는 문제다.
처음부터 다하려고 하지 말고, 차근차근 시도해봐야겠다.
우선, 그룹별로 이름 오름차순 후 번호를 매기는 서브 쿼리를 만들어준다.
SELECT Name, Occupation,
ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS OCC_RANK
FROM OCCUPATIONS;
출력 결과
이름/직업/직업별 번호
Your Output (stdout) Eve Actor 1 Jennifer Actor 2 Ketty Actor 3 Samantha Actor 4 Aamina Doctor 1 Julia Doctor 2 Priya Doctor 3 Ashley Professor 1 Belvet Professor 2 Britney Professor 3 Maria Professor 4 Meera Professor 5 Naomi Professor 6 |
이제 PIVOT을 사용하여 행과 열을 바꾸고 직업별 이름을 정렬해주면 된다
SELECT Doctor, Professor, Singer, Actor
FROM (
SELECT Name, Occupation,
ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS OCC_RANK
FROM OCCUPATIONS)
PIVOT (MAX(Name)
FOR Occupation IN ('Doctor' AS Doctor,
'Professor' AS Professor,
'Singer' AS Singer,
'Actor' AS Actor))
ORDER BY OCC_RANK;
PIVOT 사용법
SELECT * FROM ( 피벗 대상 쿼리문 ) PIVOT ( 그룹합수(집계컬럼) FOR 피벗컬럼 IN (피벗컬럼값 AS 별칭 ... ) |
PIVOT에서 (각 행과 열의) 값으로 들어갈 집계 함수를 먼저 기재해주고
FOR 뒤의 열을 만들어주려고 추출해온 열의 이름을 써줍니다
IN 에서 피벗컬럼의 각 값을 기재해주고, AS로 치환한 값을 SELECT 뒤에 써줍니다.
말로 하니 어려울거같아 예시를 보여드리려고 합니다.
SELECT Doctor, Professor, Singer, Actor
FROM ( -- 여기부터 서브쿼리
SELECT Name, Occupation,
ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS OCC_RANK
FROM OCCUPATIONS)
PIVOT (MIN(Name) -- PIVOT 가장 처음에 집계함수 즉, 값으로 사용될 인자를 넣어줌
FOR Occupation IN ('Doctor' AS Doctor, 'Professor' AS Professor,
'Singer' AS Singer, 'Actor' AS Actor))
-- 각 열에 대해 서술
ORDER BY OCC_RANK; -- 정렬 조건, 이미 Name은 집계 함수에서 사용되었기 때문에 사용 불가
집계함수는 문자열이고, 유일한 값이기때문에 MIN이나 MAX중 편한걸 사용하면 된다.
'Oracle' 카테고리의 다른 글
HackerRank - Weather Observation Station 15 (1) | 2024.12.18 |
---|---|
[HackerRank] Oracle - New Companies (1) | 2024.11.21 |
[HackerRank] Oracle - Binary Tree Nodes (0) | 2024.11.20 |