Aqreqat funksiyaların köməkliyi ilə verilənlərin ümumiləşdirilməsi
Bu addımda biz qrup qiymətləri götürüb bir qiyətə gətirən aqreqat funksiyaların istifadəsinə keçəcəyik.
SQL Server bir neçə aqreqat funksiya təklif edir.
SUM və AVG funksiyaları yalnız ədədi sətirlər üçün tətbiq olunandırlar. COUNT, MAX, MIN ilə ədədi və simvol sətirlər istifadə oluna bilər. Simvol sətirlərlə istifadə olunanda MIN, MAX dəyişənləri alfavit sırası üzrə müqayisə edir. Aqreqat funksiyalar öz işlərində NULL qiymətini nəzərə almırlar.
Orders cədvəlindəki bütün sifarişçilərin cəmini tapmaq üçün aşağıdakı sualı vermək lazımdır:
SELECT SUM( amt ) FROM Orders
Nəticə:
--------------------- 26658.4000
COUNT funksiyası digərlərindən bir az fərqlənir. O verilmiş sütunun və ya cədvəlin sətirlərinin sayını hesablayır. Məs: Orders cədvəlinə yazılmış ticarət agentlərinin sayını hesablayaq.
SELECT COUNT( DISTINCT snum ) FROM Orders
Nəticə:
----------- 5
Fikir verin ki sorğuda DISTINCT açar sözündən istifadə olunmuşdur, bu vaxtı agentlərin yalnız unikal nömrələri hesablanır. Əgər bu açar sözü yazılmasaydı onda nəticə aşağıdakı kimi olacaqdı:
----------- 10
Əgər cədvəldə bütün sətirlərin sayını hesablamaq lazım gələrsə, onda sorğuda COUNT funkiyasında sütun yernə ulduz işarəsi qoymaq lazımdır:
SELECT COUNT(*) FROM Customers
Nəticə:
----------- 7
GROUP BY təklifi sizə aqreqat funksiyanın dəyişməsi üçün lazım olan çoxluq verir. O SELECT ifadəsinin daxilində sətir və aqreqat funksiyaları cəmləndirmək imkanı verir. Tutaq ki sizə hər bir ticarət agenti tərəfindən alınmış ən böyük sifarişi tapmaq lazımdır:
SELECT snum, MAX( amt ) FROM Orders GROUP BY snum
Bu sualın nəticəsi:
snum ----- ---------- 1001 9891.8800 1002 5160.4500 1003 1713.2300 1004 1900.1000 1007 1098.1600
GROUP BY aqreqat funksiyaları yazı qruplarından aslı olmayaraq tətbiq edilir. Qrupların formalaşması qaydası - sətirlərin eyni qiymətləridir (verilmiş halda snum). Verilmiş sualı realizə edərkən MAX funksiyası hər bir snum qiyməti üçün hesablanır.
GROUP BY-ı bir neçə sətir ilə hesablamaq olar. Əvvəlki sualı çətinləşdirək:
SELECT snum, odate, MAX( amt ) FROM Orders GROUP BY snum, odate
Yəni biz hər bir tarix ilə qəbul olunmuş agentlərin kod və maksimal qiymətlərini hesablayırıq.
snum odate ----- ------------------------ ---------- 1001 1999-10-03 00:00:00.000 767.1900 1001 1999-10-05 00:00:00.000 4723.0000 1001 1999-10-06 00:00:00.000 9891.8800 1002 1999-10-03 00:00:00.000 5160.4500 1002 1999-10-04 00:00:00.000 75.7500 1002 1999-10-06 00:00:00.000 1309.9500 1003 1999-10-04 00:00:00.000 1713.2300 1004 1999-10-03 00:00:00.000 1900.1000 1007 1999-10-03 00:00:00.000 1098.1600
Təbii ki sifariş olmayan günlər görünməyəcək.
Tapşırığı çətinləşdirək: İndi 3000-dən böyük olan hər bir agentin maksimal cəmini tapaq. Bu cür effektə nail olmaq üçün HAVING təklifindən istifadə olunur, hansı ki meyar təyin edir, WHERE təklifinin ayrıca nəticələr üçün etdiyi nəticə qrupundan pozulması üçün. Bu bu cür edilir:
SELECT snum, odate, MAX( amt ) FROM ORDERS GROUP BY snum, odate HAVING MAX( amt ) > 3000
snum odate ----- ------------------------ ---------- 1002 1999-10-03 00:00:00.000 5160.4500 1001 1999-10-05 00:00:00.000 4723.0000 1001 1999-10-06 00:00:00.000 9891.8800
Aqreqat funksiyaları təkcə VB-dən təyin olunmuş məlumatları seçmək üçün deyil, həm də onların ümumiləşdirilməsi və analizi üçün də istifadə olunurlar. İrəlidə biz bir neçə cədvəldən məlumatların seçilmısi ilə tanış olacağıq.