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


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


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.


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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.