아래 쿼리를 돌리니 ora-01722 invalid number가 뜨네요.
case에 있는 sum(amount) 때문인 것 같습니다.
컬럼은 varchar2 로 되어 있으며, 실제 값은 금액에 해당하는 값이 들어오는데
천원 --> 1000
-1000원 --> 1000- 의 형태로 들어옵니다.
금액 amount 외에 다른 컬럼으로 grouping 하면서, 금액은 sum을 해야하는데
저렇게 뜨네요.. 컬럼에 제일 우측에 - 가 있어서 저렇게 쿼리를 했는데 방법이 없을까요?
select
crtdate, duedate, name1, materialgrpdesc, case
when substr(amount,-1) = '-' then sum('-'||substr(amount,1,length(amount)-1))
when substr(amount,-1) <> '-' then sum(amount)
end ,
currency, lastname
from IFIN_FI_DUELIST
group by crtdate, duedate, name1, materialgrpdesc, currency, lastname
혹시 몰라서 DECODE 문도 투척해 드립니다~
WITH TB_SAMPLE AS ( SELECT 'A' AS SAMPLE_TYPE, '1000' AS SAMPLE_NUMBER FROM DUAL UNION ALL SELECT 'A' AS SAMPLE_TYPE, '1000-' AS SAMPLE_NUMBER FROM DUAL ) SELECT SAMPLE_TYPE, SUM( DECODE( SUBSTR(SAMPLE_NUMBER, -1), '-', TO_NUMBER('-'||SUBSTR(SAMPLE_NUMBER, 1, LENGTH(SAMPLE_NUMBER) -1)), TO_NUMBER(SAMPLE_NUMBER) ) ) FROM TB_SAMPLE GROUP BY SAMPLE_TYPE
오라클이 똑똑해서 형변환(문자->숫자)을 알아서 해주긴 하지만....
기왕이면 TO_NUMBER 사용을 추천 합니다.