초보자 질문하나만 올리겠습니다.
다음과 같이 시작일과 종료일이 있는 데이터를 행으로 변경할 수 있을까요?
구분 시작일자 종료일자
1 2022-07-01 2022-07-04
2 2022-07-01 2022-07-01
======= 열로 변환 ==========
구분 시작일자 종료일자
1 2022-07-01 2022-07-04
1 2022-07-02 2022-07-04
1 2022-07-03 2022-07-04
1 2022-07-04 2022-07-04
2 2022-07-01 2022-07-01
select '1' 구분, '2022-07-01' 시작일자, '2022-07-04' 종료일자 from dual
union all
select '2' 구분, '2022-07-01' 시작일자, '2022-07-01' 종료일자 from dual
1 2 3 4 5 6 7 8 9 10 11 12 | -- 답에만 맞췄습니다. WITH T AS ( select '1' gb, '2022-07-01' st_dt, '2022-07-04' ed_dt from dual union all select '2' gb, '2022-07-01' st_dt, '2022-07-01' ed_dt from dual ) SELECT GB , TO_CHAR(TO_DATE(ST_DT, 'YYYY-MM-DD' ) + LV - 1 , 'YYYY-MM-DD' ) ST_DT , ED_DT FROM T A , ( SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= ( SELECT MAX (TO_DATE(ED_DT, 'YYYY-MM-DD' ) - TO_DATE(ST_DT, 'YYYY-MM-DD' )) + 1 TOT_CNT FROM T )) WHERE TO_DATE(ED_DT, 'YYYY-MM-DD' ) - TO_DATE(ST_DT, 'YYYY-MM-DD' ) + 1 >= LV ORDER BY GB , ED_DT , LV |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | WITH a AS ( select '1' 구분, '2022-07-01' 시작일자, '2022-07-04' 종료일자 from dual union all select '2' 구분, '2022-07-01' 시작일자, '2022-07-01' 종료일자 from dual ) , b (구분, 시작일자, 종료일자, dt) AS ( SELECT 구분, 시작일자, 종료일자, 시작일자 AS dt FROM a UNION ALL SELECT 구분, 시작일자, 종료일자, TO_CHAR(TO_DATE(dt, 'YYYY-MM-DD' ) + 1, 'YYYY-MM-DD' ) AS dt FROM b WHERE TO_DATE(dt, 'YYYY-MM-DD' ) < TO_DATE(종료일자, 'YYYY-MM-DD' ) ) SELECT 구분, dt AS 시작일자, 종료일자 FROM b ORDER BY 구분, 시작일자; 예전에 답글로 올라온 with 문 재귀호출을 이용해 봤습니다. |