WITH TA AS ( SELECT '20150801' AS COL , 'Y' AS GUBUN FROM DUAL UNION ALL SELECT '20150810' AS COL , 'N' AS GUBUN FROM DUAL UNION ALL SELECT '20150815' AS COL , 'Y' AS GUBUN FROM DUAL UNION ALL SELECT '20150805' AS COL , 'N' AS GUBUN FROM DUAL ) SELECT COL, ( SELECT YYYYMMDD --,TA.GUBUN --이부분 서브쿼리는 당연히 TA.GUBUN 값이 전달됩니다. FROM ( SELECT ROW_NUMBER() OVER(ORDER BY YYYYMMDD) RNUM, YYYYMMDD FROM HOLIDAY_TABLE WHERE SLR_YMD > TA.COL --TA.COL 부분이 서브쿼리에 서브쿼리라 변수 전달이 안됩니다. AND HLYDD_YN IS NULL ) WHERE RNUM = DECODE(TA.GUBUN,'Y',10,20) -- 이부분은 TA.GUBUN 변수값이 전달됨 / TA.COL에 영업일 10일 또는 20일 이후날짜를 반환 ) AS YYYYMMDD FROM TA ;
소스와 같이 변수 전달이 어렵네요..
WITH holiday_table AS ( SELECT TO_CHAR(TO_DATE('201501', 'yyyymm') + LEVEL - 1, 'yyyymmdd') slr_ymd , CASE WHEN TO_CHAR(TO_DATE('201501', 'yyyymm') + LEVEL - 1, 'd') IN ('1','7') THEN 'Y' END hlydd_yn FROM dual CONNECT BY LEVEL <= 365 ) , ta AS ( SELECT '20150801' col, 'Y' gubun FROM dual UNION ALL SELECT '20150810', 'N' FROM dual UNION ALL SELECT '20150815', 'Y' FROM dual UNION ALL SELECT '20150805', 'N' FROM dual ) SELECT a.col , a.gubun , DECODE(a.gubun, 'Y', ymd10, ymd20) ymd FROM ta a , (SELECT slr_ymd , LEAD(DECODE(hlydd_yn, '', slr_ymd), 10) IGNORE NULLS OVER(ORDER BY slr_ymd) ymd10 , LEAD(DECODE(hlydd_yn, '', slr_ymd), 20) IGNORE NULLS OVER(ORDER BY slr_ymd) ymd20 FROM holiday_table ) b WHERE a.col = b.slr_ymd ;
WITH holiday_table AS ( SELECT TO_CHAR(TO_DATE('201501', 'yyyymm') + LEVEL - 1, 'yyyymmdd') slr_ymd , CASE WHEN TO_CHAR(TO_DATE('201501', 'yyyymm') + LEVEL - 1, 'd') IN ('1','7') THEN 'Y' END hlydd_yn FROM dual CONNECT BY LEVEL <= 365 ) , ta AS ( SELECT '20150801' col, 'Y' gubun FROM dual UNION ALL SELECT '20150810', 'N' FROM dual UNION ALL SELECT '20150815', 'Y' FROM dual UNION ALL SELECT '20150805', 'N' FROM dual ) , t(col, gubun, cnt_limit, ymd, cnt) AS ( SELECT a.col , a.gubun , DECODE(a.gubun, 'Y', 10, 20) cnt_limit , b.slr_ymd ymd , 0 cnt FROM ta a , holiday_table b WHERE b.slr_ymd = a.col UNION ALL SELECT a.col , a.gubun , a.cnt_limit , b.slr_ymd ymd , a.cnt + DECODE(b.hlydd_yn, '', 1, 0) cnt FROM t a , holiday_table b WHERE b.slr_ymd = TO_CHAR(TO_DATE(a.ymd, 'yyyymmdd') + 1, 'yyyymmdd') AND a.cnt < cnt_limit ) SELECT col, gubun, ymd FROM t WHERE cnt = cnt_limit ;