PIVOT 사용

DB/ORACLE 2017. 1. 3. 22:33 |

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
Posted by 양승아
: