Как лучше всего хранить процентное значение в SQL-сервере? - PullRequest
60 голосов
/ 21 октября 2009

Я хочу сохранить значение, которое представляет процент в SQL-сервере, какой тип данных должен быть предпочтительным?

Ответы [ 5 ]

62 голосов
/ 21 октября 2009

Вы должны использовать десятичное число (p, s) в 99,9% случаев.

Процент - это только концепция представления: 10% - это еще 0,1.

Просто выберите точность и масштаб для максимальных ожидаемых значений / желаемых десятичных разрядов, когда они выражены как действительные числа. Вы можете иметь p = s для значений <100% и просто принять решение на основе десятичных знаков. </p>

Однако, если вам нужно сохранить 100% или 1, вам понадобится p = s + 1.

Это позволяет использовать до 9.xxxxxx или 9xx.xxxx%, поэтому я бы добавил проверочное ограничение, чтобы оно оставалось максимум 1, если это все, что мне нужно.

36 голосов
/ 24 сентября 2014

десятичные (p, s) и числовые (p, s)

p (точность):

Максимальное общее количество десятичных цифр, которое будет сохранено (как слева, так и справа от десятичной точки)


с (масштаб):

Количество десятичных цифр, которые будут храниться справа от десятичной точки (-> s определяет количество десятичных знаков)


0 <= s <= p. </p>

  • p ... общее количество цифр
  • с ... количество цифр справа от десятичной точки
  • p-s ... количество цифр слева от десятичной точки

Пример:

CREATE TABLE dbo.MyTable
( MyDecimalColumn decimal(5,2)
 ,MyNumericColumn numeric(10,5)
);

INSERT INTO dbo.MyTable VALUES (123, 12345.12);

SELECT MyDecimalColumn, MyNumericColumn FROM dbo.MyTable;

Результат:

MyDecimalColumn: 123.00 (p=5, s=2)

MyNumericColumn: 12345.12000 (p=10, s=5)

ссылка: msdn.microsoft.com

12 голосов
/ 21 октября 2009

Я согласен, DECIMAL - это место, где вы должны хранить этот тип номера. Но для облегчения принятия решения сохраняйте его в процентах от 1, а не в процентах от 100. Таким образом, вы можете хранить ровно столько разрядов, сколько вам нужно, независимо от «целого» числа. Поэтому, если вы хотите 6 знаков после запятой, используйте DECIMAL (9, 8) и для 23,3436435%, вы храните 0,23346435. Изменение его на 23,346435% является проблемой отображения, а не проблемой хранения, и большинство языков презентаций / составителей отчетов и т. Д. Способны изменить отображение для вас.

9 голосов
/ 21 октября 2009

Я думаю, что десятичное число (p, s) должно использоваться, в то время как s представляет процентную возможность. 'p' может быть даже 1, поскольку нам никогда не понадобится больше одного байта, поскольку каждая цифра в левой части точки составляет один процент процентов, поэтому p должно быть не менее s + 1, чтобы вы могли иметь возможность хранить до 1000%. но SQL не позволяет 'p' быть меньше, чем s.

Примеры: 28.2656579879% должен быть десятичным (13, 12) и должен храниться 00.282656579879 128,2656579879% должен быть десятичным (13, 12) и должен храниться 01.282656579879

28% следует хранить в десятичном виде (3,2) как 0,28 128% следует хранить в десятичном виде (3,2) как 1,28

Примечание: если вы знаете, что не достигнете 100% (т.е. ваше значение всегда будет меньше 100%, чем используйте десятичную (s, s), если она будет, используйте десятичную (s + 1, s).

и т. Д.

4 голосов
/ 21 октября 2009

Тип столбца должен быть десятичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...