Data: 1.02.2026

Funkcje matematyczne w SQL Server – praca na liczbach
Spis treści
- Funkcje matematyczne w SQL Server – praca na liczbach
Poznaj najważniejsze funkcje matematyczne w SQL Server, które ułatwią Ci operacje na danych liczbowych. W tym artykule pokazujemy praktyczne przykłady ich zastosowania w zapytaniach SQL.
Funkcje matematyczne w SQL Server – praca na liczbach
Funkcje matematyczne w SQL Server stanowią podstawowe narzędzie pracy z danymi liczbowymi w zapytaniach SQL. Umożliwiają one wykonywanie obliczeń, zaokrągleń oraz przekształceń wartości liczbowych bezpośrednio na poziomie bazy danych.
Podstawowe zaokrąglanie liczb
SQL Server oferuje funkcje ROUND(), CEILING() i FLOOR(), które umożliwiają sterowanie sposobem zaokrąglania wartości liczbowych.
Funkcja ROUND()
Funkcja ROUND() służy do zaokrąglania wartości liczbowych do określonej liczby miejsc dziesiętnych lub – w przypadku liczb całkowitych – do dziesiątek, setek itd.
Składnia funkcji:
ROUND(expression, precision, [, function])
- expression- liczba, którą chcesz zaokrąglić
- precision – określa, do ilu miejsc nastąpi zaokrąglenie
- function – argument opcjonalny, jeśli zostanie podany następuje obcięcie wartości bez zaokrąglania
W przykładzie poniżej zaokrąglamy wartość w kolumnie UnitPrice (cena jednostkowa) do dwóch miejsc po przecinku.
SELECT UnitPrice,ROUND(UnitPrice, 2) AS round_dwaFROM Sales.SalesOrderDetail;Wynik:
| UnitPrice | round_dwa |
|---|---|
| 29,994 | 29,99 |
| 24,294 | 24,29 |
| 149,874 | 149,87 |
Jeśli w drugim argumencie podamy zero, nastąpi zaokrąglenie do najbliższej liczby całkowitej
SELECT UnitPrice,ROUND(UnitPrice,0) as round_zeroFROM Sales.SalesOrderDetail;Wynik:
| UnitPrice | round_zero |
|---|---|
| 29,994 | 30,00 |
| 24,294 | 24,00 |
| 149,874 | 150,00 |
Jeśli w drugim argumencie podamy ujemną wartość, nastąpi zaokrąglenie cyfr przed przecinkiem do dziesiątek, setek lub tysięcy.
Przykładowo, jeśli podamy -1 nastąpi zaokrąglenie do najbliższej dziesiątki.
SELECT UnitPrice, ROUND(UnitPrice,-1) as round_minusFROM Sales.SalesOrderDetail;Wynik:
| UnitPrice | round_minus |
|---|---|
| 29,994 | 30,00 |
| 24,294 | 20,00 |
| 149,874 | 150,00 |
W funkcji ROUND() możemy podać trzeci argument:
- wartość 0 (zero) oznacza zaokrąglenie matematyczne
- dowolna wartość różna od zera powoduje obcięcie liczby zamiast jej zaokrąglenia
SELECT UnitPrice, ROUND(UnitPrice,1,1) as round_truncFROM Sales.SalesOrderDetail;Wynik:
| UnitPrice | round_trunc |
|---|---|
| 29,994 | 29,90 |
| 24,294 | 24,20 |
| 149,874 | 149,80 |
Funkcja CEILING()
Funkcja CEILING() w SQL Server zwraca najmniejszą liczbę całkowitą, która jest większa lub równa podanej wartości (zaokrąglanie w górę).
Składnia funkcji:
CEILING(expression)
W miejsce argumentu expression podajemy wartość, którą chcemy zaokrąglić.
SELECT UnitPrice, CEILING(UnitPrice) as wyn_ceilingFROM Sales.SalesOrderDetail;Wynik:
| UnitPrice | wyn_ceiling |
|---|---|
| 29,994 | 30,00 |
| 24,294 | 25,00 |
| 149,874 | 150,00 |
Funkcja FLOOR()
Funkcja FLOOR() w SQL Server zwraca największą liczbę całkowitą, która jest mniejsza lub równa podanej wartości (zaokrąglanie w dół).
Składnia funkcji:
FLOOR(expression)
W miejsce argumentu expression podajemy wartość, którą chcemy zaokrąglić.
SELECT UnitPrice, FLOOR(UnitPrice) as wyn_floorFROM Sales.SalesOrderDetail;Wynik:
| UnitPrice | wyn_floor |
|---|---|
| 29,994 | 29,00 |
| 24,294 | 24,00 |
| 149,874 | 149,00 |
Poniżej znajdziesz wyniki działania opisanych funkcji zaokrąglających.
SELECT UnitPrice,ROUND(UnitPrice,2) as round_dwa,ROUND(UnitPrice,0) as round_zero,ROUND(UnitPrice,-1) as round_minus,ROUND(UnitPrice,1,1) as round_trunc,CEILING(UnitPrice) as wyn_ceiling,FLOOR(UnitPrice) as wyn_floorFROM Sales.SalesOrderDetail;| UnitPrice | round_dwa | round_zero | round_minus | round_trunc | wyn_ceiling | wyn_floor |
|---|---|---|---|---|---|---|
| 2024,994 | 2024,99 | 2025,00 | 2020,00 | 2024,90 | 2025,00 | 2024,00 |
| 28,8404 | 28,84 | 29,00 | 30,00 | 28,80 | 29,00 | 28,00 |
| 5,1865 | 5,19 | 5,00 | 10,00 | 5,10 | 6,00 | 5,00 |
| 20,1865 | 20,19 | 20,00 | 20,00 | 20,10 | 21,00 | 20,00 |
| 419,4589 | 419,46 | 419,00 | 420,00 | 419,40 | 420,00 | 419,00 |
Wartość bezwzględna i znak liczby
SQL Server oferuje funkcje ABS() oraz SIGN(), które są przydatne do analizy danych, obliczania odchyleń czy weryfikacji trendów biznesowych.
Funkcja ABS()
Funkcja ABS() służy do zwracania wartości bezwzględnej podanej liczby. Usuwa ona znak minusa z liczb ujemnych, a liczby dodatnie pozostawia bez zmian.
Składnia funkcji:
ABS(expression)
W miejsce argumentu expression podajemy wartość liczbową, dla której chcemy otrzymać wartość bezwzględną.
SELECT SalesYTD,SalesLastYear,(SalesYTD-SalesLastYear) as różnica,ABS(SalesYTD-SalesLastYear) as różnica_absFROM Sales.SalesPerson;Wynik:
| SalesYTD | SalesLastYear | różnica | różnica_abs |
|---|---|---|---|
| 3763178,1787 | 1750406,4785 | 2012771,7002 | 2012771,7002 |
| 1453719,4653 | 1620276,8966 | -166557,4313 | 166557,4313 |
Funkcja SIGN()
Funkcja SIGN() zwraca informację o znaku liczby. W wyniku otrzymujemy jedną z poniższych wartości:
- 1 – jeśli liczba jest dodatnia
- -1 – jeśli liczba jest ujemna
- 0 – jeśli liczba jest równa zero
Składnia funkcji:
SIGN(expression)
W miejsce argumentu expression podajemy wartość liczbową, dla której chcemy otrzymać informację o znaku.
SELECT SalesYTD,SalesLastYear,(SalesYTD - SalesLastYear) as różnica,SIGN(SalesYTD - SalesLastYear) as znakFROM Sales.SalesPerson;Wynik:
| SalesYTD | SalesLastYear | różnica | znak |
|---|---|---|---|
| 3763178,1787 | 1750406,4785 | 2012771,7002 | 1,00 |
| 1453719,4653 | 1620276,8966 | -166557,4313 | -1,00 |
W przykładzie poniżej wyliczamy:
- Wartosc_zmiany – za pomocą funkcji
ABS()otrzymujemy bezwzględną kwotę zmiany. Dzięki niej możemy posortować wynik od najmniejszej do największej zmiany - Kierunek_zmiany – funkcja
SIGN()pokazuje, w którym wierszu wartość jest dodatnia, a w którym ujemna
SELECT BusinessEntityID,SalesYTD,SalesLastYear,(SalesYTD - SalesLastYear) AS Zmiana,ABS(SalesYTD - SalesLastYear) AS Wartosc_zmiany,SIGN(SalesYTD - SalesLastYear) AS Kierunek_zmianyFROM Sales.SalesPersonORDER BY Wartosc_zmiany;Wynik:
| BusinessEntityID | SalesYTD | SalesLastYear | Zmiana | Wartosc_zmiany | Kierunek_zmiany |
|---|---|---|---|---|---|
| 278 | 1453719,4653 | 1620276,8966 | -166557,4313 | 166557,4313 | -1,00 |
| 285 | 172524,4512 | 0,00 | 172524,4512 | 172524,4512 | 1,00 |
| 283 | 1573012,9383 | 1371635,3158 | 201377,6225 | 201377,6225 | 1,00 |
| 281 | 2458535,6169 | 2073505,9999 | 385029,617 | 385029,617 | 1,00 |
| 279 | 2315185,611 | 1849640,9418 | 465544,6692 | 465544,6692 | 1,00 |
| 288 | 1827066,7118 | 1307949,7917 | 519116,9201 | 519116,9201 | 1,00 |
| 287 | 519905,932 | 0,00 | 519905,932 | 519905,932 | 1,00 |
| 274 | 559697,5639 | 0,00 | 559697,5639 | 559697,5639 | 1,00 |
Potęgowanie i pierwiastkowanie
Potęgowanie i pierwiastkowanie to operacje matematyczne wykorzystywane w analizie danych, statystyce oraz bardziej zaawansowanych algorytmach obliczeniowych.
W SQL Server dostępne są funkcje SQUARE(), POWER(), SQRT(), EXP() i LOG() umożliwiające wykonywanie tych operacji bezpośrednio na danych z bazy.
Funkcja SQUARE()
Funkcja SQUARE() umożliwia podniesienie liczby do kwadratu, czyli jej pomnożenie przez samą siebie.
Składnia funkcji:
SQUARE(expression)
W miejsce argumentu expression podajemy wartość liczbową, którą chcemy podnieść do kwadratu.
W przykładzie poniżej obliczamy wartość opłaty za zniszczone zamówienie. Zgodnie z przyjętym założeniem, wysokość tej opłaty jest równa kwadratowi liczby zamówionych sztuk danego produktu, czyli mnożymy Quantity*Quantity.
SELECTProductID,Quantity,SQUARE(Quantity) AS opł_squareFROM [Order Details];Wynik:
| ProductID | Quantity | opł_square |
|---|---|---|
| 11 | 12 | 144 |
| 42 | 10 | 100 |
| 72 | 5 | 25 |
Funkcja POWER()
Składnia funkcji:
POWER(expression, power)
W argumentach:
- w miejsce expression (podstawa) podajemy liczbę, którą chcemy podnieść do potęgi
- power (wykładnik) – określa, do jakiej potęgi podnosimy podstawę, czyli ile razy podstawa ma wystąpić w mnożeniu przez samą siebie.
W przykładzie poniżej obliczamy wartość opłaty za zniszczone zamówienie. Zgodnie z przyjętym założeniem, wysokość tej opłaty jest równa liczbie sztuk (Quantity) podniesionej do trzeciej potęgi, czyli mnożymy Quantity*Quantity i wynik jeszcze raz mnożymy razy Quantity.
Zamiast zapisu Quantity*Quantity*Quantity stosujemy funkcję POWER().
SELECTProductID,Quantity,POWER(Quantity,3) AS opł_powerFROM [Order Details];Wynik:
| ProductID | Quantity | opł_power |
|---|---|---|
| 11 | 12 | 1728 |
| 42 | 10 | 1000 |
| 72 | 5 | 125 |
| 14 | 9 | 729 |
Funkcja SQRT()
Funkcja SQRT() służy do obliczania pierwiastka kwadratowego z podanej wartości liczbowej typu zmiennoprzecinkowego i zwraca wynik jako liczbę typu float.
Składnia funkcji:
SQRT(expression)
W miejsce argumentu expression podajemy wartość liczbową, dla której chcemy obliczyć pierwiastek kwadratowy.
Jeśli jako argument tej funkcji podamy liczbę całkowitą, zostanie ona przekonwertowana niejawnie na typ float. Informacje na temat typów danych znajdziesz w artykule Typy danych w MS SQL Server.
W przykładzie poniżej wyliczamy, ile dodatkowych sztuk towaru powinniśmy mieć na stanie „na wszelki wypadek” dla produktów, które są aktualnie zamówione u dostawców (UnitsOnOrder).
SELECTProductName,UnitsOnOrder,SQRT(UnitsOnOrder) AS SafetyBufferFROM Products;Wynik:
| ProductName | UnitsOnOrder | SafetyBuffer |
|---|---|---|
| Chang | 40 | 6,32455532033676 |
| Aniseed Syrup | 70 | 8,36660026534076 |
| Queso Cabrales | 30 | 5,47722557505166 |
| Sir Rodney’s Scones | 40 | 6,32455532033676 |
Zakładamy, że ryzyko braku towaru nie rośnie liniowo, tylko jest proporcjonalne do pierwiastka z liczby zamówionych sztuk:
- dla produktu, gdzie zamówiono 30 sztuk potrzebujemy 5 sztuk zapasu
- dla produktu, gdzie zamówiono 70 sztuk potrzebujemy 8 sztuk zapasu
- przy małych zamówieniach błąd o 1-2 sztuki stanowi duży problem, więc pierwiastek daje nam relatywnie duży margines błędu (bufor)
- przy dużych zamówieniach margines relatywny (procentowy udział zapasu) jest mniejszy, mimo że liczba sztuk bufora rośnie. Pozwala to na optymalizację kosztów magazynowania przy dużej skali.
Funkcja LOG()
Funkcja LOG() zwraca logarytm z podanej liczby o określonej podstawie.
Składnia funkcji:
LOG(expression,param2)
W miejsce argumentów wstawiamy:
- w expression podajemy dla jakiej wartości chcemy obliczyć logarytm
- w opcjonalnym argumencie param2 podajemy jaka będzie podstawa logarytmu. Podstawa logarytmu to liczba, którą musimy wielokrotnie przez siebie pomnożyć, aby otrzymać wynik. Argument wprowadzony od wersji SQL Server 2012.
Jeśli pominiemy drugi argument, SQL Server przyjmie domyślnie, że podstawą jest liczba e (ok. 2,718). Otrzymamy wtedy tzw. logarytm naturalny.
Logarytmów używamy często do normalizacji danych, czyli sprowadzania zróżnicowanych wartości np. od 1 zł do 10 000 zł do wspólnej skali, aby łatwiej było je porównywać na wykresach lub w statystykach.
W przykładzie za pomocą funkcji LOG() zamieniamy szeroki zakres cen na wąski przedział.
SELECT ProductID, UnitPrice, LOG(UnitPrice) AS LogUnitPriceFROM Products;Wynik:
| ProductID | UnitPrice | LogUnitPrice |
|---|---|---|
| 1 | 18,00 | 2,89037175789616 |
| 2 | 19,00 | 2,94443897916644 |
| 3 | 10,00 | 2,30258509299405 |
| 4 | 22,00 | 3,09104245335832 |
Funkcja EXP()
Funkcja EXP() to odwrotność funkcji LOG().
Jest ona często używana do obliczania skutków stałego tempa wzrostu np. inflacji, odsetek lub trendów rynkowych.
Składnia funkcji:
EXP(expression)
W miejsce argumentu expression podajemy wartość, dla której chcemy zrobić wyliczenia.
W przykładzie wyliczamy nową cenę produktu, przy założeniu ciągłej stopy wzrostu wynoszącej 5%.
SELECT ProductID, UnitPrice, -- EXP(0.05) wylicza e do potęgi 0.05. -- Jest to mnożnik dla ciągłej stopy wzrostu 5%. EXP(0.05) AS Mnoznik, -- Mnożymy cenę przez ten współczynnik UnitPrice * EXP(0.05) AS NowaCenaFROM Products;Wynik:
| ProductID | UnitPrice | Mnoznik | NowaCena |
|---|---|---|---|
| 1 | 18,00 | 1,05127109637602 | 18,9228797347684 |
| 2 | 19,00 | 1,05127109637602 | 19,9741508311445 |
| 3 | 10,00 | 1,05127109637602 | 10,5127109637602 |
| 4 | 22,00 | 1,05127109637602 | 23,1279641202725 |
Generowanie liczb losowych
Generowanie losowych wartości jest potrzebne np. podczas tworzenia danych testowych.
Funkcja RAND()
Funkcja RAND([seed]) służy do generowania pseudolosowej liczby zmiennoprzecinkowej z zakresu od 0 do 1.
Składnia funkcji:
RAND([seed])
Funkcję RAND możemy wywołać z parametrem seed lub bez niego:
-
wywołanie RAND() bez parametru zwraca wartość pseudolosową z zakresu od 0 do 1. Każde wywołanie funkcji zwraca inny wynik
SELECT RAND()--Przykładowy wynik: 0,457276491339149 -
wywołanie RAND() bez parametru dla danej tabeli zwraca wartość z zakresu od 0 do 1 taką samą dla każdego wiersza. Funkcja RAND() jest obliczana tylko raz dla całego zapytania, a nie osobno dla każdego wiersza. Dlatego dla każdego wiersza zwraca taką samą wartość. Każde wywołanie funkcji zwraca inny wynik.
SELECT RAND()FROM Products;Przykładowy wynik:
los 0,228956112359382 0,228956112359382 0,228956112359382 -
użycie parametru seed (ziarno) w funkcji RAND([seed]) służy do zainicjowania generatora liczb pseudolosowych konkretną wartością startową. Jeśli podamy ten sam seed, funkcja zwróci przy każdym wywołaniu tę samą wartość
SELECT RAND(10)-- Wynik: 0,713759689954247
Aby wygenerować różną wartość pseudolosową dla każdego wiersza używamy funkcji:
- NEWID() – generuje ona unikalny identyfikator typu GUID np. 6F9619FF-8B86-D011-B42D-00C04FC964FF
- CHECKSUM() – oblicza ona sumę kontrolną i zwraca wartość liczbową
Jeśli do funkcji CHECKSUM() jako argument podamy GUID zwrócony przez funkcję NEWID(), otrzymamy z losowego tekstu losową liczbę całkowitą.
SELECT RAND(CHECKSUM(NEWID())) AS LosRoznaFROM Products;Przykładowy wynik:
| LosRozna |
|---|
| 0,171198236300004 |
| 0,338933205622566 |
| 0,405308841133411 |
Aby otrzymać losową wartość typu float z zakresu od 0 do 100, należy pomnożyć wynik funkcji RAND() przez 100. Użycie CHECKSUM(NEWID()) gwarantuje unikalność dla każdego wiersza.
SELECT RAND(CHECKSUM(NEWID())) * 100 AS LosowaFloatFROM Products;
--Przykładowy wynik:--58,1711348634747--94,1290612843027Aby wygenerować całkowitą liczbę możemy użyć operatora modulo (%), który zwraca resztę z dzielenia. Aby zakres obejmował liczbę 100, należy użyć dzielnika 101. Operacja % 101 zwraca resztę z dzielenia, czyli wartości od 0 do 100.
SELECT ABS(CHECKSUM(NEWID())) % 101 AS LosowaIntFROM Products
--Przykładowy wynik:--36--5Agregacje
Oprócz operacji na pojedynczych możemy również wykonywać obliczenia na zbiorach.
Do najbardziej popularnych funkcji operujących na zbiorach należą:
SUM(),AVG()– suma i średniaMIN(),MAX()– najmniejsza i największa wartośćCOUNT(*)– liczba wszystkich rekordów
Informacje na temat funkcji grupujących znajdziesz w artykule MS SQL grupowanie
Dzielnie z użyciem funkcji NULLIF
Aby uniknąć problemu dzielenia prze zero możemy użyć funkcji NULLIF.
Porównuje ona dwie wartości i zwraca NULL, jeśli są one równe. Pozwala to „zamienić” zero w NULL tuż przed wykonaniem dzielenia. Dzięki temu zamiast błędu otrzymujemy wynik NULL, który można dalej obsłużyć w logice raportu lub aplikacji.
SELECT 100 / NULLIF(0, 0);
--Wynik: NULLPrzy wykonywaniu obliczeń matematycznych warto pamiętać o:
- kolejności wykonywania działań – najpierw wykonywane jest mnożenie i dzielenie, a później dodawanie i odejmowanie. Jeśli chcemy zmienić kolejność, musimy użyć nawiasów
- precyzji typów danych – różne typy danych przechowują wartości w odmienny sposób, co może wpływać na zaokrąglenia podczas wykonywania obliczeń
Jeżeli myślisz o przećwiczeniu omawianych zagadnień w szerszym kontekście pracy z danymi, zobacz program naszych szkoleń SQL Server.
