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