오라클 11g부터 pivot 기능을 제공합니다.
기존 이하버전에서는 decode를 이용하여 로우를 컬럼으로 변경하는 작업을 하였습니다.
pivot 기능을 이용하면 decode의 복잡하고 비직관적인 코드를 조금 더 직관적으로 작성할 수 있습니다.
아쉬운 접은 pivot 기능을 사용하더라도 pivot을 할 컬럼을 미리 정의를 해 놓아야 한다는 점이다.
상황에 맞게 pivot를 사용할지 decode를 사용할지 결정해서 사용하면 될꺼 같습니다.
아래는 예저는 Pivot을 이용하여 2014년1월부터 12월까지 월별 요일건수 산출하는 쿼리입니다.
[PIVOT을 이용한 예제]
--가상테이블(2014년 모든일자)
WITH TEMP_TABLE AS (
SELECT (TO_DATE('20140101','YYYYMMDD') + LEVEL-1) DTE
FROM DUAL
CONNECT BY LEVEL-1 <= TO_DATE('20141231','YYYYMMDD') - TO_DATE('20140101','YYYYMMDD')
)
--월별 요일건수 (PIVOT 이용)
SELECT *
FROM (
SELECT to_char(DTE,'MM') || '월' MON
, decode(to_char(DTE,'D'),'1','일','2','월','3','화','4','수','5','목','6','금','7','토') WEEK
, DTE
FROM TEMP_TABLE
)
PIVOT
(
COUNT(DTE)
FOR WEEK IN ('일','월','화','수','목','금','토')
)
ORDER BY MON
[DECODE를 이용한 쿼리]
--가상테이블(2014년 모든일자)
WITH TEMP_TABLE AS (
SELECT (TO_DATE('20140101','YYYYMMDD') + LEVEL-1) DTE
FROM DUAL
CONNECT BY LEVEL-1 <= TO_DATE('20141231','YYYYMMDD') - TO_DATE('20140101','YYYYMMDD')
)
--월별 요일건수 (DECODE 이용)
SELECT to_char(DTE,'MM') || '월' MON
, sum(decode(to_char(DTE,'D'),'1',1,0)) "일"
, sum(decode(to_char(DTE,'D'),'2',1,0)) "월"
, sum(decode(to_char(DTE,'D'),'3',1,0)) "화"
, sum(decode(to_char(DTE,'D'),'4',1,0)) "수"
, sum(decode(to_char(DTE,'D'),'5',1,0)) "목"
, sum(decode(to_char(DTE,'D'),'6',1,0)) "금"
, sum(decode(to_char(DTE,'D'),'7',1,0)) "토"
FROM TEMP_TABLE
GROUP BY to_char(DTE,'MM')
ORDER BY MON