

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 숫자형
<a name="Numeric_types"></a>

숫자 데이터 형식으로는 정수, 소수 및 부동 소수점 수가 있습니다.

**Topics**
+ [정수 형식](Numeric_types-integer-types.md)
+ [DECIMAL 또는 NUMERIC 형식](Numeric_types-decimal-or-numeric-type.md)
+ [부동 소수점 형식](Numeric_types-floating-point-types.md)
+ [숫자 값 계산](Numeric_computations.md)

# 정수 형식
<a name="Numeric_types-integer-types"></a>

다음 데이터 형식을 사용하여 다양한 범위의 정수를 저장합니다. 각 형식마다 허용 범위를 벗어나는 값은 저장할 수 없습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/clean-rooms/latest/sql-reference/Numeric_types-integer-types.html)

# DECIMAL 또는 NUMERIC 형식
<a name="Numeric_types-decimal-or-numeric-type"></a>

소수 또는 숫자 데이터 형식을 사용하여 *사용자 정의 정밀도*가 포함된 값을 저장합니다. 여기에서 소수와 숫자 키워드는 동일한 의미로 통용됩니다. 하지만 본 문서에서는 *소수*가 이 데이터 형식에서 우선적으로 사용되는 용어입니다. 실제로 *숫자*는 일반적으로 정수, 소수 및 부동 소수점 데이터 형식을 일컬을 때 사용됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/clean-rooms/latest/sql-reference/Numeric_types-decimal-or-numeric-type.html)

테이블에서 DECIMAL 열은 *precision*과 *scale*을 지정하여 다음과 같이 정의합니다.

```
decimal(precision, scale)
```

 *precision*   
정수에서 전체 유효 자릿수, 즉 소수점 양변의 자릿수를 말합니다. 예를 들어 숫자 `48.2891`의 정밀도는 6이고, 소수점 자릿수는 4입니다. 정밀도를 따로 지정하지 않을 경우 기본 정밀도는 18입니다. 최대 정밀도는 38입니다.  
 입력 값에서 소수점 왼쪽의 자릿수가 열 정밀도에서 소수점 자릿수를 뺀 값보다 큰 경우에는 값을 열에 복사하거나, 삽입하거나 혹은 업데이트할 수 없습니다. 이 규칙은 열 정의의 범위를 벗어나는 모든 값에 적용됩니다. 예를 들어 `numeric(5,2)` 열에서는 허용되는 값의 범위가 `-999.99`\$1`999.99`입니다.

 *사용*   
값의 소수부, 즉 소수점 오른쪽의 소수 자릿수를 말합니다. 정수는 소수 자릿수가 0입니다. 열 명세에서 소수점 자릿수 값은 정밀도 값보다 작거나 같아야 합니다. 소수점 자릿수를 따로 지정하지 않을 경우 기본 소수점 자릿수는 18입니다. 최대 소수점 자릿수는 37입니다.  
테이블에 로드되는 입력 값의 소수점 자릿수가 열의 소수점 자릿수보다 큰 경우에는 값이 지정한 자릿수로 반올림됩니다. 예를 들어 SALES 테이블의 PRICEPAID 열이 DECIMAL(8,2) 열이라고 가정하겠습니다. 이때 DECIMAL(8,4) 값이 PRICEPAID 열에 삽입되면 값의 소수점 자릿수가 2로 반올림됩니다.  

```
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);

select pricepaid, salesid from sales where salesid=0;

pricepaid | salesid
-----------+---------
4323.90 |       0
(1 row)
```
 하지만 테이블에서 선택한 값의 명시적인 변환 결과는 반올림되지 않습니다.

**참고**  
DECIMAL(19,0) 열에 삽입할 수 있는 최대 양의 값은 `9223372036854775807`(263 -1)입니다. 음의 최댓값은 `-9223372036854775807`입니다. 예를 들어 `9999999999999999999`(9 19개) 값을 삽입하려고 하면 오버플로우 오류가 발생합니다. 소수점 위치에 상관없이 AWS Clean Rooms 에서 소수로 표현할 수 있는 가장 큰 문자열은 `9223372036854775807`입니다. 예를 들어 DECIMAL(19,18) 열에 로드할 수 있는 가장 큰 값은 `9.223372036854775807`입니다.  
이러한 규칙은 다음과 같은 이유로 적용됩니다.  
유효 자릿수가 19자리 이하인 DECIMAL 값은 8바이트 정수로 내부적으로 저장됩니다.
유효 자릿수가 20\$138자리인 DECIMAL 값은 16바이트 정수로 저장됩니다.

## 128비트 DECIMAL 또는 NUMERIC 열 사용에 대한 주의 사항
<a name="Numeric_types-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

애플리케이션에 해당 전체 자릿수가 필요한지 확실하지 않은 경우 DECIMAL 열에 최대 전체 자릿수를 임의로 지정하지 않도록 합니다. 128비트 값은 64비트 값보다 두 배 많은 디스크 공간을 사용하므로 쿼리 실행 시간이 느려질 수 있습니다.

# 부동 소수점 형식
<a name="Numeric_types-floating-point-types"></a>

REAL 및 DOUBLE PRECISION 데이터 형식을 사용하여 *가변 정밀도*의 숫자 값을 저장합니다. 부동 소수점 형식은 *부정확합니다*. 이 말은 일부 값이 근사치로 저장되어 특정 값을 저장하거나 반환할 때 약간 불일치가 발생할 수 있다는 것을 의미합니다. 따라서 정확한 저장 및 계산이 필요하다면(금전적 액수 등) DECIMAL 데이터 형식을 사용하세요.

REAL은 부동 소수점 산술에 대한 IEEE 표준 754에 따라 단정밀도 부동 소수점 형식을 나타냅니다. 정밀도는 약 6자리이며 범위는 약 1E-37\$11E\$137입니다. 이 데이터 유형을 FLOAT4로 지정할 수도 있습니다.

DOUBLE PRECISION은 이진 부동 소수점 산술에 대한 IEEE 표준 754에 따른 배정밀도 부동 소수점 형식을 나타냅니다. 정밀도는 약 15자리이며 범위는 약 1E-307\$11E\$1308입니다. 이 데이터 유형을 FLOAT 또는 FLOAT8로 지정할 수도 있습니다.

# 숫자 값 계산
<a name="Numeric_computations"></a>

에서 *계산*은 더하기 AWS Clean Rooms, 빼기, 곱하기, 나누기 등의 이진 수학 연산을 나타냅니다. 이번 섹션에서는 이러한 연산에 따라 예상되는 반환 형식을 비롯해 DECIMAL 데이터 형식이 포함되어 있을 경우 정밀도와 소수점 자릿수의 계산 공식에 대해서 설명합니다.

쿼리 처리 시 숫자 값을 계산할 때는 계산이 불가능하거나 쿼리가 숫자 오버플로우 오류를 반환하는 상황이 발생할 수 있습니다. 그 밖에도 계산된 값의 소수점 자릿수가 바뀌거나 예상과 다를 수도 있습니다. 일부 연산에서는 명시적 변환(형식 승격) 또는 AWS Clean Rooms 구성 파라미터를 사용하여 이러한 문제를 피할 수 있습니다.

SQL 함수를 사용하는 비슷한 계산 결과에 대한 자세한 내용은 [AWS Clean Rooms Spark SQL 함수](sql-functions-topic-spark.md) 섹션을 참조하세요.

## 계산 반환 형식
<a name="Numeric_computations-return-types"></a>

에서 지원되는 숫자 데이터 형식 집합을 고려할 때 다음 표에는 추가 AWS Clean Rooms, 빼기, 곱하기 및 나누기 작업에 대해 예상되는 반환 유형이 나와 있습니다. 표 왼쪽에서 첫 번째 열은 계산에 포함되는 첫 번째 피연산자이고, 맨 위의 행은 두 번째 피연산자를 의미합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/clean-rooms/latest/sql-reference/Numeric_computations.html)

## 계산된 DECIMAL 결과의 정밀도와 소수점 자릿수
<a name="Numeric_computations-precision-and-scale-of-computed-decimal-results"></a>

다음 표는 수학 연산이 DECIMAL 결과를 반환할 때 정밀도와 소수점 자릿수를 계산하는 규칙을 요약한 것입니다. 이 표에서 `p1` 및 `s1`는 계산에서 첫 번째 피연산자의 정밀도와 규모를 나타냅니다. `p2` 및는 두 번째 피연산자의 정밀도와 규모를 `s2` 나타냅니다. 이 계산과 상관없이 최대 결과 정밀도는 38이고, 최대 결과 소수점 자릿수도 38입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/clean-rooms/latest/sql-reference/Numeric_computations.html)

예를 들어 SALES 테이블의 PRICEPAID 열과 COMMISSION 열이 모두 DECIMAL(8,2) 열이라고 가정하겠습니다. 이때 PRICEPAID를 COMMISSION으로(혹은 그 반대로) 나누면 다음과 같은 공식이 적용됩니다.

```
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17

Scale = max(4,2+8-2+1) = 9

Result = DECIMAL(17,9)
```

다음 계산은 UNION, INTERSECT, EXCEPT 같은 집합 연산자나 COALESCE, DECODE 같은 함수를 사용해 DECIMAL 값에 대한 연산 결과 정밀도와 소수점 자릿수를 계산하기 위한 일반 규칙입니다.

```
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
```

예를 들어 DECIMAL(7,2) 열 1개가 포함된 DEC1 테이블이 DECIMAL(15,3) 열 1개가 포함된 DEC2 테이블과 조인되어 DEC3 테이블을 생성한다고 가정할 때, DEC3의 스키마를 보면 NUMERIC(15,3) 열이 되는 것을 알 수 있습니다.

```
select * from dec1 union select * from dec2;
```

위 예에서 적용되는 공식은 다음과 같습니다.

```
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## 나누기 연산에 대한 주의 사항
<a name="Numeric_computations-notes-on-division-operations"></a>

나누기 연산에서 0으로 나누는(divide-by-zero) 조건은 오류를 반환합니다.

정밀도와 소수점 자릿수를 계산한 후에는 소수점 자릿수 한계로 100이 적용됩니다. 계산된 결과 소수점 자릿수가 100보다 크면 나누기 결과가 다음과 같이 조정됩니다.
+ precision = ` precision - (scale - max_scale)` 
+ Scale = ` max_scale ` 

계산된 정밀도가 최대 정밀도(38)보다 크면 정밀도가 38로 줄어들고, 소수점 자릿수는 다음 공식의 결과 값이 됩니다. `max(38 + scale - precision), min(4, 100))` 

## 오버플로우 조건
<a name="Numeric_computations-overflow-conditions"></a>

모든 수치 계산에서는 오버플로우 여부를 확인합니다. 정밀도가 19 이하인 DECIMAL 데이터는 64비트 정수로 저장됩니다. 정밀도가 19보다 큰 DECIMAL 데이터는 128비트 정수로 저장됩니다. DECIMAL 값은 모두 최대 정밀도가 38이고, 최대 소수점 자릿수가 37입니다. 오버플로우 오류는 값이 이러한 제한을 초과할 때 발생하며, 중간 결과 집합과 최종 결과 집합 모두에 적용됩니다.
+ 명시적 캐스팅은 특정 데이터 값이 캐스트 함수에서 지정한 요청된 정밀도 또는 규모에 맞지 않을 때 런타임 오버플로 오류를 발생시킵니다. 예를 들어 SALES 테이블의 PRICEPAID 열(DECIMAL(8,2) 열)에 있는 값을 모두 변환할 수는 없기 때문에 다음과 같이 DECIMAL(7,3) 결과를 반환합니다.

  ```
  select pricepaid::decimal(7,3) from sales;
  ERROR:  Numeric data overflow (result precision)
  ```

  이러한 오류가 발생하는 이유는 PRICEPAID 열에서 *일부* 더 큰 값은 변환할 수 없기 때문입니다.
+ 곱하기 연산은 결과 소수점 자릿수가 각 피연산자의 소수점 자릿수 합인 결과를 산출합니다. 예를 들어 두 피연산자의 소수점 자릿수가 4라고 한다면 결과 소수점 자릿수는 8이 되고 소수점 왼쪽에는 10자리만 남게 됩니다. 따라서 둘 다 유효 소수점 자릿수를 가지고 있는 큰 수 2개를 곱할 경우에는 비교적 오버플로우 조건이 발생하기 쉽습니다.

## INTEGER 및 DECIMAL 형식을 사용한 숫자 계산
<a name="Numeric_computations-numeric-calculations-with-integer-and-decimal-types"></a>

계산 시 피연산자 하나가 INTEGER 데이터 형식이고, 나머지 피연산자가 DECIMAL 데이터 형식인 경우에는 INTEGER 피연산자가 묵시적으로 DECIMAL로 변환됩니다.
+ SMALLINT 또는 SHORT는 DECIMAL(5,0)로 캐스팅됩니다.
+ INTEGER는 DECIMAL(10,0)로 변환됨 
+ BIGINT 또는 LONG는 DECIMAL(19,0)로 캐스팅됩니다.

예를 들어 SALES.COMMISSION(DECIMAL(8,2) 열)과 SALES.QTYSOLD(SMALLINT 열)를 곱하면 다음과 같이 변환됩니다.

```
DECIMAL(8,2) * DECIMAL(5,0)
```