-- 정의 : 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) ;
|