You are on page 1of 37

Агрегатни функции.

Одредување на бројот на редовите за


избор.
Употреба на изрази. Изрази за датум / час
и изрази за интервал.
Функции за работа со низи од симболи;
изрази за конвертирање на типот на
податоци

Лабораториска вежба 5
Содржина
• Агрегатни функции
▫ COUNT
▫ SUM
▫ AVG
▫ Оператор GROUP BY
▫ MAX
▫ MIN
▫ Функции за статистички анализи
▫ HAVING
• Задачи

• Одредување на бројот на редовите за избор


• Задачи

• Употреба на изрази. Изрази за датум / час и изрази за интервал


▫ Аритметичка оператори
▫ Математички функции
▫ Функции за датум и час
• Задачи

• Функции за работа со низа од симболи


• Изрази за конвертирање на тип на податоци
• Задачи
• Во следните примери ќе се користат предходно направените табела во
лабораориска вежба 4 (Customers, Employees), ито така ќе се користат и
следните табели:
CREATE TABLE SaleDetails
( SaleID int NOT NULL IDENTITY,
ProductID int NOT NULL,
Quantity int NOT NULL,
Price float NOT NULL,
Discount float NULL,
CONSTRAINT PK_Sale_Product
PRIMARY KEY (SaleID, ProductID))

CREATE TABLE Sales


( SaleID int NOT NULL IDENTITY PRIMARY KEY,
CustomerID int NOT NULL,
EmployeeID int NOT NULL,
SaleDate datetime NOT NULL,
TotalForSale float NOT NULL,
Discount float NULL)
CREATE TABLE Products
(ProductID int NOT NULL IDENTITY PRIMARY KEY ,
ProductName varchar(30) NOT NULL,
CategoryID int NOT NULL,
SupplierID int NOT NULL,
Price float NOT NULL,
Stock int NOT NULL,
ReorderLevel text NOT NULL,
Discontinued float NULL)
COUNT

Упитите дозволуваат создавање и извлекување на


податоците со помош на агрегатни (повикувачки)
функции:
• COUNT враќа бројот на редовите или вредностите
во дадена колона, кој се различни од NULL, и се
избрани од конкретен упит.
Пример: следниот упит враќа бројот на клиентите
од некој град:

SELECT COUNT (CustomerID) AS [Count of Customers]


FROM Customers
WHERE City = ‘Stip'
• За пребројување на сите редови во една табела се користи функцијата COUNT,
кога се постави знак ѕвездичка (*) наместо името на колоната.
Пример: следната упит изнесува бројот на сите редови во табелата за клиент:

SELECT COUNT (*) AS [Count of Customers]


FROM Customers

• Функцијата COUNT може да се користи за да се добие бројот на различни


вредности во соодветната колона, кога се комбинира со DISTINCT.
Пример: упит за попис на вработените, за кои има тековно снимени продажба во
табелата Sales:

SELECT COUNT (DISTINCT EmployeeID) AS [Count of Employees]


FROM Sales

• Доколку не е зададен клучниот збор DISTINCT, се добива бројот на сите редови во


кои има вредности во колоната идентификатор на служител (EmployeeID),
различен од NULL, т.е. се врши пребројување на сите продажба, бидејќи колоната
EmployeeID е декларирана да не дозволува вредност NULL.
SUM
• SUM враќа сума на сите вредности во дадена колона, при што ги
игнорира вредностите NULL.
Пример:
1) Упит за наоѓање на колкава количина од некој производ е продадено:

SELECT SUM (Quantity) AS SaledQuantity


FROM SaleDetails
WHERE ProductID = 1

2) Упит за пронаоѓање на вкупната сума од една дадена продажба:

SELECT SUM (Price*Quantity*(1-Discount)) AS Total


FROM SaleDetails
WHERE SaleID = 5

Дозволенo е користење на DISTINCT за собирање само уникатните


вредности.
AVG
• AVG - враќа средна аритметичка вредност на
вредностите во една колона, при што ги игнорира
вредностите NULL.
Пример: упит за наоѓање на средната цена на доставка
на производи, кој и понатаму се продаваат:

SELECT AVG (price) AS Average


FROM Products
WHERE Discontinued = 0

Дозволенo е користење на DISTINCT за вклучување


само на различни вредности во пресметувањето на
средната aритметичка вредност.
GROUP BY

• Со вклучувањето на GROUP BY се овозможува резултатот од упитот да


се групира по некој критериум, пред да се постави некоја функција.
Пример:
1) За прикажување на идентификација на продавница и бројот на
вработените кои работат во соодветната продавница, се користи
следниот упит:

SELECT StoreID, COUNT (*) AS CountOfEmployees


FROM Employees
GROUP BY StoreID

2) За прикажување на идентификација на продажба и вкупна сума на


соодветната продажба се користи следниот упит:

SELECT SaleID, SUM (price * quantity * (1-discount)) AS Total


FROM SaleDetails
GROUP BY SaleID
3) За прикажување на идентификација на клиентот,
идентификација на служител и бројот на продажбата
спроведена од соодветен служител на соодветниот клиент, се
користи следниот упит:

SELECT CustomerID, EmployeeID, COUNT (*) AS CountOfSales


FROM Sales
GROUP BY CustomerID, EmployeeID
MAX
• MAX враќа најголемата вредност во една колона.

Пример: упит за наоѓање на најголемата продажна цена


на даден продукт:

SELECT MAX (price) AS [Max Price]


FROM SaleDetails
MIN
• MIN враќа најмала вредност во една колона.

Пример: упит за наоѓање на идентификација на клиент


и првата и последната дата на која е извршено
пазарување од соодветниот клиент:

SELECT CustomerID, MIN (SaleDate) AS FirstDate,


                    MAX (SaleDate) AS LastDate
FROM Sales
GROUP BY CustomerID
HAVING

• Услови оператор HAVING дава можност за поставување на


дополнителен услови за податоците кои се обработуваат при
користење на GROUP BY.

Пример, за наоѓање на идентификации на клиенти и суми од


вкупната вредност на купување на соодветниот клиент,
поголеми или еднакви на дадена сума. Редовите кој се
добиваат се сортирани по износот на вкупната вредност на
продажбите од поголема кон помала.

SELECT CustomerID, SUM (TotalForsale) AS Total


FROM Sales
GROUP BY CustomerID
HAVING SUM (TotalForSale)> = 100
ORDER BY Total DESC
Задача 1. Да се напише упит, која изведува
идентификатор на продукт и средна продажна
цена на соодветниот производ.

Задача 2. Да се напише упит кој го изведува


бројот на различни градови во кој има
продавница.
Одредување на бројот на редовите за
избор

• Клучниот збор TOP, користен во списокот за


селекција, овозможува контрола над количината
на податоци кои ќе бидат изведени, т.е.
определува бројот на редовите за избор, кога ги
зема првите n. Синтаксата за користење на TOP е:

SELECT [TOP n [PERCENT] [WITH TIES]]


column_list
FROM table_name
...
• Кога упитот вклучува ORDER BY, TOP се извршуват
така што во резултатот присуствуваат само првите n
линии, подредени според изразот ORDER BY. Кога
барањето не вклучува изразот ORDER BY, не е
возможно да се предвиди кои редовно ќе бидат
вратени.
Пример за прикажување на првите три реда од
табелата за производите, сортирани по доставната цена
во ред кој се намалува, може да се користи следниот
упит:

SELECT TOP 3 ProductID, ProductName, Price


FROM Products
ORDER BY Price DESC
• Ако има производи со доставна цена еднаква на
доставната цена на производот од третиот ред во
предходниот упит, тие нема да се видат. Ако целта
е да се изведат сите производи кои имаат иста цена
како наведените во списокот, треба да се користи
опцијата WITH TIES. Оваа опција е дозволена само
ако конструкцијата SELECT која вклучува ORDER
BY.
Пример:

SELECT TOP 3 WITH TIES ProductID,


ProductName, Price
FROM Products
ORDER BY Price DESC
• Последниот упит може да врати повеќе од три реда, ако
има повеќе производи со цена еднаква на третиот по ред
со највисока цена, односно при оваа операција прво се
пребројуваат редовите, наведени од TOP (во овој случај
три). Откако ќе бидат вратени првите три реда, SQL
Server, ќе провери дали другите редови имаат вредност
еднаква на последната вратена вредност.
• Ако треба да се изведе одреден дел од редови, може да се
користи TOP со PERCENT, по што ќе се заокружи до
најблискиот цел број за број на редови.
Пример:

SELECT TOP 20 PERCENT ProductID, ProductName, Price


FROM Products
ORDER BY Price DESC
• Бројот на редовите, вратени од последниот упит се
определува така што се пресметува 20% од вкупниот
број на редови во табелата за производите и
резултатот се заокружува до најблискиот цел број.

• Опциите WITH TIES и PERCENT можат да се


користат заедно во упит, во резултат на што е можно
да се добијат дополнителни редови, кои имаат цена
еднаква на последната вратена цена.
Пример:

SELECT TOP 20 PERCENT WITH TIES


       ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC
• Опцијата SET ROWCOUNT n се користи за ограничување на
праќањето од SQL Server до клиентот редови до n.

Пример:
SET ROWCOUNT 10
SELECT * FROM Customers

• Конструкцијата SELECT престанува да праќа редови назад


на клиентот, откако биле испратени n редови, т.е. Последниот
упит ќе врати само 10 реда од табелата за клиентите. Оваа
опција е корисна при одредени ситуации, но има ограничена
функционалност. Влијае и на конструкции за додавање,
бришење и ажурирање на редови. За да се обнови состојба
по подразбирање се користи опцијата за n = 0, т.е.

SET ROWCOUNT 0
Задача 1. Да се напише упит, кој ги изведува 5-те
највисоки продажни цени на даден производ (на
пример со идентификатор единица).

Задача 2. Да се напише упит, која изведува 10-те


најниски општи суми на продажба за некој
одреден период (пример помеѓу 01 октомври 2009
година и 01 февруари 2010 година)
Transact-SQL нуди сет од оператори за извршување на
аритметичка операции, споредба на вредности,
конкатенирање на низови, логички оператори. Изразите
може да се користат во SELECT листата, во условот на
WHERE или HAVING.

Аритметичка оператори

• Аритметичка оператори: +, -, *, /,% (остаток при поделба на


цел број).

Пример:

SELECT SaleID, ProductID, Quantity, Price, Discount,


       Quantity*Price*(1-Discount) AS ExtendedPrice
FROM SaleDetails
Математички функции

▫ ABS (numeric_expr) враќа апсолутната вредност на бројниот израз numeric_expr;


▫ ACOS (float_expr) враќа агол во радијани, чиј косинус е дадениот израз float_expr;
▫ ASIN (float_expr) враќа агол во радијани, чиј синус е дадениот израз float_expr;
▫ ATAN (float_expr) враќа агол во радијани, чиј тангенс е дадениот израз float_expr;
▫ COS (float_expr) враќа косинус на даден агол (во радијани), е зададен во изразот;
▫ SIN (float_expr) враќа синус на даден агол (во радијани), е зададен во изразот;
▫ TAN (float_expr) враќа тангенс на даден агол (во радијани), е зададен во изразот;
▫ COT (float_expr) враќа котангенс на даден агол (во радијани), е зададен во
изразот;
▫ DEGREES (numeric_expr) враќа степен претворен од радијани од бројниот израз;
▫ RADIANS (numeric_expr) враќа степен претворен од радијани од бројниот израз
▫ PI () враќа константата 3.1415 ...;
▫ POWER (numeric_expr, y) враќа вредноста на бројниот израз numeric_expr на
степен y;
▫ SQUARE (float_expr) враќа квадрат на зададениот броен израз;
• EXP (float_expr) враќа експоненциалната вредност на зададениот броен израз;
• LOG (float_expr) враќа природни логаритам на зададениот броен израз;
• LOG10 (float_expr) враќа логаритам со основа 10 на зададениот броен израз;
• SIGN (numeric_expr) враќа знаци на бројниот израз, т.е. -1 Под негативна вредност; 0
под вредност 0; 1 под позитивна вредност;
• CEILING (numeric_expr) враќа цел број, најмалку од сите вредности, поголеми или
еднаков на аргументот;
• FLOOR (numeric_expr) враќа цел број, најголема од сите вредности, помал или еднаков
на аргументот;
• ROUND (numeric_expr, precision [, truncate]) - ако точноста precision е позитивен цел
број, бројниот израз се заокружува до посоченат позиција после децималата; ако
точноста е негативна, бројниот израз се заокружува до посочената позиција од лево на
децималата; бројот truncate одредува дали бројниот израз се заокружува или пропушта-
ако нема или е 0, се заокружува; ако е различна од 0, се пропуштат толку знаци, колку
што е наведено. Пример ROUND (70.46, 0, 1) враќа целиот дел од бројот, т.е. 70;
ROUND (75.81, -1, 0) враќа 80; ROUND (75.81, -1, 1) враќа 70;
• RAND ([seed]) враќа случајно генерирана вредност - рационален број помеѓу 0 и 1;
аргументот seed е почетна вредност за алгоритмот, кој генерира случајни броеви (од
Цело броен тип) и не е задолжителен.
• Функциите ABS (numeric_expr), CEILING (numeric_expr), FLOOR (numeric_expr),
ROUND (numeric_expr, precision, [truncate]) се користат за пребарување на вредноста во
одреден опсег.
Функции за датум и час

• DATEADD (interval, number, datetime) враќа датум, на кој е зададен некој


интервал. Параметар interval може да има една од следниве вредности:
▫ година year, yy, yyyy
▫ тримесечје quarter, q, qq
▫ месец month, m, mm
▫ недела week, wk, ww
▫ ден day, d, dd
▫ по ред ден од годината dayofyear, dy, y
▫ по ред ден од недела weekday, dw, w
▫ час hour, hh
▫ минута minute, mi, n
▫ секунда second, s, ss
▫ милисекунда millisecond, ms

• Параметар number е број интервали (денови, месеци итн.) Во негативна


вредност на тој параметар се враќа назад од денот во datetime, ако е позитивен се
додава кон неа. Параметар datetime е датата на која ќе се додава (враќа
интервал). Ако е константа, треба да се огради со наводници; може да е колона
од табелата, означена по потреба со []. Пример DATEADD (day, 30, '1 / 1 / 2010 ')
враќа датумот 31 јануари 2010 година
• DATEDIFF (interval, datetime1, datetime2) враќа цел број,
разлика помеѓу две дати. Можни вредности на параметри
interval се истите како кај DATEADD. Резултатот на
функцијата е цел број, што е позитивно, ако datetime1 е пред
datetime2; негативно, ако datetime2 е пред datetime1; 0 ако
двата датуми се исти во однос на зададения интервал.

• DATEPART (interval, datetime) враќа цел број го застапува


interval дадениот дел од датумот.

• DATENAME (interval, datetime) враќа низ, кој преставува


дел од датум зададен преку interval.

• GETDATE () враќа моментална дата и час во стандардниот


внатрешен формат на SQL Server за вредноста на типот
datetime.
• Со опцијата SET DATEFORMAT се менува
стандардниот формат за датумот за тековната
конекција.
Пример:

SET DATEFORMAT dmy

се утврдува dmy наместо вредноста по


подразбирање на опцијата mdy. За да се избегнат
грешки, добро е да се користи формата yyyymmdd
(или yymmdd), кој се препознава независно од тоа
каква е опцијата за DATEFORMAT.
Задача 1. Да се напише упит, која ќе изведе
идентификатор на клиентот и сума од вкупната вредност
на купување на соодветниот клиент во последниот месец.

Задача 2. Да се напише упит, која ќе изведе податоците за


сите вработени:

2.1. по датумот 01 мај 2009 година;


2.2. во јуни 2009 година.

Задача 3. Да се напише упит, која ќе изведе


идентификатор на вработен и број на реализирани
продажби од соодветниот вработен:

3.1. за тековната дата;


3.2. за вчерашно датум.
Функции за работа со низа од симболи

Во SQL Server функциите за работа со симболот низи овозможуваат да се добијат


делови од низи, да се променат низи, да се добие информации за самите низи.
Функциите за низи ја прават работата со симболните податоци полесна:

• LEN (string) враќа бројот на симболите во низата.


• LEFT (string, number) number враќа број на симболи од низата string, почнувајќи
од почетокот на низата.
• RIGHT (string, number) number враќа број на симболи од низата string,
почнувајќи од крајот на низата.
• SUBSTRING (string, start, length) враќа дел од низата string, при што зема length
симболот од start позиција.
• UPPER (string) враќа низа од симболи, така што ги заменува малите букви во
него со големи.
• LOWER (string) враќа низа од симболи, така што ги заменува главните букви во
него со мали.
• CHARINDEX (str_to_find, str_to_search [, start_position]) враќа почетната
позиција на str_to_find во str_to_search; start_position одредува почетната
позиција, од каде започнува пребарувањето на str_to_search (ако недостасува
start_position пребарувањето започнува од првата позиција).
• PATINDEX (pattern, string) враќа позицијата во низата string, во кој за
првпат се среќава сличност на шаблонот pattern или 0 ако шаблонот не е
пронајден. Шаблонот pattern може да биде произволен редослед на
симболи, може да се вклучат и симболи кој се користат со операторот
LIKE.
• LTRIM (string) враќа низа, при што ги отстранува евентуални интервали,
со кои започнува.
• RTRIM (string) враќа низа, при што отстранува ги евентуални интервали,
со кои завршува.
• REVERSE (string) враќа низа, при што ги дава знаците , од кои се состои
во обратен редослед.
• REPLICATE (string, number) враќа низа во кој наведениот прв аргумент е
повторен толку пати, колку што е number.
• SPACE (number) враќа низа која се состои од number на број интервала.
• REPLACE (str_to_search, str_to_find, str_to_replace_with) ги заменува сите
исти (string) str_to_find во str_to_search со str_to_replace_with.
• STUFF (string_to_modify, start, length, string_to_insert) трансформира низа
string_to_modify, при што го брише length број на симболи од позиција
start, вметнува string_to_insert во string_to_modify од позиција start.
• ASCII (string) враќа вредноста на ASCII кодот на најлевиот
симбол во симболната низа.
• UNICODE (string) враќа вредноста на Unicode кодот на најлевиот
симбол во симболната низа.
• CHAR (integer_expr) враќа симбол, во согласност со ASCII кодот
integer_expr, кој треба да биде вредност од 0 до 255. Ако
вредноста на аргументот е надвор од овие граници, функцијата
враќа вредност NULL.
• NCHAR (integer_expr) враќа Unicode симболот, во согласност со
кодот integer_expr, дефиниран во стандардот Unicode.

Конкатенирање на низови (+)

Пример:

SELECT FirstName + ' ' + LastName AS Name


FROM Employees
• Изрази за конвертирање на тип податоци

SQL Server обезбедува три функции за конвертирање на типови на податоци:

• CAST (original_expression AS desired_datatype) конвертира даден израз од


определен тип податоци во израз од друг тип на податоци. Дозволува
менување на типот на податоци, при што се избира поле што е неопходно
при конкатенирање на низи или кога поврзуваме колони кои првично не
биле замислени како поврзани за изполнување на математички операции
над колони, кои се дефинирани како низи од симболи, всушност полињата
содржат броеви.

Пример:

SELECT LastName + '-' +


CAST (EmployeeID AS varchar (4)) AS [Name and ID]
FROM Employees
• STR (float_expression [, length [, decimal]]) враќа
низа којa застапува рационален број; length е
вкупниот број знаци кој ја формираат добиената
низа, вклучувајќи децимална точка (.) и
негативниот знак (-), ако постојат (вредноста по
подразбирање е 10); decimal е број на дозволени
позиции по децималната точка.

Оваа функција заокружува до саканата децимална


позиција.
Пример:
SELECT 'Total for sale is:' + STR(TotalForSale, 13, 2) AS Total
FROM Sales
• CONVERT (datatype, expression [, style]) преобразува израз expression од еден тип податоци во
друг. Параметарот style се користи за конвертирање на datetime или smalldatetime во тип char,
nchar, varchar или nvarchar и при конвертирање на float, real, money или smallmoney во
симболен тип податоци. При конвертирање на datetime или smalldatetime во низа, ако style се
пропушти, се користи стандардниот формат за датумот на SQL Server. Можните вредности на
style се:
0 или 100 (стандарден код) mon dd yyyy hh: mm AM (или PM)
1 mm / dd / yy 101 mm / dd / yyyy
2 yy.mm.dd 102 yyyy.mm.dd
3 dd / mm / yy 103 dd / mm / yyyy
4 dd.mm.yy 104 dd.mm.yyyy
5 dd-mm-yy 105 dd-mm-yyyy
6 dd mm yy 106 dd mm yyyy
7 mon dd, yy 107 mon dd, yyyy
8 или 108 hh: mm: ss
9 или 109 mon dd yyyy hh: mm: ss: mmm AM (или PM)
10 mm-dd-yy 110 mm-dd-yyyy
11 yy / mm / dd 111 yyyy / mm / dd
12 yymmdd 112 yyyymmdd
13 или 113 dd mon yyyy hh: mm: ss: mmm (24h)
14 или 114 hh: mm: ss: mmm (24h)
20 или 120 yyyy-mm-dd hh: mm: ss (24h)
21 или 121 yyyy-mm-dd hh: mm: ss.mmm (24h)
• Query Analyzer и OSQL користат формат по подразбирање 121 при изведување на вредност од
тип datetime или smalldatetime.
Задача 1. Да се напише упит, кој ги изведува
имињата, датумот на раѓање и возраста на
вработените, со користење на ЕМБ.
Задача 2. Да се напише упит, кој ги изведува датум
на продажба, број на клиенти, направиле нарачка
на тој датум, бројот на вработените, извршени
продажби, бројот на продажбата, средна вредност
на продажбите и вкупната вредност на
продажбите.
Решение:
SELECT CAST(CONVERT(char(10), SaleDate, 112)
         AS datetime) AS DateOfSale,
       COUNT(DISTINCT CustomerID) AS CustomersCount,
       COUNT(DISTINCT EmployeeID) AS EmployeesCount,
       COUNT(SaleID) AS SalesCount,
       AVG(TotalForsale) AS AverageTotal,
       SUM(TotalForSale) AS SumTotal
FROM Sales
GROUP BY
      CAST(CONVERT(char(10), SaleDate, 112) AS datetime)

Конвертира се вредноста на датумот и часот на продажба во низа, при што


не е вклучено времето (т.е. часа, минути, секунди, милисекунди).
Добиената низа се конвертира во datetime, по што се користи
стандардниот час - полноќ. Целта е да се изврши групирање на
соодветните податоци по датум,така што се исклучува делот за времето.

You might also like