안녕하세요.
connect by 구문에 대해 질의할 것이 있습니다.
아래와 같은 테이블이 있습니다.
Cnt Name Start_Date End_Date
===================================================
12 Crown 1999-01-12 1999-12-20
24 Bids 2001-03-23 2003-02-10
connect by를 사용해서 아래와 같이 만드려고 합니다.
Period Name
===================================================
1999-01 Crown
1999-02 Crown
...
1999-12 Crown
2001-03 Bids
...
2003-02 Bids
사용중인 DB는 9i 이며 저런 항목으로 몇개의 라인이 더 있는 상황입니다.
많은 도움 바랍니다. ㅠㅠ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | WITH T AS ( SELECT 12 AS cnt, 'Crown' AS name , '1999-01-12' AS start_date, '1999-12-20' AS end_date FROM DUAL UNION ALL SELECT 24, 'Bids' , '2001-03-23' , '2003-02-10' FROM DUAL ) SELECT yyyymm, name FROM T RIGHT OUTER JOIN ( SELECT DISTINCT TO_CHAR(TO_DATE(start_date, 'YYYY-MM-DD' ) + LEVEL - 1, 'YYYY-MM' ) AS yyyymm FROM DUAL, ( SELECT MIN (start_date) AS start_date, MAX (end_date) AS end_date FROM T) T2 CONNECT BY TO_DATE(start_date, 'YYYY-MM-DD' ) + LEVEL <= TO_DATE(end_date, 'YYYY-MM-DD' ) + 1 ) T2 ON T2.yyyymm >= TO_CHAR(TO_DATE(T.start_date), 'YYYY-MM' ) AND T2.yyyymm <= TO_CHAR(TO_DATE(T.end_date), 'YYYY-MM' ) ORDER BY yyyymm ; |
1 2 3 4 5 6 7 8 9 10 11 | WITH T AS ( SELECT 12 CNT , 'Crown' NAME , TO_DATE( '1999-01-12' , 'YYYY-MM-DD' ) START_DATE , TO_DATE( '1999-12-20' , 'YYYY-MM-DD' ) AS END_DATE FROM DUAL UNION ALL SELECT 24 CNT , 'Bids' NAME , TO_DATE( '2001-03-23' , 'YYYY-MM-DD' ) START_DATE , TO_DATE( '2003-02-10' , 'YYYY-MM-DD' ) AS END_DATE FROM DUAL ) SELECT TO_CHAR(ADD_MONTHS(A.START_DATE,LV-1), 'YYYY-MM' ) Period , A. NAME FROM T A , ( SELECT LEVEL AS LV FROM DUAL CONNECT BY LEVEL <= 100 ) B WHERE A.CNT >= B.LV ORDER BY NAME DESC , Period |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* 수정 */ WITH T AS ( SELECT 12 CNT , 'Crown' NAME , TO_DATE( '1999-01-12' , 'YYYY-MM-DD' ) START_DATE , TO_DATE( '1999-12-20' , 'YYYY-MM-DD' ) AS END_DATE FROM DUAL UNION ALL SELECT 24 CNT , 'Bids' NAME , TO_DATE( '2001-03-23' , 'YYYY-MM-DD' ) START_DATE , TO_DATE( '2003-02-10' , 'YYYY-MM-DD' ) AS END_DATE FROM DUAL ) SELECT TO_CHAR(ADD_MONTHS(A.START_DATE,LV-1), 'YYYY-MM' ) Period , A. NAME FROM T A --, (SELECT LEVEL AS LV FROM DUAL CONNECT BY LEVEL <= 100 ) B , ( SELECT LEVEL AS LV FROM DUAL CONNECT BY LEVEL <= ( SELECT SUM (CNT) FROM T) ) B WHERE A.CNT >= B.LV ORDER BY NAME DESC , Period |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | WITH T AS ( SELECT 12 AS cnt, 'Crown' AS name , '1999-01-12' AS start_date, '1999-12-20' AS end_date FROM DUAL UNION ALL SELECT 24, 'Bids' , '2001-03-23' , '2003-02-10' FROM DUAL ) ,TT( CNT, NAME , START_DATE, Period, ADD_CNT) AS ( SELECT CNT, NAME , START_DATE , TO_CHAR(TO_DATE(START_DATE, 'YYYY-MM-DD' ), 'YYYY-MM' ) Period , 1 ADD_CNT FROM T UNION ALL SELECT CNT, NAME , START_DATE , TO_CHAR(ADD_MONTHS(TO_DATE(START_DATE, 'YYYY-MM-DD' ),ADD_CNT), 'YYYY-MM' ) Period , 1+ADD_CNT ADD_CNT FROM TT WHERE CNT >= 1+ADD_CNT ) SELECT Period, NAME FROM TT ORDER BY Period ; |