안녕하세요 부족한 실력으로 고수님들의 도움을 받고자 합니다. ^^;
LINE_PLAN 기존의 다른 컬럼은 생략 한 상태이며 시작일자를 종료일자까지 하루씩 증가시키면서 나머지 컬럼은 같은 값을 보여줘야 합니다. 제가 해결 못하고 있는 문제는 ROW를 일자간 일수 만큼 반복을 시켜야 하는데 각 ROW별로 시작일자와 종료일자의 차이가 달라 일정값을 못 넣는 상태입니다.... 이게 쿼리로 가능할까요??
SELECT z.*
FROM(
SELECT a.START_DATE+b.lv
,GREATEST(a.START_DATE+b.lv,a.END_DATE)
,a.opcode
FROM
(SELECT TO_DATE(INPUT_FROM_DATE,'YYYYMMDD') AS START_DATE
, TO_DATE(INPUT_TO_DATE,'YYYYMMDD') AS END_DATE
, OPCODE
FROM LINE_PLAN) A
,(SELECT level lv FROM dual
CONNECT BY level <= INPUT_TO_DATE - INPUT_FROM_DATE를 뺀 일자로 ROW마다 다름 --> 돌아버리겠음 ㅜㅜ) b
)z
ORDER BY 3,1;
제 질문을 읽어 주셔서 감사합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | -- host변수에 대한 날짜 타입을 선언해 주셔야 할것 같습니다. WITH line_plan AS ( SELECT '001' opcode, 'A' tx FROM DUAL UNION ALL SELECT '002' , 'B' FROM DUAL UNION ALL SELECT '003' , 'C' FROM DUAL UNION ALL SELECT '004' , 'D' FROM DUAL UNION ALL SELECT '005' , 'E' FROM DUAL UNION ALL SELECT '006' , 'F' FROM DUAL ) SELECT s_dt + lv ,GREATEST(s_dt+lv,e_dt) ,opcode,tx FROM ( SELECT TO_DATE(:vs_from_date, 'yyyymmdd' ) AS s_dt ,TO_DATE(:vs_to_date , 'yyyymmdd' ) AS e_dt ,opcode,tx FROM line_plan ), ( SELECT LEVEL lv FROM DUAL CONNECT BY LEVEL <= TO_DATE(:vs_to_date , 'yyyymmdd' ) - TO_DATE(:vs_from_date, 'yyyymmdd' )) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 인터넷 검색해서 답을 찾았습니다. with tbl_populate(INPUT_FROM_DATE, INPUT_TO_DATE, cnt, ndx, OPCODE) as ( select INPUT_FROM_DATE, INPUT_TO_DATE, TO_DATE(INPUT_TO_DATE , 'yyyymmdd' ) - TO_DATE(INPUT_FROM_DATE, 'yyyymmdd' ) cnt, 1 , OPCODE from LINE_PLAN union all select t.INPUT_FROM_DATE , t.INPUT_TO_DATE , TO_DATE(t.INPUT_TO_DATE , 'yyyymmdd' ) - TO_DATE(t.INPUT_FROM_DATE, 'yyyymmdd' ) cnt , tp.ndx + 1 , t.OPCODE from LINE_PLAN t join tbl_populate tp on tp.OPCODE = t.OPCODE and tp.ndx + 1 < TO_DATE(t.INPUT_TO_DATE , 'yyyymmdd' ) - TO_DATE(t.INPUT_FROM_DATE, 'yyyymmdd' ) ) select OPCODE , TO_DATE(INPUT_FROM_DATE , 'yyyymmdd' )+ndx , TO_DATE(INPUT_TO_DATE , 'yyyymmdd' ) from tbl_populate order by 1,2; |