Funkcje matematyczne w SQL

Wbudowane, skalarne funkcje matematyczne, służą do operacji na liczbach. Poniżej znajdziesz opis kilku wybranych, najczęściej używanych.

ROUND ( wartość_liczbowa, precyzja ) – zaokrągla wartość liczbową, zmiennoprzecinkową do zadenj precyzji.

USE AdventureWorks2008
GO

SELECT SalesOrderId, TotalDue, 
       ROUND(TotalDue,2) as TotalDueRounded 
FROM Sales.SalesOrderHeader
WHERE TotalDue BETWEEN 123 AND 124

FN_Maths_01_ROUND


RAND () – funkcja pseudolosowa, zwraca liczbę typu float z zakresu 0-1. Łatwo w oparciu o nią stworzyć generator liczb pseudolosowych zwracający liczby losowe z określonego przedziału.

-- przedział 10 - 20
SELECT 10 + CONVERT(INT, (20-10+1) * RAND())
-- Przedział 0-10
SELECT 0 + CONVERT(INT, (10-0+1) * RAND())

Poniżej przykład skryptu w którym celem sprawdzenia działania generatora, wrzucam do tabeli tymczasowej #test, 1000 losowych wartości z przedziału 1-100. Na koniec sprawdzam MAX, MIN i średnią z tych wartości.
Średnia powinna dążyć do 51 – im więcej rekordów tym bliżej tej wartości (zakładając rozkład jednorodny).

IF (OBJECT_ID('tempdb.dbo.#test') is not null ) drop table dbo.#test;

CREATE TABLE dbo.#test
( 
	wart int
)
GO
 
SET NOCOUNT ON
GO
 
DECLARE @min int,@max int
-- określenie zakresu przedziału
SELECT @min = 1, @max =100
 
INSERT INTO dbo.#test(wart)  
-- losujemy liczby całkowite z zakresu 1-100
 
SELECT @min + CONVERT(INT, (@max - @min +1) * RAND())
GO 1000
 
SELECT MAX(wart) as MaxValue, MIN(wart) as MinValue, 
	AVG(cast(wart as float)) as Avarage, COUNT(*) as IleLiczb 
FROM dbo.#test

FN_Maths_02_RAND

Istotną cechą funkcji RAND() jest jej determinizm. Wywołana w pojedynczym batchu (logicznej jednostce), zwraca wartość losową identyczną dla każdego wiersza (podobnie jak getdate()).

Funkcja RAND() może przyjmować parametr, będący „ziarnem losowości”. Jeśli potrzebujesz wygenerować wartość losową dla KAŻDEGO wiersza w jednym zapytaniu, trzeba sprawić aby funkcja stała się niedeterministyczna.

with tabelka as
(
	select 1 as kol
	union
	select 2 
	union 
	select 3 
)
SELECT kol, RAND() as Rnd, getdate() as Dt, RAND(CHECKSUM(NEWID())) as RowRand
FROM tabelka

Niedeterministryczne_RAND

Temat liczb pseudolosowych jest szeroki i informacje tu zawarte są jedynie prostym przykładem ich zastosowania.


FLOOR( liczba_ułamkowa ) – to zaokrąglenie dowolnej liczby zmiennoprzecinkowej w dół – biorąc pod uwagę jej wartość ułamkową. Analogicznie działa CEILING( liczba_ułamkowa ) – zaokrągla zawsze do pełnej wartości w górę, niezależnie od wartości części po przecinku.

SELECT FLOOR (123.78) , FLOOR (-123.78) , CEILING(123.78),  CEILING(-123.78)

FN_Maths_02_FLOOR


POWER (liczba, potęga) oraz SQRT(liczba) to funkcje potęgowania oraz pierwiastkowania (kwadratowego)


Poza wyżej wymienionymi funkcjami, SQL udostępnia także wbudowane funkcje trygonometryczne, logarytmiczne i kilka innych o których możesz poczytać w np. w BOL czy na stronach MSDN.

Istotne jest aby pamiętać, że SQL to język operowania na zbiorach danych. Jeśli potrzebujesz wykonywać skomplikowane obliczenia – powinieneś wykorzystać do tego celu możliwości języków programowania do tego celu stworzonych. Dzięki integracji CLR w SQL, możesz tworzyć funkcje, procedury w środowisku .NET i wywoływać je bezpośrednio z kodu T-SQL.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.