시작일자와 종료 일자 일자간 차이만큼 시작일자1일씩 증가 시켜 출력 0 6 2,397

by 부족한놈 [SQL Query] 오라클 SQL [2017.12.29 09:55:21]


안녕하세요 부족한 실력으로 고수님들의 도움을 받고자 합니다. ^^;

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; 

 

제 질문을 읽어 주셔서 감사합니다.

by 무지버기 [2017.12.29 10:34:45]
-- 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'))

 


by 부족한놈 [2017.12.29 10:47:07]

답변 감사 드립니다. 

제가 질문을 잘못한 듯 합니다. 제가 올린 쿼리는 안보셔도 됩니다. 잘못된 거라... ^^;

 INPUT_FROM_DATE, INPUT_TO_DATE 컬럼은

기존의 LINE_PLAN에 있는 컬럼이라서요 매번 변수를 입력 받는게 아니라 해당 테이블의 값들을 이용하는 겁니다.

그래서 DUAL에 CONNECT BY 값을 ROW마다 다르게 줘야 합니다. 

실제 테이블로 CONNECT BY LEVEL값을 줄려고 하면 ROW마다 값이 다 달라서 인지 사실상 무한 루프를 돌게 되네요 ㅜㅜ


by 부족한놈 [2017.12.29 14:01:18]
인터넷 검색해서 답을 찾았습니다.

  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;

 


by 우리집아찌 [2017.12.29 14:03:23]

MS-SQL 이신건가요?


by 마농 [2017.12.29 14:41:21]
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
;

 


by 부족한놈 [2017.12.30 10:57:12]

아찌님 오라클입니다.

마농님 답변 감사합니다.

마농님 2018년 새해 복 많이 받으세요~

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