Sunteți pe pagina 1din 6

Funcţii de agregare: COUNT, SUM, AVG, MAX, MIN

Rezultatul oricărei fraze SELECT este o nouă relaţie (tabelă). În lipsa opţiunii GROUP
BY, dacă în clauza SELECT este prezentă o funcţie predefinită, tabela rezultat va conţine o
singură linie.
Funcţia COUNT contorizează valorile unei coloane, altfel spus, numără, într-o relaţie,
câte valori diferite de NULL are coloana specificată.
Exemplu 1
Câţi clienţi are firma ?
SELECT COUNT (CodClient) AS Nr_Clienti
FROM CLIENTI

În funcţia COUNT se poate utiliza ca argument, în locul numelui unei coloane, semnul *;
în acest caz se va determina câte linii are tabela la care se aplică funcţia respectivă.
Exemplu 2
La câţi clienţi s-au trimis facturi ?
SELECT COUNT (*)
FROM CLIENTI
WHERE CodClient IN
(SELECT CodClient
FROM FACTURIEMISE)

Rezultatul corect poate fi însă obţinut şi prin utilizarea clauzei DISTINCT astfel:
SELECT COUNT (DISTINCT CodClient)
FROM FACTURIEMISE

Funcţia SUM calculează suma valorilor unei coloane.


Exemplu 3
Care este valoarea totală a facturilor emise ?
SELECT SUM (ValoareTotala) AS Total_FP
FROM FACTURIEMISE

Figura 6.17. Totalul vânzărilor


Exemplu 4
Care este totalul valorii facturilor trimise clientului AXON SRL ?
SELECT SUM (ValoareTotala) AS Total_FE_AXON
FROM FACTURIEMISE, CLIENTI
WHERE FACTURIEMISE.CodClient = CLIENTI.CodClient
AND NumeClient = "AXON SRL"

Funcţiile MAX şi MIN. Determină valorile maxime, respectiv minime ale unei coloane în
cadrul unei tabele.
Exemplu 5
Care este cea mai mică valoare a unei facturi emise ?
SELECT MIN(ValoareTotala)
FROM FACTURIEMISE
Exemplu 6
Care este factura emisă ce are cea mai mare valoare ?
SELECT NrFactura, ValoareTotala
FROM FACTURIEMISE
WHERE ValoareTotala =
(SELECT MAX (ValoareTotala)
FROM FACTURIEMISE)
Subconsultarea extrage valoarea totală maximă a unei facturi, valoare ce va fi utilizată ca
argument pentru SELECT-ul principal. Rezultatul este cel din figura 6.18.

Figura nr. 6.18. Factura cea mai valoroasă

Atenţie ! Varianta următoare nu este corectă:


SELECT NrFactura, MAX(ValoareTotala )
FROM FACTURIEMISE

Gruparea tuplurilor. Clauzele GROUP BY şi HAVING.


SQL permite utilizarea clauzei GROUP BY pentru a forma grupe (grupuri) de tupluri ale
unei relaţii, pe baza valorilor comune ale unei coloane. În frazele SELECT formulate până în
acest paragraf, prin intermediul clauzei WHERE au fost selectate tupluri din diferite tabele.
Prin asocierea unei clauze HAVING la o clauză GROUP BY este posibilă selectarea
anumitor grupe de tupluri ce îndeplinesc un criteriu.
Rezultatul unei fraze SELECT ce conţine clauza GROUP BY este o tabelă care va fi
obţinută prin regruparea tuturor liniilor din tabelele enumerate în FROM, care prezintă o aceeaşi
valoare pentru o coloană sau un grup de coloane.
Formatul general este:
SELECT coloană 1, coloană 2, ...., coloană m
FROM tabelă
GROUP BY coloană-de-regrupare
Exemplu 1
Care este totalul zilnic al valorii facturilor emise ?
SELECT Data, SUM (ValoareTotala) AS Total_Zilnic
FROM FACTURIEMISE
GROUP BY Data
În acest caz tabela-rezultat va avea un număr de linii egal cu numărul de date calendaristice
distincte din tabela FACTURIEMISE. Pentru toate facturile aferente unei zile se va calcula suma
valorilor, datorită utilizării funcţiei SUM(ValoareTotala).
Succesiunea paşilor este următoarea:
1. Se ordonează liniile tabelei FACTURIEMISE în funcţie de valoarea atributului Data -
figura 6.19.

Figura nr. 6.19. Pasul 1 al grupării


2. Se formează câte un grup pentru fiecare valoare distinctă a atributului Data - vezi figura
6.20.
Figura nr. 6.20. Al doilea pas al grupării
3. Pentru fiecare din cele nouă grupuri se calculează suma valorilor atributului
ValoareTotala. Tabela rezultat va avea nouă linii, ca în figura 6.21.

Figura nr. 6.21. Rezultatul final al grupării


Exemplu 2
Care este numărul facturilor emise pentru fiecare client ?
SELECT NumeClient, COUNT(NrFactura)
FROM FACTURIEMISE INNER JOIN CLIENTI
ON FACTURIEMISE.CodClient = CLIENTI.CodClient
GROUP BY FACTURIEMISE.CodClient
Până la standardul SQL99 şi publicarea Amendamentului OLAP la acest standard, în SQL
nu pot fi calculate, prin GROUP BY, subtotaluri pe mai multe niveluri. Pentru aceasta este
necesară scrierea de programe în SGBD-ul respectiv.
Clauza HAVING permite introducerea unor restricţii care sunt aplicate grupurilor de
tupluri, deci nu tuplurilor "individuale", aşa cum "face" clauza WHERE. Din tabela rezultat sunt
eliminate toate grupurile care nu satisfac condiţia specificată.
Clauza HAVING "lucrează" împreună cu o clauză GROUP BY, fiind practic o clauză
WHERE aplicată acesteia.
Formatul general este:
SELECT coloană 1, coloană 2, .... , coloană m
FROM tabelă
GROUP BY coloană-de-regrupare
HAVING caracteristică-de-grup
Exemplu 3
Pentru facturile emise interesează valoarea zilnică a acestora (în funcţie de data la care
au fost întocmite, dar numai dacă aceasta (valoarea zilnică) este de mai mare de cinci
milioane lei.
SELECT Data, SUM(ValoareTotala)
FROM FACTURIEMISE
GROUP BY Data
HAVING SUM(ValoareTotala) > 15000000
La execuţia acestei fraze, se parcurg cei trei paşi prezentaţi la exemplul 1, apoi, din cele nouă
tupluri obţinute prin grupare, sunt extrase numai cele care îndeplinesc condiţia
SUM(ValoareTotala)>15000000. Rezultatul final este cel din figura 6.22.

Figura 6.22. Rezultatul consultării - exemplul 3


Exemplu 4
Să se afişeze ziua în care s-au întocmit cele mai multe facturi.
SELECT Data
FROM FACTURIEMISE
GROUP BY Data
HAVING COUNT(*) >= ALL
(SELECT COUNT(*)
FROM FACTURIEMISE
GROUP BY Data)
Din păcate, nici acest tip de interogare (prezenţa subconsultărilor în clauza HAVING) nu
este agreat de Visual FoxPro, astfel încât este necesară utilizarea mai multor fraze SELECT şi
salvarea rezultatelor intermediare fie în tabele derivate (view-uri), fie în cursoare
(NR_PE_ZILE) care, în VFP sunt tabele temporare a căror viaţă este limitată de închiderea lor,
explicită sau implicită:

SELECT Data, COUNT(*) AS Nr ;


FROM FACTURIEMISE ;
INTO CURSOR NR_PE_ZILE ;
GROUP BY Data

SELECT Data, Nr ;
FROM NR_PE_ZILE ;
WHERE Nr >= ;
(SELECT MAX(Nr) ;
FROM NR_PE_ZILE)

Conţinutul cursorului NR_PE_ZILE, precum şi rezultatul final sunt cele din figura 6.23.

Figura 6.23. Obţinerea în VFP a zilei cu cele mai multe facturi

S-ar putea să vă placă și