sql >> Databáze >  >> RDS >> Sqlserver

Jak zaokrouhlit (nahoru/dolů) v SQL Server – 5 užitečných tipů

Odmalička nás učili zaokrouhlovat čísla. Když zaokrouhlíte 1,15 na nejbližší desetiny, bude to 1,2 nebo 1,1? Použití funkce SQL ROUND k odpovědi vás může zmást. Později uvidíte, co tím myslím.

[sendpulse-form id=”12010″]

Zde je další otázka. Jaký je součet 1 + 1? To je docela hloupá otázka. Je to pro děti, které se učí matematiku poprvé, ne pro nás dospělé. Ale podívejte se prosím na kód níže:

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

Pak zkontrolujte výsledky níže:

co se tu stalo? Dostaneme dvě hodnoty s desetinnou částí. Poté je zaokrouhlíme pomocí SQL ROUND na nejbližší celé číslo. Jejich součty jsou také zaokrouhleny. Ale jak může 1 + 1 být 3?!

Bystrozraký SQL profík okamžitě odhalí problém v kódu. Ale zvažte toto:

  • Zaokrouhlení 2,5 na nejbližší celé číslo je 3, nikoli 2.
  • Součet 1 + 1 je 2.

Je to těžké, že?

Tady je pointa. Pokud si nedáte pozor, SQL ROUND vás může zbláznit. I to může být zdrojem hádek mezi vývojáři a účetními. Jedním z nich je, když se zabýváme zásadou významnosti. Argumenty mohou být ošklivé.

Co můžete dělat?

Kulatá funkce na serveru SQL Server

Ne, neříkám vám, abyste tento problém předali dalšímu vývojáři. Tento příspěvek vám poskytne základní tipy, abyste s výsledkem byli spokojeni vy i váš uživatel. Některé z těchto tipů lze také použít při zaokrouhlování čísla na front-endové straně aplikace nebo v přehledech.

Pojďme se podrobně podívat na našich 5 tipů.

Funkce zaokrouhlení pro čísla v SQL

Už víte, jak zaokrouhlovat čísla v SQL, tak proč se ptát? Nejde o to se ptát jak. Jde o to zeptat se kdy. Můžete se zeptat na podobné otázky jako níže:

  • Zaokrouhlujete vstupní hodnoty PŘED prováděním výpočtů?
  • Nebo vypočítáte vstupní hodnoty a pak zaokrouhlíte výsledek?

Další otázky mohou vyvstat v závislosti na výpočtech, které budete provádět.

Jde o to, zda od uživatelů získáte zaokrouhlovací standard nebo model. Pak můžete tento model použít k psaní dotazů. Nepředpokládáte ani nehádáte, co by později vedlo k nesouhlasu. A pokud pomůže zahrnout tento standard jako poznámku někde ve zprávě, udělejte to.

Další součástí standardu je, kolik desetinných míst použít. Co když má sloupec tabulky datový typ DECIMAL(10,4)? Jak jej zaokrouhlíte pouze na 2 desetinná místa?

Zkuste kód níže:

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 po ROUND zobrazí pouze dvě desetinná místa. Dvě nuly budou zkráceny:

Porozumění Jak SQL zaokrouhlovat na desetinná místa

Zde odpovídáme na naši první otázku. Když zaokrouhlíte 1,15 na nejbližší desetiny, bude to 1,2 nebo 1,1?

Nejprve jej zkontrolujete pomocí datového typu 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

Výsledek výše uvedeného kódu je 1,20 nebo 1,2:

Ale co když je datový typ FLOAT? Zkusme to změnit.

DECLARE @value FLOAT

SET @value = 1.15

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

Jaký je výsledek? Je 1.1. Podívejte se na to sami:

Není to tak, že bych vám chtěl přinášet další pochybnosti. Musíte však vědět, že tyto datové typy, přestože se oba používají pro čísla, nejsou vytvořeny jako rovnocenné .

  • FLOAT a REAL jsou přibližná čísla, nedoporučují se pro zaokrouhlování – a to ani pro kontrolu rovnosti v klauzuli WHERE.
  • DECIMAL a NUMERIC mají pevnou přesnost a měřítko a označujeme je jako přesné číslice. Když tedy zaokrouhlíme 1,15 na nejbližší desetiny, správná odpověď je 1,2.
  • Celá čísla jsou také přesná čísla. Jsou bezpečné pro zaokrouhlování celých číslic.

Dilema začíná u návrhu stolu. Možná budete chtít udělat něco se sloupci FLOAT nebo REAL, které budou někde zaokrouhleny.

3. Použijte SQL ROUND na stejném zdroji dat pro konzistenci

Předpokládejme, že potřebujete vytvořit několik přehledů příjmů, abyste zobrazili různé podrobnosti:souhrn, podrobné rozdělení podle typu a podrobné rozdělení podle zdroje. Všechny tyto tři zprávy budou považovat centy nebo desetinné části za nepodstatné. Zaokrouhlení hodnot na celá čísla je tedy nevyhnutelné.

Pro konzistentní výsledky ve všech třech sestavách použijte následující:

  • VYBERTE ze stejných základních tabulek, abyste zajistili, že součty z podrobností budou konzistentní se souhrnem.
  • Pro zaokrouhlení použijte stejný model (bod č. 1 výše)

Chcete, aby byli uživatelé v těchto přehledech tržeb spokojeni? Buďte konzistentní v tom, kde a jak získáte svá čísla.

4. SQL PODLAŽÍ nebo STROP VS KOLA

Mohou nastat případy, kdy musíte zaokrouhlit nahoru nebo dolů na další celé číslo. V tomto případě je vhodnou volbou CEILING() nebo FLOOR() namísto ROUND()

CEILING() zaokrouhlí hodnotu nahoru na následující celé číslo:

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

Mezitím FLOOR() zaokrouhlí dolů:

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

5. Otestujte výsledky se svými uživateli

Po dokončení všech dotazů a návrhu sestavy je poslední částí kontrola vaší práce s uživateli. Můžeme dělat chyby bez ohledu na to, jak jsme dobří nebo jak tvrdě pracujeme. Někdy potřebujeme několik dalších iterací, abychom to udělali správně.

Vaši uživatelé budou mít testovací scénáře, které zajistí přesnost zpráv. Nebo může nechat ručně vytvořit soubor Excel, aby porovnala vaši práci s jejich. V každém případě s nimi pracujte na lepším systému. Budete rádi, že jste to udělali.

Závěr

Práce s SQL ROUND může být občas obtížná. Zde uvedené tipy však dokazují, že proti těmto překážkám můžete vyhrát. Co jste se naučili?

  • Požádejte své uživatele o zaokrouhlení standardu nebo modelu.
  • Znáte typ dat, který používáte.
  • Pro zajištění konzistence použijte ROUND na stejném zdroji dat.
  • Někdy může být vhodnější FLOOR nebo STROP než ROUND.
  • Nakonec otestujte své výsledky se svými uživateli.

Je tento příspěvek užitečný? Pokud je to pro vás, mohou to potřebovat i ostatní. Sdílejte prosím tento příspěvek na svých oblíbených sociálních sítích.

Související články

  1. Výpočet průběžného součtu pomocí klauzule OVER a klauzule PARTITION BY v SQL Server
  2. Vypočítejte medián pomocí Transact SQL


  1. Jak provést bodovou obnovu dat MySQL a MariaDB pomocí ClusterControl

  2. Mohu použít PDO připravený příkaz k navázání identifikátoru (název tabulky nebo pole) nebo klíčového slova syntaxe?

  3. Proč mi použití znaku podtržítka ve filtru LIKE poskytuje všechny výsledky?

  4. Jak změním typ sloupce v Heroku?