sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan rundes (OP/NED) i SQL Server – 5 nyttige tips

Vi er blevet lært at runde tal, siden vi var børn. Når du runder 1,15 af til nærmeste tiendedel, bliver det så 1,2 eller 1,1? Brug af SQL ROUND-funktionen til at svare kan forvirre dig. Senere vil du se, hvad jeg mener.

[sendpulse-form id="12010″]

Her er et andet spørgsmål. Hvad er summen af ​​1 + 1? Det er et ret dumt spørgsmål. Det er for børn, der lærer matematik for første gang, ikke for os voksne. Men tag et kig på koden nedenfor:

-- Variabler for inputværdierDEKLARE @værdi1 DECIMAL(3,2) =1,05DECLARE @værdi2 DECIMAL(3,2) =1,45DECLARE @sum1 DECIMAL(3,2) =@værdi1 + @værdi2-- Variabler for afrundede værdierDECLARE @roundedValue1 TINYINT =ROUND(@value1,0)DECLARE @roundedvalue2 TINYINT =ROUND(@value2,0)DECLARE @sum2 TINYINT =ROUND(@sum1,0)-- Overraskelse!VÆLG 'summen af ​​' + CAST (@value1 AS VARCHAR(4)) + ' + ' + CAST(@value2 AS VARCHAR(4)) AS Q1, @sum1 AS Sum1SELECT 'sum of ' + CAST(@roundedValue1 AS VARCHAR(4)) + ' + ' + CAST(@roundedValue2 AS VARCHAR(4)) AS Q2, @sum2 AS Sum2

Tjek derefter resultaterne nedenfor:

Hvad er der sket her? Vi får to værdier med en decimaldel. Derefter runder vi dem ved hjælp af SQL ROUND til nærmeste hele tal. Deres beløb er også afrundet. Men hvordan kan 1 + 1 være 3?!

En skarpøjet SQL pro vil opdage problemet i koden med det samme. Men overvej dette:

  • At afrunde 2,5 til det nærmeste hele tal er 3, ikke 2.
  • Summen af ​​1 + 1 er 2.

Det er svært, ikke?

Her er pointen. Hvis du ikke er forsigtig, kan SQL ROUND gøre dig skør. Dette kan også være en kilde til argumenter mellem udviklere og revisorer. En af disse er, når man beskæftiger sig med væsentlighedsprincippet. Argumenterne kan blive grimme.

Hvad kan du gøre?

Runde funktion i SQL Server

Nej, jeg fortæller dig ikke, at du skal videregive dette problem til den næste udvikler. Dette indlæg vil give dig essentielle tips til at gøre både dig og din bruger glade for resultatet. Nogle af disse tips kan også gælde for afrunding af et tal på appens frontend-side eller i rapporter.

Lad os tjekke vores 5 tips i detaljer.

Afrund funktion for tal i SQL

Du ved allerede, hvordan man afrunder tal i SQL, så hvorfor spørge? Det handler ikke om at spørge hvordan. Det handler om at spørge hvornår. Du kan stille lignende spørgsmål som nedenfor:

  • Afrunder du inputværdierne, FØR du laver beregninger?
  • Eller beregner du inputværdierne og runder derefter resultatet af?

Flere spørgsmål kan opstå afhængigt af de beregninger, du skal lave.

Pointen er, om du får afrundingen standard eller model fra brugerne. Så kan du bruge denne model til at skrive forespørgsler. Du antager eller gætter ikke, hvad der ville føre til uenighed senere. Og hvis det hjælper at inkludere denne standard som en note et sted i rapporten, så gør det.

En anden del af standarden er, hvor mange decimaler der skal bruges. Hvad hvis tabelkolonnen har datatypen DECIMAL(10,4)? Hvordan vil du afrunde det til kun 2 decimaler?

Prøv koden nedenfor:

DECLARE @value DECIMAL(10,4)SET @value =8346.1556-- Dette vil resultere i 8346.16 i stedet for 8346.1600SELECT CAST(ROUND(@value, 2) AS DECIMAL(10,2))  

CAST efter RUNDEN vil kun vise to decimaler. De to nuller vil blive afkortet:

Forståelse Sådan afrundes SQL til decimaler

Her besvarer vi vores første spørgsmål. Når du runder 1,15 af til nærmeste tiendedel, bliver det så 1,2 eller 1,1?

Først tjekker du det med DECIMAL-datatypen:

DECLARE @value DECIMAL(3,2)SET @value =1,15SELECT @valueSELECT ROUND(@value, 1) -- Dette vil resultere i 1,2 eller 1,20 

Resultatet af koden ovenfor er 1.20 eller 1.2:

Men hvad hvis datatypen er en FLOAT? Lad os prøve at ændre det.

DECLARE @value FLOATSET @value =1,15SELECT @valueSELECT ROUND(@value, 1) -- Dette vil resultere til 1,1 

Hvad er resultatet? Det er 1.1. Se det selv:

Det er ikke fordi, jeg vil give dig mere tvivl. Du skal dog vide at disse datatyper, selvom de begge bruges til tal, ikke er skabt ens .

  • FLOAT og REAL er omtrentlige tal, anbefales ikke til afrunding – heller ikke til lighedstjek i en WHERE-klausul.
  • DECIMAL og NUMERIC har fast præcision og skala, og vi omtaler dem som nøjagtige tal. Derfor, når vi runder 1,15 af til nærmeste tiendedel, er det rigtige svar 1,2.
  • Heltal er også nøjagtige tal. De er sikre til at afrunde hele cifre.

Dilemmaet starter fra borddesignet. Du vil måske gøre noget ved FLOAT eller REAL kolonner, der vil blive rundet af et sted.

3. Brug SQL ROUND på den samme datakilde for konsistens

Antag, at du skal oprette flere indtægtsrapporter for at vise forskellige detaljer:oversigten, den detaljerede opdeling efter type og den detaljerede opdeling efter kilde. Alle disse tre rapporter vil behandle cents eller decimaldele som uvæsentlige. Så det er uundgåeligt at afrunde værdier til hele tal.

Anvend følgende for at få ensartede resultater i alle tre rapporter:

  • VÆLG fra de samme basistabeller for at sikre, at totaler fra detaljerne stemmer overens med oversigten.
  • Brug samme model til afrunding (punkt #1 ovenfor)

Ønsker du at blive glad for dine brugere på disse indtægtsrapporter? Vær konsekvent med, hvor og hvordan du får dine tal.

4. SQL GULV eller LOFT VS RUND

Der kan være tilfælde, hvor du skal runde op eller ned til næste hele tal. I dette tilfælde er CEILING() eller FLOOR() det passende valg i stedet for ROUND()

CEILING() runder en værdi op til det næste heltal:

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

I mellemtiden runder FLOOR() ned:

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

5. Test resultaterne med dine brugere

Når du har gennemført alle forespørgsler og rapportdesign, er den sidste del at kontrollere dit arbejde med brugerne. Vi kan begå fejl, uanset hvor gode vi er, eller hvor hårdt vi arbejder. Nogle gange har vi brug for et par flere gentagelser for at få det rigtigt.

Dine brugere vil have testscenarier, der sikrer nøjagtigheden af ​​rapporterne. Eller hun kan få lavet en Excel-fil manuelt for at sammenligne dit arbejde med deres. Under alle omstændigheder, arbejd med dem for et bedre system. Du vil være glad for, at du gjorde det.

Konklusion

At arbejde med SQL ROUND kan til tider være svært. Men tipsene, der præsenteres her, beviser, at du kan vinde mod disse forhindringer. Hvad har du lært?

  • Spørg efter afrundingsstandarden eller modellen fra dine brugere.
  • Kend den datatype, du bruger.
  • Brug ROUND på den samme datakilde for at opnå konsistens.
  • Nogle gange kan GULV eller LOFT være passende end RUNDT.
  • Test endelig dine resultater med dine brugere.

Er dette indlæg nyttigt? Hvis det er til dig, kan andre også have brug for det. Del venligst dette opslag på dine foretrukne sociale medier.

Relaterede artikler

  1. Beregning af løbende total med OVER-klausul og PARTITION BY-klausul i SQL Server
  2. Beregn medianen ved at bruge Transact SQL


  1. Hvad gør pg_escape_string præcist?

  2. PRINT-sætning i T-SQL

  3. Fuld gendannelse af en MySQL eller MariaDB Galera Cluster fra backup

  4. Afkorte alle tabeller i en MySQL-database i én kommando?