Яким повинен бути найкращий спосіб зберігати відсоткове значення в SQL-сервері?


Відповіді:


51

десяткові (p, s) та числові (p, s)

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

Максимальна загальна кількість десяткових цифр, які будуть збережені (як ліворуч, так і праворуч від десяткової коми)


s (шкала):

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


0 <= s <= p.

  • p ... загальна кількість цифр
  • s ... кількість цифр праворуч від десяткової коми
  • ps ... кількість цифр ліворуч від десяткової коми

Приклад:

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


70

Ви повинні використовувати десяткові (p, s) у 99,9% випадків.

Відсоток - це лише концепція презентації: 10% - це все одно 0,1.

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

Однак якщо вам потрібно зберегти 100% або 1, тоді вам знадобиться p = s + 1.

Потім це дозволяє до 9.xxxxxx або 9xx.xxxx%, тому я додав би обмеження перевірки, щоб воно було максимум 1, якщо це все, що мені потрібно.


3
Мені потрібне значення між% 100-% 0, і воно повинно дозволяти десяткові коми (тобто% xx.xx), я використовую десяткове (5, 4), і це найкраще для мене працює.
Shimmy Weitzhandler

Я прочитав вашу відповідь, але для розробників із змінними мов у нас виникають проблеми з точністю при роботі з десятковими знаками. 0,2 неможливо точно представити, наприклад, деякі люди радять уникати десяткових знаків при грошовому розрахунку (наприклад, в євро для розрахунку використовують центи євро). groovyconsole.appspot.com/script/5078068011991040 яка ваша порада щодо цього?
Ніко

1
@Nico: Просто ніколи не використовуйте приблизні числа в базі даних (наприклад, FLOATта DOUBLE). Вони вам дійсно не потрібні, і вони можуть легко викликати проблеми. Щодо центів проти євро: Це нонсенс. DECIMALє точним типом даних; і зберігати 123,45, таким чином, точно так само, як 12345. Немає сенсу не зберігати суму в її валюті, а в допоміжній валюті в базі даних; це лише заплутає людей і може призвести до неправильних розрахунків та несподіваних результатів.
Торстен Кеттнер,

16

Я погоджуюсь, що DECIMAL - це місце, де слід зберігати номер цього типу. Але щоб полегшити прийняття рішення, зберігайте його як відсоток 1, а не як відсоток 100. Таким чином, ви зможете зберігати точно потрібну кількість десяткових знаків незалежно від «цілого» числа. Отже, якщо ви хочете 6 знаків після коми, використовуйте DECIMAL (9, 8), а для 23,3436435% ви зберігаєте 0,23346435. Зміна його на 23,346435% є проблемою відображення, а не проблемою зберігання, і більшість мов презентацій / редакторів звітів тощо здатні змінити дисплей для вас.


9

Я думаю , що слід використовувати десяткові (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 + 1, s).

І так далі


Що ви намагаєтеся сказати? десятковий (12, 12) не може зберігати 01.282656579879
gbn

Навіщо задавати питання, а потім негайно давати відповіді на деталі ...?
Greg Beech

Дякуємо за "ти-за-тат" проти. Однак ви дійсно не розумієте десяткової. Чому (s + 1, s) для значень <100%?
gbn

@Greg: вказати на те, що було не так. Шімі вважав, що це правильно.
gbn

1
Я думаю, що він доводить, що ви повинні встановлювати p / s, виходячи з ваших вимог щодо діапазону (0-99,9, 0-9999 тощо) та точності.
Mayo

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.