sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man avrundar (UPP/NER) i SQL Server – 5 användbara tips

Vi har lärt oss att avrunda siffror sedan vi var barn. När du avrundar 1,15 till närmaste tiondelar, blir det 1,2 eller 1,1? Att använda SQL ROUND-funktionen för att svara kan förvirra dig. Senare kommer du att se vad jag menar.

[sendpulse-form id="12010″]

Här är en annan fråga. Vad är summan av 1 + 1? Det är en ganska dum fråga. Det är för barn som lär sig matematik för första gången, inte för oss vuxna. Men ta en titt på koden nedan:

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

Kontrollera sedan resultaten nedan:

Vad har hänt här? Vi får två värden med en decimaldel. Sedan avrundar vi dem med SQL ROUND till närmaste heltal. Deras summor är också avrundade. Men hur kan 1 + 1 vara 3?!

En skarpögd SQL-proffs kommer att upptäcka problemet i koden på en gång. Men tänk på detta:

  • Avrundning av 2,5 till närmaste heltal är 3, inte 2.
  • Summan av 1 + 1 är 2.

Det är svårt, eller hur?

Här är poängen. Om du inte är försiktig kan SQL ROUND göra dig galen. Detta kan också vara en källa till argument mellan utvecklare och revisorer. En av dessa är när man behandlar väsentlighetsprincipen. Argumenten kan bli fula.

Vad kan du göra?

Runda funktion i SQL Server

Nej, jag säger inte till dig att skicka det här problemet till nästa utvecklare. Det här inlägget kommer att ge dig viktiga tips för att göra både dig och din användare nöjda med resultatet. Vissa av dessa tips kan också gälla avrundning av ett nummer på appens front-end-sida eller i rapporter.

Låt oss kontrollera våra 5 tips i detalj.

Avrunda funktion för tal i SQL

Du vet redan hur man avrundar tal i SQL så varför fråga? Det handlar inte om att fråga hur. Det handlar om att fråga när. Du kan ställa liknande frågor som nedan:

  • Rundar du av ingångsvärdena INNAN du gör beräkningar?
  • Eller beräknar du ingångsvärdena och avrundar sedan resultatet?

Fler frågor kan uppstå beroende på vilka beräkningar du ska göra.

Poängen är om du får den avrundade standarden eller modellen från användarna. Sedan kan du använda den här modellen för att skriva frågor. Du antar eller gissar inte vad som skulle leda till oenighet senare. Och om det hjälper att inkludera denna standard som en anteckning någonstans i rapporten, gör det.

En annan del av standarden är hur många decimaler som ska användas. Vad händer om tabellkolumnen har datatypen DECIMAL(10,4)? Hur avrundar du det till endast två decimaler?

Prova koden nedan:

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

CAST efter ROUND visar endast två decimaler. De två nollorna kommer att trunkeras:

Förstå Hur SQL avrundar till decimaler

Här svarar vi på vår första fråga. När du avrundar 1,15 till närmaste tiondelar, blir det 1,2 eller 1,1?

Först kontrollerar du det med datatypen DECIMAL:

DECLARE @value DECIMAL(3,2)

SET @value = 1.15

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

Resultatet av koden ovan är 1,20 eller 1,2:

Men vad händer om datatypen är en FLOAT? Låt oss försöka ändra det.

DECLARE @value FLOAT

SET @value = 1.15

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

Vad är resultatet? Det är 1.1. Se det själv:

Det är inte så att jag vill ge dig fler tvivel. Du måste dock veta att dessa datatyper, även om båda används för siffror, inte skapas lika .

  • FLOAT och REAL är ungefärliga siffror, rekommenderas inte för avrundning – inte ens för likhetskontroller i en WHERE-sats.
  • DECIMAL och NUMERIC har fast precision och skala, och vi hänvisar till dem som exakta siffror. Därför, när vi avrundar 1,15 till närmaste tiondelar är det korrekta svaret 1,2.
  • Heltal är också exakta siffror. De är säkra för avrundning av hela siffror.

Dilemmat utgår från bordsdesignen. Du kanske vill göra något åt ​​FLOAT eller REAL kolumner som kommer att rundas av någonstans.

3. Använd SQL ROUND på samma datakälla för konsistens

Anta att du behöver skapa flera intäktsrapporter för att visa olika detaljer:sammanfattningen, den detaljerade uppdelningen efter typ och den detaljerade uppdelningen efter källa. Alla dessa tre rapporter kommer att behandla cent eller decimaldelar som oväsentliga. Så det är oundvikligt att avrunda värden till heltal.

För konsekventa resultat i alla tre rapporterna, använd följande:

  • VÄLJ från samma bastabeller för att säkerställa att totalsummor från detaljerna överensstämmer med sammanfattningen.
  • Använd samma modell för avrundning (punkt #1 ovan)

Vill du bli nöjd med dina användare på dessa intäktsrapporter? Var konsekvent med var och hur du får dina siffror.

4. SQL GOLV eller TAK VS RUNDA

Det kan finnas fall där du måste avrunda uppåt eller nedåt till nästa heltal. I det här fallet är CEILING() eller FLOOR() det lämpliga valet istället för ROUND()

CEILING() avrundar ett värde till nästa heltal:

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

Under tiden rundar FLOOR() ned:

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

5. Testa resultaten med dina användare

När du har slutfört alla frågor och rapportdesign, är den sista delen att kontrollera ditt arbete med användarna. Vi kan göra misstag oavsett hur bra vi är eller hur hårt vi jobbar. Ibland behöver vi några fler iterationer för att få det rätt.

Dina användare kommer att ha testscenarier som säkerställer att rapporterna är korrekta. Eller så kan hon låta göra en Excel-fil manuellt för att jämföra ditt arbete med deras. I alla fall, arbeta med dem för ett bättre system. Du kommer att vara glad att du gjorde det.

Slutsats

Att arbeta med SQL ROUND kan ibland vara svårt. Men tipsen som presenteras här bevisar att du kan vinna mot dessa hinder. Vad har du lärt dig?

  • Be om avrundningsstandarden eller modellen från dina användare.
  • Känn vilken datatyp du använder.
  • Använd ROUND på samma datakälla för konsekvens.
  • Ibland kan GOLV eller TAK vara lämpligt än RUNDT.
  • Test slutligen dina resultat med dina användare.

Är det här inlägget användbart? Om det är för dig kan andra behöva det också. Dela det här inlägget på dina favorit sociala medier.

Relaterade artiklar

  1. Beräkna löpande totalsumma med OVER-klausul och PARTITION BY-sats i SQL Server
  2. Beräkna medianen genom att använda Transact SQL


  1. Ändra ett SQL Server Agent Job (T-SQL)

  2. Hur undviker man flera funktionsevaler med syntaxen (func()).* i en SQL-fråga?

  3. SLIPP TABELL OM FINNS i MariaDB

  4. MySQL DATEDIFF() vs TIMESTAMPDIFF():Vad är skillnaden?