안녕하세요 부족한 실력으로 고수님들의 도움을 받고자 합니다. ^^;
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;
제 질문을 읽어 주셔서 감사합니다.
-- 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'))
답변 감사 드립니다.
제가 질문을 잘못한 듯 합니다. 제가 올린 쿼리는 안보셔도 됩니다. 잘못된 거라... ^^;
INPUT_FROM_DATE, INPUT_TO_DATE 컬럼은
기존의 LINE_PLAN에 있는 컬럼이라서요 매번 변수를 입력 받는게 아니라 해당 테이블의 값들을 이용하는 겁니다.
그래서 DUAL에 CONNECT BY 값을 ROW마다 다르게 줘야 합니다.
실제 테이블로 CONNECT BY LEVEL값을 줄려고 하면 ROW마다 값이 다 달라서 인지 사실상 무한 루프를 돌게 되네요 ㅜㅜ
인터넷 검색해서 답을 찾았습니다. 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;
MS-SQL 이신건가요?
SELECT a.start_date + b.lv - 1 dt
FROM (...) a
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 999) b
WHERE b.lv <= a.end_date - a.start_date + 1
;
아찌님 오라클입니다.
마농님 답변 감사합니다.
마농님 2018년 새해 복 많이 받으세요~