오라클 데이터처리 추가질문 드립니다 1 6 572

by 주작전사 [Oracle 기초] [2021.06.03 17:18:11]


이전글

이전글에선 날짜에 해당하는 수치가 하나뿐이어서 답변 달아주신 SQL이 잘 동작하는대요
이게 같은 날짜에 수치가 여러행이 들어가면 안되더군요.
2020-05-01    1
2020-05-01    5
2020-05-02    3
2020-05-02    5
이런식으로요

그럼 보정이 되어야 하는 날짜에  존재하는 행 갯수만큼  반복해서 보정이 되어버립니다. 
다시 한번 부탁드립니다 ㅜㅜ

 

 

by 마농 [2021.06.03 17:42:41]

원본 대비 결과표 보여주세요.


by 마농 [2021.06.04 09:51:17]

비율이 없는 일자가 중복되는 건 상관이 없을 듯 하구요.
비율이 있는 일자가 중복되는 경우에 해당 비율이 반복 적용되는 문제가 발생되겠네요.
일자가 중복된다면? 일자 이외의 유니크한 추가 정렬기준이 필요합니다.
예를 들면 시간 정보라던가? PK 정보라던가?


by 마농 [2021.06.04 13:47:11]
WITH base_t AS
(
SELECT '2020-05-01' dt, '01:00' tm, 1 v FROM dual
UNION ALL SELECT '2020-05-02', '02:00',  2 FROM dual
UNION ALL SELECT '2020-05-02', '02:10',  2 FROM dual  -- 일자 중복
UNION ALL SELECT '2020-05-03', '03:00',  3 FROM dual
UNION ALL SELECT '2020-05-04', '04:00',  4 FROM dual
UNION ALL SELECT '2020-05-05', '05:00',  5 FROM dual
UNION ALL SELECT '2020-05-06', '06:00',  6 FROM dual
UNION ALL SELECT '2020-05-07', '07:00',  7 FROM dual
UNION ALL SELECT '2020-05-08', '08:00',  8 FROM dual
UNION ALL SELECT '2020-05-09', '09:00',  9 FROM dual
UNION ALL SELECT '2020-05-09', '09:10',  9 FROM dual  -- 일자 중복
UNION ALL SELECT '2020-05-09', '09:20',  9 FROM dual  -- 일자 중복
UNION ALL SELECT '2020-05-10', '10:00', 10 FROM dual
UNION ALL SELECT '2020-05-11', '11:00', 11 FROM dual
UNION ALL SELECT '2020-05-12', '12:00', 12 FROM dual
UNION ALL SELECT '2020-05-13', '13:00', 13 FROM dual
UNION ALL SELECT '2020-05-14', '14:00', 14 FROM dual
UNION ALL SELECT '2020-05-15', '15:00', 15 FROM dual
UNION ALL SELECT '2020-05-16', '16:00', 16 FROM dual
UNION ALL SELECT '2020-05-17', '17:00', 17 FROM dual
UNION ALL SELECT '2020-05-18', '18:00', 18 FROM dual
UNION ALL SELECT '2020-05-19', '19:00', 19 FROM dual
UNION ALL SELECT '2020-05-20', '20:00', 20 FROM dual
UNION ALL SELECT '2020-05-21', '21:00', 21 FROM dual
)
, rat_t AS
(
SELECT '2020-05-09' dt, 120 r FROM dual
UNION ALL SELECT '2020-05-19', 200 FROM dual
)
SELECT a.dt
     , a.tm
     , a.v
     , a.v * NVL(ROUND(EXP(SUM(LN(b.r / 100))), 2), 1) x
  FROM base_t a
     , rat_t b
 WHERE a.dt BETWEEN '2020-05-07' AND '2020-05-19'
   AND b.dt(+) > a.dt
   AND b.dt(+) <= '2020-05-19'
 GROUP BY a.dt, a.tm, a.v
 ORDER BY a.dt, a.tm
;

 


by 주작전사 [2021.06.04 16:55:28]

오 분석이 정확하십니다.

이전 글에서 있던 데이터는 일자별로 대표 데이터가 한 가지씩 만 있어서  문제가 없었는데

일자에 해당하는 세부 데이터가 있는 다른 테이블이 존해하여 그 테이블도 보정작업을 하는 와중에 발견한 문제였습니다.

이 세부 데이터의 테이블엔 시간이 존재합니다!!!

over 절 에서 group by 로 바꾼것이네요 감사합니다.


by 주작전사 [2021.06.04 17:11:37]

아낌없이 퍼주시는데 ㅜㅜ 정말 죄송하게도 한가지 더 부탁드려도 될까요?

보정 건수가 없거나 한 건에 해당하는 기간을 조회하면 보정이 안되거나 한건에 해당하는 비율만 보여야하는데

이 쿼리는 이미 보정을 다 한 상태에서 그 기간에 해당하는 데이터만 조회가 되네요 

1일에서 3일 조회하면 그 이후의 보정 비율인 120과 200이 적용되어버립니다


by 주작전사 [2021.06.04 17:31:30]

아.. 자문 자답합니다. 조회 기간에 맞춰서 비율정보도 기간을 주면 되는군요

AND a.dt BETWEEN '2020-05-01' AND '2020-05-07'
AND b.dt(+) BETWEEN '2020-05-01' AND '2020-05-07'

 

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