[DB] Oracle PIVOT 피벗 함수
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를 사용할 수 없으니 주의해야 한다.