Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So runden Sie (AUF/AB) in SQL Server – 5 nützliche Tipps

Von klein auf hat man uns beigebracht, Zahlen zu runden. Wenn Sie 1,15 auf die nächsten Zehntel runden, wird es 1,2 oder 1,1 sein? Die Verwendung der SQL-RUNDEN-Funktion zum Antworten kann Sie verwirren. Später werden Sie sehen, was ich meine.

[sendpulse-form id=”12010″]

Hier ist eine andere Frage. Was ist die Summe von 1 + 1? Das ist eine ziemlich dumme Frage. Es ist für Kinder, die zum ersten Mal Mathe lernen, nicht für uns Erwachsene. Aber schauen Sie sich bitte den folgenden Code an:

-- Variables for input values
DECLARE @value1 DECIMAL(3,2) = 1.05
DECLARE @value2 DECIMAL(3,2) = 1.45
DECLARE @sum1 DECIMAL(3,2) = @value1 + @value2

-- Variables for rounded values
DECLARE @roundedValue1 TINYINT = ROUND(@value1,0)
DECLARE @roundedvalue2 TINYINT = ROUND(@value2,0)
DECLARE @sum2 TINYINT = ROUND(@sum1,0)

-- Surprise!
SELECT 'sum of ' + CAST(@value1 AS VARCHAR(4)) + ' + ' + CAST(@value2 AS VARCHAR(4)) AS Q1,  @sum1 AS Sum1
SELECT 'sum of ' + CAST(@roundedValue1 AS VARCHAR(4)) + ' + ' + CAST(@roundedValue2 AS VARCHAR(4)) AS Q2,  @sum2 AS Sum2

Überprüfen Sie dann die Ergebnisse unten:

Was ist hier passiert? Wir erhalten zwei Werte mit einem Dezimalteil. Dann runden wir sie mit SQL ROUND auf die nächste ganze Zahl. Ihre Summen werden ebenfalls gerundet. Aber wie kann 1 + 1 3 sein?!

Ein scharfsichtiger SQL-Profi wird das Problem im Code sofort erkennen. Aber bedenken Sie Folgendes:

  • Das Runden von 2,5 auf die nächste ganze Zahl ist 3, nicht 2.
  • Die Summe von 1 + 1 ist 2.

Es ist schwer, nicht wahr?

Hier ist der Punkt. Wenn Sie nicht aufpassen, kann SQL ROUND Sie verrückt machen. Dies kann auch eine Quelle von Streitigkeiten zwischen Entwicklern und Buchhaltern sein. Einer davon ist der Umgang mit dem Wesentlichkeitsprinzip. Die Argumente können hässlich werden.

Was können Sie tun?

Rundenfunktion in SQL Server

Nein, ich sage Ihnen nicht, dass Sie dieses Problem an den nächsten Entwickler weitergeben sollen. Dieser Beitrag gibt Ihnen grundlegende Tipps, um sowohl Sie als auch Ihren Benutzer mit dem Ergebnis zufrieden zu stellen. Einige dieser Tipps gelten auch für das Runden einer Zahl auf der Front-End-Seite der App oder in Berichten.

Sehen wir uns unsere 5 Tipps im Detail an.

Rundungsfunktion für Zahlen in SQL

Sie wissen bereits, wie man Zahlen in SQL rundet, also warum fragen? Es geht nicht darum zu fragen, wie. Es geht darum, wann zu fragen. Sie können ähnliche Fragen wie unten stellen:

  • Runden Sie die Eingabewerte, BEVOR Sie Berechnungen durchführen?
  • Oder berechnen Sie die Eingabewerte und runden dann das Ergebnis?

Abhängig von den Berechnungen, die Sie durchführen werden, können weitere Fragen auftreten.

Entscheidend ist, ob Sie die Abrundung Standard oder Modell von den Anwendern erhalten. Dann können Sie dieses Modell verwenden, um Abfragen zu schreiben. Sie nehmen nicht an oder raten, was später zu Meinungsverschiedenheiten führen würde. Und wenn es hilft, diesen Standard als Notiz irgendwo in den Bericht aufzunehmen, tun Sie es.

Ein weiterer Teil des Standards ist die Anzahl der zu verwendenden Dezimalstellen. Was ist, wenn die Tabellenspalte den Datentyp DECIMAL(10,4) hat? Wie werden Sie es auf nur 2 Dezimalstellen runden?

Probieren Sie den folgenden Code aus:

DECLARE @value DECIMAL(10,4)

SET @value = 8346.1556

-- This will result in 8346.16 instead of 8346.1600
SELECT CAST(ROUND(@value, 2) AS DECIMAL(10,2)) 

Der CAST nach der RUNDE zeigt nur zwei Dezimalstellen an. Die beiden Nullen werden abgeschnitten:

Verständnis Wie SQL auf Dezimalstellen rundet

Hier beantworten wir unsere erste Frage. Wenn Sie 1,15 auf die nächsten Zehntel runden, wird es dann 1,2 oder 1,1 sein?

Zuerst überprüfen Sie es mit dem DECIMAL-Datentyp:

DECLARE @value DECIMAL(3,2)

SET @value = 1.15

SELECT @value
SELECT ROUND(@value, 1)  -- This will result in 1.2 or 1.20

Das Ergebnis des obigen Codes ist 1.20 oder 1.2:

Aber was ist, wenn der Datentyp ein FLOAT ist? Versuchen wir, es zu ändern.

DECLARE @value FLOAT

SET @value = 1.15

SELECT @value
SELECT ROUND(@value, 1)  -- This will result to 1.1

Was ist das Ergebnis? Es ist 1.1. Überzeugen Sie sich selbst:

Es ist nicht so, dass ich Ihnen weitere Zweifel einflößen möchte. Sie müssen jedoch wissen, dass diese Datentypen, obwohl sie beide für Zahlen verwendet werden, nicht gleich sind .

  • FLOAT und REAL sind Näherungswerte, die nicht zum Runden empfohlen werden – nicht einmal für Gleichheitsprüfungen in einer WHERE-Klausel.
  • DECIMAL und NUMERIC haben eine feste Genauigkeit und Skalierung, und wir bezeichnen sie als exakte Zahlen. Wenn wir also 1,15 auf die nächsten Zehntel runden, ist die richtige Antwort 1,2.
  • Ganzzahlen sind auch exakte Zahlen. Sie können ganze Ziffern sicher runden.

Das Dilemma beginnt beim Tischdesign. Vielleicht möchten Sie etwas mit FLOAT- oder REAL-Spalten machen, die irgendwo gerundet werden.

3. Verwenden Sie SQL ROUND auf derselben Datenquelle für Konsistenz

Angenommen, Sie müssen mehrere Umsatzberichte erstellen, um unterschiedliche Details anzuzeigen:die Zusammenfassung, die detaillierte Aufschlüsselung nach Typ und die detaillierte Aufschlüsselung nach Quelle. Alle diese drei Berichte behandeln Cents oder Dezimalstellen als unwesentlich. Daher ist das Runden von Werten auf ganze Zahlen unvermeidlich.

Wenden Sie für konsistente Ergebnisse in allen drei Berichten Folgendes an:

  • WÄHLEN Sie aus denselben Basistabellen AUS, um sicherzustellen, dass die Summen aus den Details mit der Zusammenfassung übereinstimmen.
  • Verwenden Sie dasselbe Modell zum Runden (Punkt 1 oben)

Möchten Sie mit diesen Umsatzberichten am Ende mit Ihren Benutzern zufrieden sein? Achten Sie darauf, wo und wie Sie Ihre Zahlen erhalten.

4. SQL BODEN oder DECKE VS RUND

Es kann Fälle geben, in denen Sie auf die nächste ganze Zahl auf- oder abrunden müssen. In diesem Fall ist CEILING() oder FLOOR() die geeignete Wahl anstelle von ROUND()

CEILING() rundet einen Wert auf die nächste Ganzzahl auf:

SELECT CEILING(1);   -- returns 1 
SELECT CEILING(1.6);  -- returns 2
SELECT CEILING(1.4);  -- returns 2

Unterdessen rundet FLOOR() ab:

SELECT FLOOR(1);   -- returns 1 
SELECT FLOOR(2.1); -- returns 2 
SELECT FLOOR(2.9); -- returns 2

5. Testen Sie die Ergebnisse mit Ihren Benutzern

Nachdem Sie alle Abfragen und das Berichtsdesign abgeschlossen haben, besteht der letzte Teil darin, Ihre Arbeit mit den Benutzern zu überprüfen. Wir können Fehler machen, egal wie gut wir sind oder wie hart wir arbeiten. Manchmal brauchen wir ein paar weitere Iterationen, um es richtig hinzubekommen.

Ihre Benutzer verfügen über Testszenarien, die die Genauigkeit der Berichte sicherstellen. Oder sie lässt eine Excel-Datei manuell erstellen, um Ihre Arbeit mit ihrer zu vergleichen. Arbeiten Sie auf jeden Fall mit ihnen an einem besseren System. Sie werden es nicht bereuen.

Schlussfolgerung

Die Arbeit mit SQL ROUND kann manchmal schwierig sein. Die hier vorgestellten Tipps beweisen jedoch, dass man gegen diese Hürden gewinnen kann. Was hast du gelernt?

  • Fragen Sie Ihre Benutzer nach dem Rundungsstandard oder -modell.
  • Kennen Sie den Datentyp, den Sie verwenden.
  • Verwenden Sie ROUND für dieselbe Datenquelle, um Konsistenz zu gewährleisten.
  • Manchmal ist FLOOR oder CEILING angemessener als ROUND.
  • Testen Sie abschließend Ihre Ergebnisse mit Ihren Nutzern.

Ist dieser Beitrag hilfreich? Wenn es für Sie ist, können andere es auch brauchen. Bitte teilen Sie diesen Beitrag in Ihren bevorzugten sozialen Medien.

Verwandte Artikel

  1. Berechnen der laufenden Summe mit OVER-Klausel und PARTITION BY-Klausel in SQL Server
  2. Berechnen Sie den Median mit Transact SQL