Was sollte der beste Weg sein, um einen Prozentwert in SQL-Server zu speichern?

77

Ich möchte einen Wert speichern, der ein Prozent in SQL Server darstellt. Welcher Datentyp sollte der bevorzugte sein?

Shimmy Weitzhandler
quelle
2
Haben Sie Beispiele für diese "Prozente"?
RichardOD
6
Ich habe wenige: 23.6546767%, 182%, 45%
Shimmy Weitzhandler

Antworten:

48

dezimal (p, s) und numerisch (p, s)

p (Genauigkeit):

Die maximale Gesamtzahl der Dezimalstellen, die gespeichert werden (links und rechts vom Dezimalpunkt).


s (Skala):

Die Anzahl der Dezimalstellen, die rechts vom Dezimalpunkt gespeichert werden (-> s definiert die Anzahl der Dezimalstellen).


0 <= s <= p.

  • p ... Gesamtzahl der Ziffern
  • s ... Anzahl der Stellen rechts vom Dezimalpunkt
  • ps ... Anzahl der Stellen links vom Dezimalpunkt

Beispiel:

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;

Ergebnis:

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

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

Link: msdn.microsoft.com

Guti_Haz
quelle
69

In 99,9% der Fälle sollten Sie Dezimalstellen (p, s) verwenden.

Prozent ist nur ein Präsentationskonzept: 10% sind immer noch 0,1.

Wählen Sie einfach Präzision und Skalierung für die höchsten erwarteten Werte / gewünschten Dezimalstellen, ausgedrückt als reelle Zahlen. Sie können p = s für Werte <100% haben und einfach anhand von Dezimalstellen entscheiden.

Wenn Sie jedoch 100% oder 1 speichern müssen, benötigen Sie p = s + 1.

Dies erlaubt dann bis zu 9.xxxxxx oder 9xx.xxxx%, also würde ich eine Prüfbedingung hinzufügen, um sie auf maximal 1 zu halten, wenn dies alles ist, was ich brauche.

gbn
quelle
3
Ich benötige einen Wert zwischen% 100-% 0 und sollte Dezimalstellen (dh% xx.xx) zulassen. Ich verwende Dezimalstellen (5, 4) und es funktioniert am besten für mich.
Shimmy Weitzhandler
Ich habe Ihre Antwort gelesen, aber für Entwickler haben wir bei Sprachvariablen Probleme mit der Genauigkeit beim Umgang mit Dezimalstellen. 0,2 kann zum Beispiel nicht genau dargestellt werden, einige Leute raten, Dezimalstellen bei der Geldberechnung zu vermeiden (zum Beispiel bei Euro verwenden Sie Cent von Euro für die Berechnung). groovyconsole.appspot.com/script/5078068011991040 Was raten Sie dazu?
Nico
1
@Nico: Verwenden Sie einfach niemals ungefähre Zahlen in einer Datenbank (wie FLOATund DOUBLE). Sie brauchen sie wirklich nicht und sie können leicht Probleme verursachen. Was Cent gegen Euro betrifft: Das ist Unsinn. DECIMAList ein genauer Datentyp; und das Speichern von 123.45 ist somit so genau wie 12345. Es macht keinen Sinn, einen Betrag nicht in seiner Währung, sondern in einer Unterwährung in einer Datenbank zu speichern; es würde nur Menschen verwirren und könnte somit zu falschen Berechnungen und unerwarteten Ergebnissen führen.
Thorsten Kettner
16

Ich bin damit einverstanden, DECIMAL ist der Ort, an dem Sie diese Art von Nummer speichern sollten. Um die Entscheidung zu erleichtern, speichern Sie sie als Prozentsatz von 1 und nicht als Prozentsatz von 100. Auf diese Weise können Sie genau die Anzahl der benötigten Dezimalstellen speichern, unabhängig von der "ganzen" Zahl. Wenn Sie also 6 Dezimalstellen möchten, verwenden Sie DECIMAL (9, 8) und für 23.3436435% speichern Sie 0.23346435. Das Ändern auf 23.346435% ist ein Anzeigeproblem, kein Speicherproblem, und die meisten Präsentationssprachen / Berichtersteller usw. können die Anzeige für Sie ändern.

Aaron Bertrand
quelle
9

Ich denke, Dezimal (p, s) sollte verwendet werden, während s die prozentuale Fähigkeit darstellt. Das 'p' könnte sogar 1 sein, da wir nie mehr als ein Byte benötigen werden, da jede Ziffer auf der linken Seite des Punktes einhundert Prozent beträgt. Das p muss also mindestens s + 1 sein, damit Sie dies können Speichern Sie bis zu 1000%. SQL erlaubt jedoch nicht, dass das 'p' kleiner als das s ist.

Beispiele: 28.2656579879% sollten dezimal (13, 12) sein und gespeichert werden 00.282656579879 128.2656579879% sollten dezimal (13, 12) sein und sollten 01.282656579879 gespeichert werden

28% sollten als 0,28 dezimal (3,2) gespeichert werden. 128% sollten als 1,28 dezimal (3,2) gespeichert werden

Hinweis: Wenn Sie wissen, dass Sie die 100% nicht erreichen werden (dh Ihr Wert ist immer kleiner als 100% als bei Verwendung von Dezimalstellen (s, s), verwenden Sie gegebenenfalls Dezimalzahlen (s + 1, s).

Und so weiter

Shimmy Weitzhandler
quelle
Was versuchst du zu sagen? Dezimal (12, 12) kann 01.282656579879
gbn
Warum die Frage stellen und gleich danach eine detaillierte Antwort geben ...?
Greg Beech
Vielen Dank für die positive Abstimmung. Allerdings verstehen Sie Dezimalstellen wirklich nicht. Warum (s + 1, s) für Werte <100%?
gbn
@ Greg: um darauf hinzuweisen, was los war. Shimmy fand es richtig.
gbn
1
Ich denke, er vermittelt, dass Sie p / s basierend auf Ihren Anforderungen an Reichweite (0-99.9, 0-9999 usw.) und Präzision einstellen sollten.
Mayo
5

Der Datentyp der Spalte sollte dezimal sein.

OMG Ponys
quelle