Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zaokrąglać (GÓRA/DÓŁ) w SQL Server – 5 przydatnych wskazówek

Od dzieciństwa uczono nas zaokrąglania liczb. Kiedy zaokrąglisz 1,15 do najbliższych dziesiątych części, to będzie 1,2 czy 1,1? Użycie funkcji SQL ROUND do odpowiedzi może Cię zmylić. Później zobaczysz, o co mi chodzi.

[sendpulse-form id=”12010″]

Oto kolejne pytanie. Jaka jest suma 1 + 1? To dość głupie pytanie. To jest dla dzieci uczących się matematyki po raz pierwszy, a nie dla nas dorosłych. Ale spójrz na poniższy kod:

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

Następnie sprawdź wyniki poniżej:

Co się tutaj stało? Otrzymujemy dwie wartości z częścią dziesiętną. Następnie zaokrąglamy je za pomocą SQL ROUND do najbliższej liczby całkowitej. Ich sumy również są zaokrąglane. Ale jak 1 + 1 może być 3?!

Bystrooki profesjonalista SQL natychmiast dostrzeże problem w kodzie. Ale rozważ to:

  • Zaokrąglanie 2,5 do najbliższej liczby całkowitej to 3, a nie 2.
  • Suma 1 + 1 to 2.

To trudne, prawda?

Oto punkt. Jeśli nie będziesz ostrożny, SQL ROUND może doprowadzić Cię do szału. Może to być również źródłem kłótni między deweloperami a księgowymi. Jednym z nich jest zajmowanie się zasadą materialności. Kłótnie mogą być brzydkie.

Co możesz zrobić?

Okrągła funkcja w SQL Server

Nie, nie mówię, żebyś przekazywał ten problem następnemu programiście. W tym poście znajdziesz najważniejsze wskazówki, które sprawią, że zarówno Ty, jak i Twój użytkownik będziecie zadowoleni z wyniku. Niektóre z tych wskazówek mogą również dotyczyć zaokrąglania liczby w interfejsie aplikacji lub w raportach.

Sprawdźmy szczegółowo nasze 5 wskazówek.

Funkcja zaokrąglania liczb w SQL

Wiesz już, jak zaokrąglać liczby w SQL, więc po co pytać? Nie chodzi o pytanie jak. Chodzi o pytanie, kiedy. Możesz zadać podobne pytania, jak poniżej:

  • Czy zaokrąglasz wartości wejściowe PRZED wykonaniem obliczeń?
  • A może obliczasz wartości wejściowe, a następnie zaokrąglasz wynik?

W zależności od obliczeń, które zamierzasz wykonać, może pojawić się więcej pytań.

Chodzi o to, czy otrzymasz od użytkowników zaokrąglenie standardu lub modelu. Następnie możesz użyć tego modelu do pisania zapytań. Nie zakładasz ani nie zgadujesz, co później doprowadziłoby do nieporozumień. A jeśli warto umieścić ten standard jako notatkę gdzieś w raporcie, zrób to.

Inną częścią standardu jest liczba miejsc po przecinku, których należy użyć. Co się stanie, jeśli kolumna tabeli ma typ danych DECIMAL(10,4)? Jak zaokrąglisz to tylko do 2 miejsc po przecinku?

Wypróbuj poniższy kod:

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 wyświetli tylko dwa miejsca po przecinku. Dwa zera zostaną obcięte:

Zrozumienie Jak SQL zaokrąglać do miejsc dziesiętnych

Tutaj odpowiadamy na nasze pierwsze pytanie. Kiedy zaokrąglisz 1,15 do najbliższych dziesiątych części, czy będzie to 1,2 czy 1,1?

Najpierw sprawdzasz to za pomocą typu danych 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

Wynik powyższego kodu to 1.20 lub 1.2:

Ale co, jeśli typ danych to FLOAT? Spróbujmy to zmienić.

DECLARE @value FLOAT

SET @value = 1.15

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

Jaki jest wynik? To 1,1. Zobacz to na własne oczy:

Nie chodzi o to, że chcę Wam dawać więcej wątpliwości. Musisz jednak wiedzieć, że te typy danych, chociaż oba używane do liczb, nie są sobie równe .

  • FLOAT i REAL to przybliżone wartości liczbowe, niezalecane do zaokrąglania – nawet do sprawdzania równości w klauzuli WHERE.
  • DECIMAL i NUMERIC mają stałą precyzję i skalę, i nazywamy je dokładnymi liczbami. Dlatego, gdy zaokrąglamy 1,15 do najbliższych dziesiątych części, prawidłowa odpowiedź to 1,2.
  • Liczby całkowite są również dokładnymi liczbami. Są bezpieczne przy zaokrąglaniu całych cyfr.

Dylemat zaczyna się od projektu stołu. Możesz zrobić coś z kolumnami FLOAT lub REAL, które zostaną gdzieś zaokrąglone.

3. Użyj SQL ROUND w tym samym źródle danych, aby zachować spójność

Załóżmy, że musisz utworzyć kilka raportów przychodów, aby pokazać różne szczegóły:podsumowanie, szczegółowy podział według typu i szczegółowy podział według źródła. Wszystkie te trzy raporty będą traktować centy lub części dziesiętne jako nieistotne. Tak więc zaokrąglanie wartości do liczb całkowitych jest nieuniknione.

Aby uzyskać spójne wyniki we wszystkich trzech raportach, zastosuj następujące czynności:

  • WYBIERZ z tych samych tabel podstawowych, aby upewnić się, że sumy ze szczegółów są zgodne z podsumowaniem.
  • Użyj tego samego modelu do zaokrąglania (punkt #1 powyżej)

Czy chcesz, aby Twoi użytkownicy byli zadowoleni z tych raportów o przychodach? Bądź konsekwentny w kwestii tego, gdzie i jak zdobywasz swoje liczby.

4. SQL PIĘTRO lub SUFITOWY VS OKRĄGŁY

Może się zdarzyć, że będziesz musiał zaokrąglić w górę lub w dół do następnej liczby całkowitej. W takim przypadku odpowiednim wyborem jest CEILING() lub FLOOR() zamiast ROUND()

CEILING() zaokrągla wartość do następnej liczby całkowitej:

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

Tymczasem FLOOR() zaokrągla w dół:

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

5. Przetestuj wyniki ze swoimi użytkownikami

Po wykonaniu wszystkich zapytań i zaprojektowaniu raportu, ostatnią częścią jest sprawdzenie pracy z użytkownikami. Możemy popełniać błędy bez względu na to, jak dobrzy jesteśmy i jak ciężko pracujemy. Czasami potrzebujemy kilku dodatkowych iteracji, aby zrobić to dobrze.

Twoi użytkownicy będą mieli scenariusze testowe, które zapewnią dokładność raportów. Lub może zlecić ręczne wykonanie pliku Excel, aby porównać twoją pracę z ich pracą. W każdym razie pracuj z nimi, aby uzyskać lepszy system. Będziesz zadowolony, że tak zrobiłeś.

Wniosek

Praca z SQL ROUND może być czasami trudna. Przedstawione tu wskazówki udowadniają jednak, że z tymi przeszkodami można wygrać. Czego się nauczyłeś?

  • Poproś użytkowników o zaokrąglenie standardu lub modelu.
  • Poznaj typ danych, którego używasz.
  • Użyj ROUND w tym samym źródle danych, aby zachować spójność.
  • Czasami FLOOR lub CEILING mogą być odpowiednie niż ROUND.
  • Na koniec przetestuj swoje wyniki z użytkownikami.

Czy ten post jest pomocny? Jeśli jest dla Ciebie, inni też mogą tego potrzebować. Udostępnij ten post w swoich ulubionych mediach społecznościowych.

Powiązane artykuły

  1. Obliczanie sumy bieżącej z klauzulą ​​OVER i klauzulą ​​PARTITION BY w SQL Server
  2. Oblicz medianę za pomocą języka Transact SQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server IF a IIF():jaka jest różnica?

  2. SQL — wywołanie procedury składowanej dla każdego rekordu

  3. Sprawdź miejsce używane przez tabelę w SQL Server

  4. Zamiast wyzwalacza w SQL Server traci SCOPE_IDENTITY?

  5. Jak ustawić zmienną z zapytania SQL?