Occupations

1. Occupations

A. 📜 문제

트랜잭션 테이블(행방향으로 증가하는 테이블)을 크로스 테이블(열방향으로 증가하는 테이블)로 만드는 크로스 집계를 하시오.

B. 💡 내 답안

a. 😅 1차 시도 (실패후 성공)

SELECT Doctor, Professor, Singer, Actor
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) AS A, name, occupation
    FROM OCCUPATIONS
)
PIVOT
(
    MAX(name)
    FOR occupation IN ('Doctor' AS Doctor,
                       'Professor' AS Professor,
                       'Singer' AS Singer,
                       'Actor' AS Actor)
)
ORDER BY A ASC;

b. 😊 2차 시도 (성공)

SELECT MAX(DECODE(occupation, 'Doctor', name)) AS Doctor,
        MAX(DECODE(occupation, 'Professor', name)) AS Professor,
        MAX(DECODE(occupation, 'Singer', name)) AS Singer,
        MAX(DECODE(occupation, 'Actor', name)) AS Actor
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) AS rank, name, occupation
    FROM OCCUPATIONS
)
GROUP BY rank
ORDER BY rank ASC;

c. 😊 3차 시도 (성공)

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 (
    SELECT ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name) AS rank, name, occupation
    FROM OCCUPATIONS
)
GROUP BY rank
ORDER BY rank ASC;

a. 🙄 회고

내 풀이

  • Partition by를 이용하여 공통 rank를 만들고, rank로 group by한다.

결론

어제 잠자면서 partition by를 생각했는데, 어떻게 쓰는 것이였는지 기억이 안났다. 그래서 오늘 아침에 찾아봤는데, 바로 이런 문제를 만날줄이야..

C. 🧐 문제 해설

이해한 내용을 바탕으로 작성했습니다.

a. 1차 시도

오라클 11 이후부터는 PIVOT함수가 있는 것을 알았다. 다만 그렇게 풀고 싶지 않았다. 그래서 DECODE를 사용해서 풀었는데, 전혀 감을 못잡겠더라.

그래서 PIVOT 함수로 풀었다.

우선, PARTITION BY 구문에서 직업별로 그룹을 만든다. 그리고 이름 순서로 중복없는 번호를 매긴다. 그 값을 Doctor, Professor, Singer, Actor 순서로 PIVOT하고 컬럼을 호출한다. MAX(name)은 name값이 있으면 name을 없으면 NULL을 입력한다.

b. 2차 시도

PARTITION BY 구문까지는 똑같다. 다만, rank로 group을 만들고 해당 group에서 Doctor, Professor, Singer, Actor를 추출했다. 여기서도 MAX를 사용하여 해당하는 값이 없으면 NULL이 반환된다.

마지막에 rank로 정렬하면 완성.

c. 3차 시도

DECODE와 CASE는 서로 변경할 수 있다. CASE문은 조건문과 반환, 끝이 어디인지 확실하게 알 수 있어서 더 가독성이 높은 것 같다.

참고문헌

Occupations | HackerRank. HackerRank. (accessed Dec 29, 2021)

이 글이 도움이 되었나요?

0 minutes ago
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.