PIVOT 함수

피봇은 오라클에서 행을 열로 변환하는 함수 중 하나이다. 여러 카테고리의 데이터에서 집계화시킨 수치를 좀 더 직관적으로 확인할 수 있고, 데이터를 뿌려주기에도 편하다. 단점으로는 PIVOT 기능 사용 시 PIVOT을 할 컬럼을 미리 정의해 놓아야 한다는 것이다.

    SELECT *
    FROM ( 피벗 대상 쿼리문 )
    PIVOT ( 그룹합수(집계컬럼) FOR 피벗컬럼 IN (피벗컬럼값 AS 별칭 ... )

쿼리 연습 겸 사용한 테이블은 프로젝트 때 테스트용으로 만들어 놓은 테이블이다.

  • review 테이블에서 파생된 리뷰 + 리뷰포인트 테이블
    (한 리뷰 당 두 개의 리뷰포인트를 가질 수 있음)
REVIEW_NO REVIEW_POINT_TYPE_NO
리뷰번호 리뷰포인트 번호
  • 관람포인트 테이블
REVIEW_POINT_TYPE_NO REVIEW_POINT_TYPE_NAME
1 OST
2 연출
3 스토리
4 영상미
5 배우

group by로 데이터 추출

이 두 개의 테이블로 각 관림포인트마다 카운트를 셀 수 있는데, 첫 번째로 가장 쉬운 방법은 group by를 사용하는 것이다.

    SELECT 
        REVIEW_POINT_TYPE_NAME 관람포인트, COUNT(*)
    FROM 
        REVIEW_POINT P, REVIEW_POINT_TYPE T
    WHERE 
        P.REVIEW_POINT_TYPE_NO = T.REVIEW_POINT_TYPE_NO
    GROUP BY 
        REVIEW_POINT_TYPE_NAME;

결과물

관람포인트 COUNT(*)
OST 5
연출 1
스토리 3
영상미 1
배우 2

pivot으로 데이터 추출

    SELECT *
    FROM 
        (
        SELECT 
            T.REVIEW_POINT_TYPE_NAME
        FROM 
            REVIEW_POINT P, REVIEW_POINT_TYPE T
        WHERE P.REVIEW_POINT_TYPE_NO = T.REVIEW_POINT_TYPE_NO
        )
        PIVOT 
        (
            COUNT(*)
            FOR REVIEW_POINT_TYPE_NAME
            IN ('OST', '가나다', '연출', '스토리', '영상미', '배우')
        );

결과물

OST 가나다 연출 스토리 영상미 배우
5 0 1 3 1 2

결과 테이블을 확인해 보면, 컬럼 가나다의 값이 0으로 표시되어져 있는 것을 확인할 수 있다. 피벗 컬럼 값은 값이 존재하지 않더라도 해당 컬럼이 표시된다. 또, pivot 함수 사용 시 for 안에는 아래 사진과 같이 앞에 alias를 사용할 수 없으니 주의해야 한다.

image