Funcții agregate

7
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 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 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 Exemplu 3 Care este valoarea totală a facturilor emise ? SELECT SUM (ValoareTotala) AS Total_FP

description

Functii agregate in SGBD

Transcript of Funcții agregate

Page 1: Funcții agregate

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 Exemplu 1 Câţi clienţi are firma ?

SELECT COUNT (CodClient) AS Nr_ClientiFROM 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 Exemplu 2 La câţi clienţi s-au trimis facturi ?

SELECT COUNT (*)FROM CLIENTIWHERE 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 3Exemplu 3 Care este valoarea totală a facturilor emise ?

SELECT SUM (ValoareTotala) AS Total_FPFROM FACTURIEMISE

Figura 6.17. Totalul vânzărilorFigura 6.17. Totalul vânzărilor

Exemplu 4 Exemplu 4 Care este totalul valorii facturilor trimise clientului AXON SRL ?

SELECT SUM (ValoareTotala) AS Total_FE_AXONFROM FACTURIEMISE, CLIENTI

Page 2: Funcții agregate

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 5Exemplu 5Care este cea mai mică valoare a unei facturi emise ?

SELECT MIN(ValoareTotala)FROM FACTURIEMISE

Exemplu 6Exemplu 6Care 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ă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

Page 3: Funcții agregate

FROM tabelăGROUP BY coloană-de-regrupare

Exemplu 1Exemplu 1Care este totalul zilnic al valorii facturilor emise ?

SELECT Data, SUM (ValoareTotala) AS Total_ZilnicFROM FACTURIEMISEGROUP 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ăriiFigura 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.

Page 4: Funcții agregate

Figura nr. 6.20. Al doilea pas al grupăriiFigura 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ăriiFigura nr. 6.21. Rezultatul final al grupării

Exemplu 2Exemplu 2Care este numărul facturilor emise pentru fiecare client ?

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

ON FACTURIEMISE.CodClient = CLIENTI.CodClientGROUP 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.

Page 5: Funcții agregate

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ă mFROM tabelăGROUP BY coloană-de-regrupareHAVING caracteristică-de-grup

Exemplu 3Exemplu 3Pentru 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 FACTURIEMISEGROUP BY DataHAVING 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 3Figura 6.22. Rezultatul consultării - exemplul 3

Exemplu 4 Exemplu 4 Să se afişeze ziua în care s-au întocmit cele mai multe facturi.

SELECT DataFROM FACTURIEMISEGROUP BY DataHAVING 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

Page 6: Funcții agregate

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 facturiFigura 6.23. Obţinerea în VFP a zilei cu cele mai multe facturi