MODEL 절 에러내용 좀 봐주세요. 0 2 2,696

by 디케이 [2013.04.04 09:42:48]



MODEL절의 DIMENSION BY()에 NUMBER 컬럼을 지정하면 정상인데,
문자컬럼을 지정하면 "ORA-01722 수치가 부적합합니다." 라고 합니다.

QUIZ 내용중 누계합 부분을 인용했는데 문자컬럼으로는 안되는지 고수님들 도움요청합니다.

--이건 정상
WITH t(seq, amt) AS (
  SELECT 1, -2000 FROM dual
    UNION ALL SELECT 2,  4000 FROM dual
    UNION ALL SELECT 3, -5000 FROM dual
)
SELECT *
  FROM t
MODEL
DIMENSION BY (seq)
MEASURES (amt, 0 result)
IGNORE NAV
RULES AUTOMATIC ORDER
(result[ANY] = GREATEST(0, result[CV()-1] + amt[CV()]))
ORDER BY seq
;

--에러 쿼리
WITH t(seq, amt) AS (
  SELECT 'A', -2000 FROM dual
    UNION ALL SELECT 'B',  4000 FROM dual
    UNION ALL SELECT 'C', -5000 FROM dual
)
SELECT *
  FROM t
MODEL
DIMENSION BY (seq)
MEASURES (amt, 0 result)
IGNORE NAV
RULES AUTOMATIC ORDER
(result[ANY] = GREATEST(0, result[CV()-1] + amt[CV()]))
ORDER BY seq
;
by 마농 [2013.04.04 11:05:50]
CV() 는 현재 값을 의미합니다.
CV() - 1 은 현재 값에서 1을 빼겠다는 것인데.
문자값에서 1을 빼면 에러나겠지요.

by 디케이 [2013.04.04 11:14:41]

아 그렇군요.

MODEL 절을 공부하고 있는데 아직 많이 부족하네요..

감사합니다.

-------> 아래와 같이 해결했어요
WITH t(seq, amt) AS (
  SELECT 'A', -2000 FROM dual
    UNION ALL SELECT 'B',  4000 FROM dual
    UNION ALL SELECT 'C', -5000 FROM dual
)
SELECT seq, amt, RESULT
  FROM t
MODEL
DIMENSION BY (ROWNUM RN)
MEASURES (seq, amt, 0 result)
IGNORE NAV
RULES AUTOMATIC ORDER
(result[ANY] = GREATEST(0, result[CV()-1] + amt[CV()]))
ORDER BY seq
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입