안녕하세요.
아래와 같은 데이터를 갖고 있는 A, B 테이블이 있을 때
결과의 내용을 얻을 수 있는 쿼리는 어떻게 만들어야 할까요?
아무리 생각해도 시작이 어렵네요.ㅠㅠ
데이타1
가맹점 적용시작일 적용종료일 사용여부 적립여부
AAA 20190615 99991231 Y Y
데이타2
가맹점 적용시작일 적용종료일 구분 방식 수수료
AAA 20201001 20221231 사용 정액 100
AAA 20201001 20211231 적립 정률 0.01
위와 데이터가 있을 때.. 아래와 같이 나오게 하고 싶습니다.
가맹점 적용시작일 적용종료일 사용여부 적립여부 사용방식 사용수수료 적립방식 적립수수료
AAA 20190615 20191231 Y Y
AAA 20201001 20211231 Y Y 정액 100 정률 0.01
AAA 20220101 20221231 Y Y 정액 100
AAA 20230101 99991231 Y Y
기간에 적용하는 데이터들에 따라 기간이 쪼개지고 데이터도 나타내야 하는데..
고수님들 도움 부탁드립니다.ㅠ
with data1 as (
select 'AAA' mct_no, '20190615' start_dt, '99991231' end_dt, 'Y' use_yn, 'Y' save_yn fom dual
)
with data2 as (
select 'AAA' mct_no, '20201001' start_dt, '20221231' end_dt, '사용' fee_gbn, '정액' fee_method, 100 fee fom dual
union all
select 'AAA', '20201001', '20211231', '적립', '정률', 0.01 fom dual
)
WITH t1 AS ( SELECT 'AAA' mct_no, '20190615' start_dt, '99991231' end_dt, 'Y' use_yn, 'Y' save_yn FROM dual ) , t2 AS ( SELECT 'AAA' mct_no, '20201001' start_dt, '20221231' end_dt, '사용' fee_gbn, '정액' fee_method, 100 fee FROM dual UNION ALL SELECT 'AAA', '20201001', '20211231', '적립', '정률', 0.01 FROM dual ) , t3 AS ( SELECT mct_no , TO_CHAR(sdt + 1, 'yyyymmdd') sdt , TO_CHAR(edt , 'yyyymmdd') edt FROM (SELECT mct_no , sdt , LEAD(sdt) OVER(PARTITION BY mct_no ORDER BY sdt) edt FROM (SELECT mct_no, TO_DATE(start_dt, 'yyyymmdd') - 1 sdt FROM t1 UNION SELECT mct_no, TO_DATE( end_dt, 'yyyymmdd') edt FROM t1 UNION SELECT mct_no, TO_DATE(start_dt, 'yyyymmdd') - 1 sdt FROM t2 UNION SELECT mct_no, TO_DATE( end_dt, 'yyyymmdd') edt FROM t2 ) ) WHERE edt IS NOT NULL ) SELECT a.mct_no , a.sdt , a.edt , b.use_yn , b.save_yn , c.fee_method use_fee_method , c.fee use_fee , d.fee_method save_fee_method , d.fee save_fee FROM t3 a , t1 b , t2 c , t2 d WHERE a.mct_no = b.mct_no(+) AND a.mct_no = c.mct_no(+) AND a.mct_no = d.mct_no(+) AND a.sdt <= b.end_dt (+) AND a.edt >= b.start_dt(+) AND a.sdt <= c.end_dt (+) AND a.edt >= c.start_dt(+) AND a.sdt <= d.end_dt (+) AND a.edt >= d.start_dt(+) AND c.fee_gbn(+) = '사용' AND d.fee_gbn(+) = '적립' ORDER BY mct_no, sdt ;