2010-05-04 23 views
64

Was ist der beste Datentyp für Prozentwerte von 0,00% bis 100,00%?Geeigneter Datentyp für Prozentwerte?

+0

Auch dieses Ergebniss zu finden: http://stackoverflow.com/questions/1602318/what-should-be-the -best-weg-zu-speichern-ein-Prozent-Wert-in-sql-server – User

Antwort

82

Wenn Sie für Ihre Prozentsätze zwei Dezimalstellen angeben, hängt der verwendete Datentyp davon ab, wie Sie Ihre Prozentsätze speichern möchten. Wenn Sie ihren Bruchteiläquivalent speichern (z. B. 100,00% als 1,0000 gespeichert), würde ich die Daten in einem decimal(5,4) Datentyp mit einer CHECK Einschränkung speichern, die sicherstellt, dass die Werte niemals 1,0000 überschreiten (unter der Annahme, dass die Begrenzung) und nie gehen unter 0 (unter der Annahme, dass es sich um den Boden handelt). Wenn Sie ihren Nennwert speichern möchten (z. B. 100,00% wird als 100,00 gespeichert), sollten Sie decimal(5,2) mit einer entsprechenden CHECK-Einschränkung verwenden. In Kombination mit einem guten Spaltennamen wird anderen Entwicklern klar, was die Daten sind und wie die Daten in der Spalte gespeichert sind.

+7

Sollte es nicht "dezimal (5,2)" sein, wo 2 die Anzahl der Stellen nach dem Dezimaltrennzeichen bezeichnet? –

+2

@BorisCallens - Ich kann nicht glauben, dass ich all diese Jahre vermisst habe. Ja, das ist ein Tippfehler. 'decimal (5,2)' ist das, was mit einer Prüfbedingung eingefangen werden soll. – Thomas

+0

Ich bin froh zu helfen :) –

2

Wenn 2 Dezimalstellen Ihre Genauigkeitsgrenze ist, würde ein "smallint" dies auf kleinstem Raum (2 Bytes) verarbeiten. Sie speichern den Prozentsatz multipliziert mit 100.

EDIT: decimal Typ ist wahrscheinlich eine bessere Übereinstimmung. Dann müssen Sie nicht manuell skalieren. Es dauert 5 Bytes pro Wert.

0

Verwenden Sie numerische (n, n), wo n genug Auflösung hat, um auf 1,00 zu runden. Zum Beispiel:

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

select convert(money, @discount * @quantity) 
+2

Diese Frage hat vor mehr als drei Jahren eine ziemlich hohe angenommene Antwort. Wenn Sie nach alten Fragen suchen, die Sie beantworten können, finden Sie hier: http://stackoverflow.com/unanswered – valverij

15
  • Halten als decimal.
  • Fügen Sie Prüfbedingungen hinzu, wenn Sie den Bereich einschränken möchten (z. B. zwischen 0 und 100%; in einigen Fällen kann es Gründe geben, über 100% oder möglicherweise sogar in die Negative zu gehen).
  • Behandle Wert 1 als 100%, 0,5 als 50% usw. Dadurch können alle mathematischen Operationen wie erwartet funktionieren (d. H. Im Gegensatz zur Verwendung des Werts 100 als 100%).
  • Ändern Sie die Genauigkeit und Skalierung wie erforderlich (dies sind die beiden Werte in Klammern columnName decimal(precision, scale). Präzision sagt die Gesamtzahl der Ziffern, die in der Zahl gehalten werden können, Skala sagt, wie viele davon sind nach der Dezimalstelle, so decimal(3,2) ist ein Zahl, die als #.## dargestellt werden kann; decimal(5,3) würde ##.### sein
  • decimal und numeric wesentlichen die gleiche Sache sind jedoch decimal ist ANSI-konform, so verwenden Sie immer, dass nichts anderes gesagt, es sei denn (zB durch Ihre Firma Coding-Standards)
...

Beispielszenarien

  • Für Ihren Fall (0,00% bis 100,00%) möchten Sie decimal(5,4).
  • Für den häufigsten Fall (0% bis 100%) möchten Sie decimal(3,2).
  • In beiden der oben würde die Kontrollzwänge gleich sein

Beispiel:

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) 
    ) 

Weiterführende Literatur:

1

ich mit Thomas zustimmen und ich würde die DECIMAL (5,4) Lösung zumindest für WPF-Anwendungen zur Verfügung.

Werfen Sie einen Blick auf das numerische Format String MSDN wissen, warum: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

Der Prozentsatz („P“) Formatspezifizierer multipliziert eine Zahl mit 100 und wandelt es in eine Zeichenfolge, die einen Prozentsatz darstellt.

Dann würden Sie in der Lage sein, diesen Code in XAML zu verwenden:

DataFormatString="{}{0:P}" 
Verwandte Themen