web-dev-qa-db-fra.com

Quelle devrait être la meilleure façon de stocker une valeur en pourcentage dans SQL-Server?

Je veux stocker une valeur qui représente un pourcentage dans SQL Server, quel type de données doit être préféré?

62
Shimmy

décimal (p, s) et numérique (p, s)

p (précision):

Le nombre total maximal de chiffres décimaux qui seront stockés (à gauche et à droite du séparateur décimal)


s (échelle):

Le nombre de chiffres décimaux qui seront stockés à droite de la virgule décimale (-> s définit le nombre de décimales)


0 <= s <= p.

  • p ... nombre total de chiffres
  • s ... nombre de chiffres à droite du séparateur décimal
  • p-s ... nombre de chiffres à gauche du séparateur décimal

Exemple:

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;

Résultat:

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

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

lien: msdn.Microsoft.com

37
Guti_Haz

Vous devez utiliser décimal (p, s) dans 99,9% des cas.

Le pourcentage n'est qu'un concept de présentation: 10% est toujours 0,1.

Choisissez simplement la précision et l'échelle pour les valeurs attendues les plus élevées/décimales souhaitées lorsqu'elles sont exprimées en nombres réels. Vous pouvez avoir p = s pour des valeurs <100% et simplement décider en fonction des décimales.

Cependant, si vous devez stocker 100% ou 1, vous aurez besoin de p = s + 1.

Cela permet alors jusqu'à 9.xxxxxx ou 9xx.xxxx%, donc j'ajouterais une contrainte de vérification pour le garder au maximum 1 si c'est tout ce dont j'ai besoin.

62
gbn

Je suis d'accord, DECIMAL est l'endroit où vous devez stocker ce type de numéro. Mais pour rendre la décision plus facile, enregistrez-la sous forme de pourcentage de 1 et non de 100. De cette façon, vous pouvez stocker exactement le nombre de décimales dont vous avez besoin, quel que soit le nombre "entier". Donc, si vous voulez 6 décimales, utilisez DECIMAL (9, 8) et pour 23,3436435%, vous stockez 0,23346435. Le changer à 23,346435% est un problème d'affichage, pas un problème de stockage, et la plupart des langues de présentation/rédacteurs de rapports, etc. sont capables de changer l'affichage pour vous.

12
Aaron Bertrand

Je pense que décimal (p, s) devrait être utilisé alors que s représente la capacité en pourcentage. le `` p '' pourrait être égal à 1, car nous n'aurons jamais besoin de plus d'un octet, car chaque chiffre du côté gauche du point est de un pour cent, de sorte que le p doit être d'au moins s + 1, afin que vous puissiez stocker jusqu'à 1000%. mais SQL ne permet pas au "p" d'être plus petit que le s.

Exemples: 28,2656579879% doivent être décimaux (13, 12) et doivent être stockés 00,282656579879 128,2656579879% doivent être décimaux (13, 12) et doivent être stockés 01,282656579879

28% doivent être stockés en décimal (3,2) comme 0,28 128% doivent être stockés en décimal (3,2) comme 1,28

Remarque: si vous savez que vous n'atteindrez pas les 100% (c'est-à-dire que votre valeur sera toujours inférieure à 100% par rapport à la décimale (s, s), si c'est le cas, utilisez la décimale (s + 1, s).

Etc

9
Shimmy

Le type de données de la colonne doit être décimal.

4
OMG Ponies