You are on page 1of 6

Funcii de agregare: COUNT, SUM, AVG, MAX, MIN

Rezultatul oricrei fraze SELECT este o nou relaie (tabel). n lipsa opiunii GROUP
BY, dac n clauza SELECT este prezent o funcie predefinit, tabela rezultat va conine o
singur linie.
Funcia COUNT contorizeaz valorile unei coloane, altfel spus, numr, ntr-o relaie,
cte valori diferite de NULL are coloana specificat.
Exemplu 1

Ci clieni are firma ?


SELECT COUNT (CodClient) AS Nr_Clienti
FROM CLIENTI

n funcia COUNT se poate utiliza ca argument, n locul numelui unei coloane, semnul *;
n acest caz se va determina cte linii are tabela la care se aplic funcia respectiv.
Exemplu 2

La ci clieni s-au trimis facturi ?


SELECT COUNT ()
FROM CLIENTI
WHERE CodClient IN
(SELECT CodClient
FROM FACTURIEMISE)
Rezultatul corect poate fi ns obinut i prin utilizarea clauzei DISTINCT astfel:

SELECT COUNT (DISTINCT CodClient)


FROM FACTURIEMISE

Funcia 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 vnzrilor

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"


Funciile 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

Atenie ! Varianta urmtoare 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 relaii, pe baza valorilor comune ale unei coloane. n frazele SELECT formulate pn 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 conine clauza GROUP BY este o tabel care va fi
obinut prin regruparea tuturor liniilor din tabelele enumerate n FROM, care prezint o aceeai
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 numr de linii egal cu numrul de date calendaristice
distincte din tabela FACTURIEMISE. Pentru toate facturile aferente unei zile se va calcula suma
valorilor, datorit utilizrii funciei SUM(ValoareTotala).
Succesiunea pailor este urmtoarea:
1. Se ordoneaz liniile tabelei FACTURIEMISE n funcie de valoarea atributului Data figura 6.19.

Figura nr. 6.19. Pasul 1 al gruprii

2. Se formeaz cte un grup pentru fiecare valoare distinct a atributului Data - vezi figura
6.20.

Figura nr. 6.20. Al doilea pas al gruprii

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 gruprii

Exemplu 2

Care este numrul facturilor emise pentru fiecare client ?


SELECT NumeClient, COUNT(NrFactura)
FROM FACTURIEMISE INNER JOIN CLIENTI

ON FACTURIEMISE.CodClient = CLIENTI.CodClient
GROUP BY FACTURIEMISE.CodClient

Pn 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 restricii care sunt aplicate grupurilor de
tupluri, deci nu tuplurilor "individuale", aa cum "face" clauza WHERE. Din tabela rezultat sunt
eliminate toate grupurile care nu satisfac condiia 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 funcie 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 execuia acestei fraze, se parcurg cei trei pai prezentai la exemplul 1, apoi, din cele nou
tupluri obinute prin grupare, sunt extrase numai cele care ndeplinesc condiia
SUM(ValoareTotala)>15000000. Rezultatul final este cel din figura 6.22.

Figura 6.22. Rezultatul consultrii - exemplul 3

Exemplu 4

S se afieze 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 pcate, nici acest tip de interogare (prezena subconsultrilor n clauza HAVING) nu
este agreat de Visual FoxPro, astfel nct 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 cror 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)
Coninutul cursorului NR_PE_ZILE, precum i rezultatul final sunt cele din figura 6.23.

Figura 6.23. Obinerea n VFP a zilei cu cele mai multe facturi

You might also like