Data: 1.02.2026

Funkcje matematyczne w MS SQL Server

Funkcje matematyczne w SQL Server – praca na liczbach

Spis treści

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()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_dwa
FROM Sales.SalesOrderDetail;

Wynik:

UnitPriceround_dwa
29,99429,99
24,29424,29
149,874149,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_zero
FROM Sales.SalesOrderDetail;

Wynik:

UnitPriceround_zero
29,99430,00
24,29424,00
149,874150,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_minus
FROM Sales.SalesOrderDetail;

Wynik:

UnitPriceround_minus
29,99430,00
24,29420,00
149,874150,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_trunc
FROM Sales.SalesOrderDetail;

Wynik:

UnitPriceround_trunc
29,99429,90
24,29424,20
149,874149,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_ceiling
FROM Sales.SalesOrderDetail;

Wynik:

UnitPricewyn_ceiling
29,99430,00
24,29425,00
149,874150,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_floor
FROM Sales.SalesOrderDetail;

Wynik:

UnitPricewyn_floor
29,99429,00
24,29424,00
149,874149,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_floor
FROM Sales.SalesOrderDetail;
UnitPriceround_dwaround_zeroround_minusround_truncwyn_ceilingwyn_floor
2024,9942024,992025,002020,002024,902025,002024,00
28,840428,8429,0030,0028,8029,0028,00
5,18655,195,0010,005,106,005,00
20,186520,1920,0020,0020,1021,0020,00
419,4589419,46419,00420,00419,40420,00419,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_abs
FROM Sales.SalesPerson;

Wynik:

SalesYTDSalesLastYearróżnicaróżnica_abs
3763178,17871750406,47852012771,70022012771,7002
1453719,46531620276,8966-166557,4313166557,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 znak
FROM Sales.SalesPerson;

Wynik:

SalesYTDSalesLastYearróżnicaznak
3763178,17871750406,47852012771,70021,00
1453719,46531620276,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_zmiany
FROM Sales.SalesPerson
ORDER BY Wartosc_zmiany;

Wynik:

BusinessEntityIDSalesYTDSalesLastYearZmianaWartosc_zmianyKierunek_zmiany
2781453719,46531620276,8966-166557,4313166557,4313-1,00
285172524,45120,00172524,4512172524,45121,00
2831573012,93831371635,3158201377,6225201377,62251,00
2812458535,61692073505,9999385029,617385029,6171,00
2792315185,6111849640,9418465544,6692465544,66921,00
2881827066,71181307949,7917519116,9201519116,92011,00
287519905,9320,00519905,932519905,9321,00
274559697,56390,00559697,5639559697,56391,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()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.

SELECT
ProductID,
Quantity,
SQUARE(Quantity) AS opł_square
FROM [Order Details];

Wynik:

ProductIDQuantityopł_square
1112144
4210100
72525

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

SELECT
ProductID,
Quantity,
POWER(Quantity,3) AS opł_power
FROM [Order Details];

Wynik:

ProductIDQuantityopł_power
11121728
42101000
725125
149729

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

SELECT
ProductName,
UnitsOnOrder,
SQRT(UnitsOnOrder) AS SafetyBuffer
FROM Products;

Wynik:

ProductNameUnitsOnOrderSafetyBuffer
Chang406,32455532033676
Aniseed Syrup708,36660026534076
Queso Cabrales305,47722557505166
Sir Rodney’s Scones406,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 LogUnitPrice
FROM Products;

Wynik:

ProductIDUnitPriceLogUnitPrice
118,002,89037175789616
219,002,94443897916644
310,002,30258509299405
422,003,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 NowaCena
FROM Products;

Wynik:

ProductIDUnitPriceMnoznikNowaCena
118,001,0512710963760218,9228797347684
219,001,0512710963760219,9741508311445
310,001,0512710963760210,5127109637602
422,001,0512710963760223,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 LosRozna
FROM 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 LosowaFloat
FROM Products;
--Przykładowy wynik:
--58,1711348634747
--94,1290612843027

Aby 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 LosowaInt
FROM Products
--Przykładowy wynik:
--36
--5

Agregacje

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 średnia
  • MIN(), 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: NULL

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

Paula Gajewska
Paula Gajewska
Programistka Python, SQL
Udostępnij wpis:udostępnij Facebookudostępnij Linkedinudostępnij e-mail

Polecane