초보자 질문하나만 올리겠습니다.
다음과 같이 시작일과 종료일이 있는 데이터를 행으로 변경할 수 있을까요?
구분 시작일자 종료일자
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
-- 답에만 맞췄습니다.
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
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 문 재귀호출을 이용해 봤습니다.