경진의 블로그

이전 레코드 값 참조 방법(전일 환율) 본문

자바개발과정/오라클(Oracle)

이전 레코드 값 참조 방법(전일 환율)

aith 2008. 5. 28. 00:39
바로 이전 RECORD의 값을 참조할 때

첨부 파일


QUERY문을 작성하다 보면 심심치 않게 직면하는 문제가 뒤에 읽혀오는 RECORD에서 이전(전번) RECORD의 FIELD값을 참조해야 하는 경우이다

문제
현재일자의 금액에 전일환율을 곱한 환산금액을 구한다

SELECT rownum,cdate,amt,crate
   FROM test02 temp01
 WHERE cdate between '20010904' AND '20010910';

일자는 일요일(20010909)이 빠지면 연속적으로 값이 일정하게 증가하지 않지만 ROWNUM은 연속적인 값이다 만일 일자가 중간에 빠지지 않는 연속적인 값이었다면 ROWNUM이 필요하지 않고 바로 연결이 가능하다

이제 나보다 작은 것 중 가장 큰것을 나와같다라고 연결해 줄 새로운 KEY값을 만들었다

SELECT temp01.cdate 일자, temp01.amt 금액, temp02.crate 환율
      ,temp01.amt * temp02.crate 환산금액
  FROM (
        SELECT rownum main_cnt,cdate,amt
          FROM test02
         WHERE cdate BETWEEN '20010904' AND '20010910'
       )temp01
      ,(
        SELECT rownum sub_cnt,cdate,crate
          FROM test02
         WHERE cdate between '20010904' AND '20010910'
       )temp02      
 WHERE temp02.sub_cnt = temp01.main_cnt-1;

함수로 만들어서 사용하는 경우

일자를 받아서 해당일자보다 작은 일자의 환율을 돌려주는 함수를 만들고 이 함수에서 RETURN된 값을 사용할 수도 있다.

함수를 작성한다

CREATE OR REPLACE FUNCTION SCOTT.YESTERDAY_CRATE(pdate varchar2) RETURN NUMBER IS
tmpVar NUMBER;
BEGIN
   tmpVar := 0;
   SELECT MAX(crate) INTO tmpVar
     FROM test02
    WHERE cdate = (SELECT MAX(cdate) FROM test02 WHERE cdate < pdate);
   RETURN tmpVar;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
       DBMS_OUTPUT.PUT_LINE('해당하는 데이터가 존재하지 않습니다.');
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END YESTERDAY_CRATE;

함수를 사용하여 쿼리문을 작성한다

SELECT
       CDATE 일자
      ,AMT 금액
      ,CRATE 환율
      ,AMT*CRATE 환산금액
  FROM (
        SELECT
               CDATE
              ,AMT
              ,YESTERDAY_CRATE(CDATE) CRATE
          FROM test02
         WHERE CDATE BETWEEN '20010905' AND '20010910'
       )

'자바개발과정 > 오라클(Oracle)' 카테고리의 다른 글

뷰 작성  (0) 2008.06.02
뷰(VIEW)  (0) 2008.05.28
이전 레코드 값 참조 방법(전일 환율)  (0) 2008.05.28
ROW와 COLUMN의 상호호환  (0) 2008.05.28
ROWNUM & DECODE 문제풀이  (0) 2008.05.28
HIERACHICAL SELECT(계층질의)  (0) 2008.05.28
0 Comments
댓글쓰기 폼