안녕하세요
오라클 질문 하나 더 드리는데요
일단 쿼리문은 아래와 같습니다.
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 부분을 어떻게 수정하면 좋을까요?
감사합니다.
1. ROWNUM 사용 부분은 쿼리가 잘못 작성된 듯 합니다.
- ROWNUM 으로 정렬하여 누적합계를 구하는 부분은 잘못 작성된 쿼리로 보입니다.
- ROWNUM 이 아닌 ymd 로 정렬해야 하는게 아닌지?
2. 원하는 결과를 얻기 위해서는
- b 에서는 OVER 는 빼고 SUM 만 하고, 조인 후에 메인에서 OVER 하세요.
- ymd 중복이 없다면 SUM 도 필요 없습니다. (일자 중복이 있다면 SUM 필요)
3. 누적합계는
- 검색 시작일인 12/01 의 경우 12/01 의 값만 합산하나요?
- 아니면 검색기간 이전 날짜의 값들도 모두 누적되어야 하나요?
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 ;