오라클 질문 2 0 3 3,892

by 김탠 [Oracle 기초] NULL 이전데이터 [2024.01.26 17:04:02]


1.png (42,403Bytes)

안녕하세요

오라클 질문 하나 더 드리는데요

일단 쿼리문은 아래와 같습니다.

 

select a.dt, NVL(b.ymd,A.DT),B.QUOTA
from (
        SELECT TO_CHAR(TO_DATE('20121201','YYYYMMDD') + (LEVEL - 1),'YYYYMMDD') AS dt
        FROM dual 
        CONNECT BY LEVEL <= (TO_DATE('20231231','YYYYMMDD')      
                   - TO_DATE('20121201','YYYYMMDD') + 1) 
    ) a
       left join ( SELECT YMD, SUM(QUOTA_PLUS_L - QUOTA_MINUS_L - QUOTA_FACT_L) over(order by rownum) AS QUOTA 
                    FROM hist_farm_quota_trace_n 
                    where Farm_cd <> '999999999999' and fact = '1890' and farm_cd = '5006'
                  ) b on a.dt  = b.ymd
 order by A.DT

 

여기서 조회하면 첨부 사진과 같은데요, 이 컬럼값이 사진처럼 NULL이면 이전 값으로 채우려면 B.QUOTA 부분을 어떻게 수정하면 좋을까요? 

 

감사합니다.

by 마농 [2024.01.29 09:23:58]

1. ROWNUM 사용 부분은 쿼리가 잘못 작성된 듯 합니다.
- ROWNUM 으로 정렬하여 누적합계를 구하는 부분은 잘못 작성된 쿼리로 보입니다.
- ROWNUM 이 아닌 ymd 로 정렬해야 하는게 아닌지?
2. 원하는 결과를 얻기 위해서는
- b 에서는 OVER 는 빼고 SUM 만 하고, 조인 후에 메인에서 OVER 하세요.
- ymd 중복이 없다면 SUM 도 필요 없습니다. (일자 중복이 있다면 SUM 필요)
3. 누적합계는
- 검색 시작일인 12/01 의 경우 12/01 의 값만 합산하나요?
- 아니면 검색기간 이전 날짜의 값들도 모두 누적되어야 하나요?


by 김탠 [2024.01.29 15:23:45]

검색 시작일인 12/01 의 경우 최초 등록되었다면 그 값만 보여주면 되고 이전 이력이 존재한다면 마지막 이력의 값이 표현되면 됩니다!

답변 감사합니다. 내용 참고해서 수정해보겠습니다!

.....................

감사합니다! 조언 주신 덕분에 해결했습니다 ㅠㅠ


by 마농 [2024.01.30 09:42:12]
SELECT a.dt
     , SUM(NVL(b.quota, 0)) OVER(ORDER BY a.dt) quota
  FROM (SELECT TO_CHAR(sdt + LEVEL - 1, 'yyyymmdd') dt
          FROM (SELECT TO_DATE('20231201', 'yyyymmdd') sdt
                     , TO_DATE('20231231', 'yyyymmdd') edt
                  FROM dual
                )
         CONNECT BY LEVEL <= edt - sdt + 1
        ) a
  LEFT OUTER JOIN
       (SELECT GREATEST(ymd, '20231201') ymd
             , SUM(quota_plus_l - quota_minus_l - quota_fact_l) quota
          FROM hist_farm_quota_trace_n
         WHERE farm_cd <> '999999999999'
           AND fact    = '1890'
           AND farm_cd = '5006'
           AND ymd <= '20231231'
         GROUP BY GREATEST(ymd, '20231201')
        ) b
    ON a.dt = b.ymd
;

 

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