[ Oracle - PIVOT  컬럼 목록 구하기 ]

 

-- 정의   : PIVOT()함수를 사용할때 컬럼갯수를 알아야만 한다.
--          결과 컬럼을 정의해 주지 않으면 PIVOT()함수를 사용할 수 없다.
--          
--          월갯수(from~to)를 알수 없을 경우에는 PIVOT()함수를 사용할 없게 된다.
--          
--          그런데, Dynamic SQL 문장을 사용하게 되면 SQL 문장을 작성할 때는 컬럼을 정의하지 않고
--          PIVOT()함수 정의 된 SQL 문장을 실행하기 전에  
--          월 갯수를 파악하여  PIVOT()함수에 추가한다.
--          (즉, myBatis 에서  FOR PLAN_YM IN ($COLUMN_LIST$)  와 같이 함)

 


SELECT
 (CASE WHEN GRP_ID   = '0' THEN PLAN_YM
             
WHEN MM_COUNT <  6  THEN '소계'
             
WHEN MM_COUNT =  6 AND FIRST_SECOND_TYPE = '0' THEN '상반기'
             
WHEN MM_COUNT =  6 AND FIRST_SECOND_TYPE = '1' THEN '하반기'
             
WHEN MM_COUNT = 12                             THEN '년계'
             
ELSE '총계' END) AS PLAN_YM
     , FIRST_SECOND_TYPE         
--0:상반기,  1:하반기
     , MM_COUNT                  
--1:Table 컬럼 sum()값.  2이상:소계, 합계 컬럼임
     , GRP_ID                    
--GROUPING_ID()함수 결과 값.
     , COL_ROWNUM                
--컬럼 ROWNUM
  
FROM
 (
        
SELECT YEAR_DATA
             , PLAN_YM
             , FIRST_SECOND_TYPE
             , 
COUNT(FIRST_SECOND_TYPE) AS MM_COUNT
             , 
GROUPING_ID(YEAR_DATA, FIRST_SECOND_TYPE, PLAN_YM) AS GRP_ID
          
FROM (
                --2013.10 ~ 201502 월까지 존재 하는 테이블일 경우
                
WITH YY_MM AS
                    ( 
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('201310', 'YYYYMM'), ROWNUM), 'YYYYMM') AS PLAN_YM
                        
FROM DUAL
                      CONNECT BY LEVEL <= 17 )
                
SELECT SUBSTR(B.PLAN_YM, 1,4)                   AS YEAR_DATA
                     , B.PLAN_YM                                
AS PLAN_YM
                     , 
FLOOR ((SUBSTR(B.PLAN_YM,5,2) - 1) / 6)  AS FIRST_SECOND_TYPE
                  
FROM YY_MM B
               )
        
GROUP BY ROLLUP(YEAR_DATA, FIRST_SECOND_TYPE, PLAN_YM)
       )
 
WHERE GRP_ID IN ('0', '1', '7') 
    
OR (MM_COUNT = 12 AND GRP_ID = 3) ;

 

 

Posted by 농부지기
,