sql >> Database >  >> RDS >> Sqlserver

Afronden (OMHOOG/OMLAAG) in SQL Server – 5 handige tips

We hebben geleerd om getallen af ​​te ronden sinds we kinderen waren. Als je 1,15 afrondt op de dichtstbijzijnde tienden, wordt dat dan 1,2 of 1,1? Het gebruik van de SQL ROUND-functie om te antwoorden kan u in verwarring brengen. Later zul je zien wat ik bedoel.

[sendpulse-form id="12010″]

Hier is nog een vraag. Wat is de som van 1 + 1? Dat is nogal een domme vraag. Het is voor kinderen die voor het eerst wiskunde leren, niet voor ons volwassenen. Maar kijk eens naar de onderstaande code:

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

Bekijk dan de resultaten hieronder:

Wat is hier gebeurd? We krijgen twee waarden met een decimaal deel. Vervolgens ronden we ze af met SQL ROUND naar het dichtstbijzijnde gehele getal. Ook hun bedragen zijn afgerond. Maar hoe kan 1 + 1 3 zijn?!

Een scherpzinnige SQL-professional zal het probleem in de code meteen zien. Maar overweeg dit:

  • Afronding van 2,5 op het dichtstbijzijnde gehele getal is 3, niet 2.
  • De som van 1 + 1 is 2.

Het is moeilijk, nietwaar?

Hier is het punt. Als je niet oppast, kan SQL ROUND je gek maken. Dit kan ook een bron van ruzie zijn tussen ontwikkelaars en accountants. Een daarvan is de omgang met het materialiteitsbeginsel. De argumenten kunnen lelijk worden.

Wat kunt u doen?

Afrondingsfunctie in SQL Server

Nee, ik zeg je niet om dit probleem door te geven aan de volgende ontwikkelaar. Dit bericht geeft je essentiële tips om zowel jou als je gebruiker blij te maken met het resultaat. Sommige van deze tips kunnen ook van toepassing zijn op het afronden van een getal aan de voorkant van de app of in rapporten.

Laten we onze 5 tips in detail bekijken.

Afrondingsfunctie voor getallen in SQL

U weet al hoe u getallen in SQL moet afronden, dus waarom vragen? Het gaat er niet om te vragen hoe. Het gaat erom wanneer. U kunt soortgelijke vragen stellen als hieronder:

  • Rondt u de invoerwaarden af ​​VOORDAT u berekeningen uitvoert?
  • Of bereken je de invoerwaarden en rond je het resultaat af?

Afhankelijk van de berekeningen die u gaat maken, kunnen er meer vragen ontstaan.

Het gaat erom of je de afronding standaard of model van de gebruikers krijgt. Vervolgens kunt u dit model gebruiken om query's te schrijven. U neemt niet aan of vermoedt wat later tot onenigheid zou leiden. En als het helpt om deze norm ergens in het rapport op te nemen, doe dat dan.

Een ander onderdeel van de norm is het aantal decimalen dat moet worden gebruikt. Wat als de tabelkolom het gegevenstype DECIMAL(10,4) heeft? Hoe rond je het af op slechts 2 decimalen?

Probeer de onderstaande code:

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

De CAST na de ROUND geeft slechts twee decimalen weer. De twee nullen worden afgekapt:

Begrijpen Hoe SQL naar decimalen afrondt

Hier beantwoorden we onze eerste vraag. Als je 1,15 afrondt op de dichtstbijzijnde tienden, wordt dat dan 1,2 of 1,1?

Eerst controleer je het met het DECIMAL datatype:

DECLARE @value DECIMAL(3,2)

SET @value = 1.15

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

Het resultaat van de bovenstaande code is 1.20 of 1.2:

Maar wat als het gegevenstype een FLOAT is? Laten we proberen het te veranderen.

DECLARE @value FLOAT

SET @value = 1.15

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

Wat is het resultaat? Het is 1.1. Zie het zelf:

Het is niet dat ik u nog meer aan het twijfelen wil brengen. U moet echter weten dat deze gegevenstypen, hoewel beide voor getallen worden gebruikt, niet gelijk zijn gemaakt .

  • FLOAT en REAL zijn benaderende getallen, niet aanbevolen voor afronding - zelfs niet voor gelijkheidscontroles in een WHERE-clausule.
  • DECIMAAL en NUMERIEK hebben een vaste precisie en schaal, en we noemen ze exacte getallen. Daarom, als we 1,15 afronden op de dichtstbijzijnde tienden, is het juiste antwoord 1,2.
  • Gehele getallen zijn ook exacte getallen. Ze zijn veilig voor het afronden van hele cijfers.

Het dilemma begint bij het tafelontwerp. Misschien wil je iets doen aan FLOAT- of REAL-kolommen die ergens worden afgerond.

3. Gebruik SQL ROUND op dezelfde gegevensbron voor consistentie

Stel dat u verschillende omzetrapporten moet maken om verschillende details weer te geven:de samenvatting, de gedetailleerde uitsplitsing per type en de gedetailleerde uitsplitsing per bron. Al deze drie rapporten behandelen centen of decimale delen als onbelangrijk. Het is dus onvermijdelijk om waarden op hele getallen af ​​te ronden.

Pas het volgende toe voor consistente resultaten in alle drie de rapporten:

  • SELECTEER uit dezelfde basistabellen om ervoor te zorgen dat de totalen uit de details consistent zijn met de samenvatting.
  • Gebruik hetzelfde model voor afronding (punt #1 hierboven)

Wilt u tevreden zijn met uw gebruikers op deze inkomstenrapporten? Wees consistent over waar en hoe u uw cijfers krijgt.

4. SQL VLOER of PLAFOND VS ROND

Er kunnen gevallen zijn waarin u naar boven of naar beneden moet afronden op het volgende gehele getal. In dit geval is CEILING() of FLOOR() de juiste keuze in plaats van ROUND()

CEILING() rondt een waarde af op het volgende gehele getal:

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

Ondertussen rondt FLOOR() naar beneden af:

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

5. Test de resultaten met uw gebruikers

Nadat u alle query's en het rapportontwerp hebt voltooid, is het laatste deel het controleren van uw werk met gebruikers. We kunnen fouten maken, hoe goed we ook zijn of hoe hard we ook werken. Soms hebben we nog een paar herhalingen nodig om het goed te doen.

Uw gebruikers beschikken over testscenario's die de nauwkeurigheid van de rapporten garanderen. Of ze kan handmatig een Excel-bestand laten maken om jouw werk met dat van hen te vergelijken. Werk in ieder geval met hen samen voor een beter systeem. Je zult blij zijn dat je het gedaan hebt.

Conclusie

Werken met SQL ROUND kan soms moeilijk zijn. De tips die hier worden gegeven bewijzen echter dat je tegen deze hindernissen kunt winnen. Wat heb je geleerd?

  • Vraag naar de afronding van standaard of model bij uw gebruikers.
  • Weet welk gegevenstype u gebruikt.
  • Gebruik ROUND op dezelfde gegevensbron voor consistentie.
  • Soms is VLOER of PLAFOND geschikter dan ROND.
  • Test ten slotte uw resultaten met uw gebruikers.

Is dit bericht nuttig? Als het iets voor jou is, hebben anderen het misschien ook nodig. Deel dit bericht op je favoriete sociale media.

Verwante artikelen

  1. Het lopende totaal berekenen met OVER-clausule en PARTITION BY-clausule in SQL Server
  2. Bereken de mediaan met behulp van Transact SQL


  1. Pre-UPDATE kolomwaarden retourneren met alleen SQL

  2. Logische databaseback-ups met MySQL Shell

  3. PGEast, Hardware Benchmarking en de PG Performance Farm

  4. Een database reverse engineeren in MySQL Workbench