기간별로 쪼개서 해당하는 데이터를 보여주는 쿼리.? 0 2 875

by 민트에이드 [2020.10.21 10:45:01]


안녕하세요. 


아래와 같은 데이터를 갖고 있는 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
)

by 마농 [2020.10.21 13:32:04]
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
;
 

 


by 민트에이드 [2020.10.21 14:52:08]

마농님, 정말 감사합니다..!!

제일 먼저 기간을 쪼개서 구해야 겠단 생각은 했는데,, 이것부터 어려움이 있었습니다..

문제를 만났을 때 해결법을 찾는 실력를 키우기 위해서는.. 많은 문제를 쿼리로 풀어보는 것 뿐이겠지요? 

감탄하고,, 갑니다..ㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입