ORACLE PIVOT
PIVOT 기능은 11g부터 사용가능하다.
이하버전은 DECODE 이용하여 ROW 을 컬럼으로 변경하는 작업을 했다.
PIVOT 를 이용하면 DECODE 의 복잡하고 비직관적인 코드를 좀더 직관적으로 작성할 수 있다.
주의할점 !
PIVOT 사용시 해당하는 컬럼을 미리 정의해야된다.
상황에 따라 DECODE , PIVOT 사용한다.
예제 !
가상테이블 이용해 2017년 DATE 구하여 PIVOT,DECODE을 각각 사용하여 요일갯수 SUM 해봄.
* 가상테이블
WITH TEMP_TABLE AS (
SELECT (TO_DATE('20140101','YYYYMMDD') + LEVEL-1) DTE
FROM DUAL
CONNECT BY LEVEL-1 <= TO_DATE('20171231','YYYYMMDD') - TO_DATE('20170101','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
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;
* 결과값 !
MON 일 월 화 수 목 금 토
01월 4 4 4 5 5 5 4
02월 4 4 4 4 4 4 4
03월 5 5 4 4 4 4 5
04월 4 4 5 5 4 4 4
05월 4 4 4 4 5 5 5
06월 5 5 4 4 4 4 4
07월 4 4 5 5 5 4 4
08월 5 4 4 4 4 5 5
09월 4 5 5 4 4 4 4
10월 4 4 4 5 5 5 4
11월 5 4 4 4 4 4 5
12월 4 5 5 5 4 4 4
'DB > ORACLE' 카테고리의 다른 글
ROLLUP - 소계,합계 구하기 (0) | 2017.05.19 |
---|---|
oracle sequence 생성,조회 (0) | 2017.03.17 |
oracle index (0) | 2017.01.19 |
ALTER TABLE (0) | 2016.11.28 |