http://pms.itstar.co.kr/jamessong/?document_srl=%241아래와 같은 Table이 있다고 가정하자 가정만 하는거에요..

Code:

CREATE TABLE DECIAML_TEST
(
      A DECIMAL(15,4) ,
      B DECIMAL(15,9)
) ;


위의 Table에 아래의 SQL을 실행하면 어떻게 될까요
Code:

SELECT SUM(A) / AVG(B) FROM DECIMAL_TEST



결과는 아래와 같습니다.
Code:

SQL0419N  A decimal divide operation is not valid because the result would
have a negative scale.  SQLSTATE=42911


원인은 그동안 무심코 사용하였던 SUM , AVG 함수가 decimal 형 또는 decimal 함수를 사용한 결과에 대해서는 결과값의 자료형이 변화하게 된다는 것입니다. 자료형 전체가 변화하는 것은 아니고 decimal 형의 Precision 과 Scale이 변하게 됩니다.

Code:

SUN : precision = 31, scale = 동일
AVG : precision = 31, scale = 31-p+s


이공식에 의해서 위의 연산에서 sum(a) / sum(b) 는 변환자료형으로는 아래와 같은 연산이 됩니다.
Code:

decimal(31, 4)/decmial(31, 24)


그리고 decmial의 나누기 연산의 결과도 decimal 형으로 나타나지만 precision 과 scale을 변화시킵니다.

Code:

  결과의 스케일 = 31 - np + ns - ds

여기서, np는 분자의 정밀도, ns는 분자의 스케일, ds는 분모의
스케일입니다.


그래서 위 연산의 scale 의 결과는

Code:

scale =  31 - 31 + 4 - 24 = -20
결과 scale이 음수이군요.



그리고 아래의 SQL도 조심해야 겠지요.

Code:

select decimal(sum(a), 15, 4) as test from d_test

TEST
-----------------
SQL0413N  Overflow occurred during numeric data type conversion.
SQLSTATE=22003

최대 정수부의 숫자는 11자리를 넘을수 없습니다.  이런..



위의 결과에서 보신것과 같이 decimal 형이나 decimal 함수은 Formatting을 위해서 사용해야지 복잡한 연산에 사용하면 난감한 경우를 당할 수도 있습니다.