[sql-server] 백분율 값을 보유하기위한 적절한 데이터 유형?

0.00 %에서 100.00 % 범위의 백분율 값을 유지하는 데 가장 적합한 데이터 유형은 무엇입니까?



답변

백분율에 소수점 두 자리를 가정 할 때 사용하는 데이터 유형은 백분율 저장 계획에 따라 다릅니다. 분수 등가물 (예 : 100.00 %가 1.0000으로 저장 됨)을 저장하려는 경우 값이 1.0000을 초과하지 않고 (최대 값이라고 가정) 0 미만으로 절대로 내려 가지 않도록 decimal(5,4)하는 CHECK제약 조건이 있는 데이터 유형에 데이터를 저장합니다. (바닥이라고 가정). 액면가를 저장하려는 경우 (예 : 100.00 %는 100.00으로 저장 됨) decimal(5,2)적절한 CHECK제약 조건 과 함께 사용해야합니다 . 좋은 열 이름과 결합하면 데이터가 무엇인지, 데이터가 열에 저장되는 방식을 다른 개발자에게 명확하게 알 수 있습니다.


답변

  • A와 잡습니다 decimal.
  • 범위를 제한하려면 검사 제약 조건을 추가하십시오 (예 : 0 ~ 100 %; 경우에 따라 100 %를 초과하거나 잠재적으로 음수로 이동해야하는 유효한 이유가있을 수 있음).
  • 값 1을 100 %로, 0.5를 50 %로 처리합니다. 이렇게하면 모든 수학 연산이 예상대로 작동 할 수 있습니다 (즉, 값 100을 100 %로 사용하는 것과 반대).
  • 필요에 따라 정밀도와 스케일을 수정합니다 (괄호 안에있는 두 개의 값입니다 columnName decimal(precision, scale). 정밀도는 숫자에 담을 수있는 총 자릿수를 나타내고, 스케일은 소수점 이하 자릿수를 decimal(3,2)나타내므로 표현할 수있는 숫자입니다. 으로는 #.##; decimal(5,3)될 것이다 ##.###.
  • decimalnumeric본질적으로 같은 것입니다. 그러나 decimalANSI 규격이므로 달리 명시하지 않는 한 항상 사용하십시오 (예 : 회사의 코딩 표준).

예제 시나리오

  • 귀하의 경우 (0.00 % ~ 100.00 %)를 원할 것 decimal(5,4)입니다.
  • 가장 일반적인 경우 (0 % ~ 100 %)를 원합니다 decimal(3,2).
  • 위의 두 가지 모두에서 검사 제약 조건은 동일합니다.

예:

if object_id('Demo') is null
create table Demo
    (
        Id bigint not null identity(1,1) constraint pk_Demo primary key
        , Name nvarchar(256) not null constraint uk_Demo unique 
        , SomePercentValue decimal(3,2) constraint chk_Demo_SomePercentValue check (SomePercentValue between 0 and 1)
        , SomePrecisionPercentValue decimal(5,2) constraint chk_Demo_SomePrecisionPercentValue check (SomePrecisionPercentValue between 0 and 1)
    )

추가 자료 :


답변

나는 Thomas와 동의하며 적어도 WPF 응용 프로그램에 대해 DECIMAL (5,4) 솔루션을 선택합니다.

이유를 알기 위해 MSDN Numeric Format String을 살펴보십시오.
http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

백분율 ( “P”) 형식 지정자는 숫자에 100을 곱하고 백분율을 나타내는 문자열로 변환합니다.

그런 다음 XAML 코드에서 이것을 사용할 수 있습니다.

DataFormatString="{}{0:P}"


답변

소수점 이하 2 자리가 정밀도 수준이면 “smallint”는 가장 작은 공간 (2 바이트)에서이를 처리합니다. 100을 곱한 백분율을 저장합니다.

편집 : 십진수 유형이 아마도 더 나은 일치입니다. 그러면 수동으로 확장 할 필요가 없습니다. 값당 5 바이트가 필요합니다.


답변

n이 1.00으로 반올림하기에 충분한 해상도를 갖는 numeric (n, n)을 사용하십시오. 예를 들면 :

declare @discount numeric(9,9)
    , @quantity int
select @discount = 0.999999999
    , @quantity = 10000

select convert(money, @discount * @quantity)


답변