Documente Academic
Documente Profesional
Documente Cultură
Lectia 05
Lectia 05
Obiective
Fuctiile de grup opereaza pe seturi de linii oferind un singur rezultat pentru tot grupul .
EMP
DEPTNO SAL
______________ __________
10 2450
10 5000
10 1300
20 800
20 1100 ’’ salariul MAX(SAL)
20 3000 maxim în -------------
20 3000 tabela EMP ” 5000
20 2975
30 1600
30 2850
30 1250
30 950
30 1500
30 1250
Functiile grup
Spre deosebire de functiile de un singur rând, functiile de grup opereaza pe seturi de rânduri
pentru a da un singur rezultat unui grup. Aceste seturi pot fi întregul tabel sau tabelul împartit în
grupuri.
1
Tipuri de functii de grup
AVG
COUNT
MAX
MIN
STDDEV
SUM
VARIANCE
2
Folosirea functiilor AVG si SUM
Functii grup
Puteti folosi functiile AVG, SUM, MIN, si MAX la coloanele care pot stoca date numerice.
Exemplul de deasupra afiseaza media, maximul, minimul si suma salariilor lunare pentru toti
vânzatorii.
MIN(HIRED) MAX(HIRED)
____________ ____________
17-DEC-80 12-JAN-83
Puteti folosi functiile MAX si MIN pentru orice tip de date. Exemplul urmator afiseaza numele
angajatului care este primul si numele angajatului care este ultimul în lista alfabetica a tuturor
angajatilor.
MIN(ENAME) MAX(ENAME)
____________ ____________
ADAMS WARD
Nota : Functiile AVG, SUM, VARIANCE, si STDDEV pot fi folosite doar cu valori numerice
de date.
3
Folosirea functiei COUNT
COUNT(*)
6
Functia COUNT
COUNT(COMM)
4
Functia COUNT(continuare)
Exemplul de mai sus afiseaza numarul angajatilor din departamentul 30 care pot sa câstige un
comision.
Observati ca rezultatul da numarul total de rânduri sa fie patru pentru ca doi angajati din
departamentul 30 nu pot câstiga comision si contine o valoare nula în coloana COMM.
Exemplu
Afiseaza numarul departamentelor din tabelul EMP.
4
COUNT(DEPTNO)
14
COUNT((DISTINCT (DEPTNO))
3
AVG(COMM)
550
Toate functiile grup, cu exceptia COUNT(*) ignora valorile nule din coloana. În exemplele de
mai sus media este calculata doar pe baza rândurilor din tabel în care o valoare valida ocupa
coloana COMM. Media este calculata ca totalul comisioanelor platite catre toti angajatii, împartit
prin numarul angajatilor care primesc comision( 4 ).
AVG(NVL(COMM,0))
157.14286
5
Functiile grup si valorile nule ( continuarea )
Functia NVL forteaza functiile grup sa includa valori nule. În exemplul de mai sus, media este
calculata pe baza tuturor rândurilor din tabel indiferent daca în coloana COMM sunt stocate valori
nule. Media este calculata ca un comision total platit tuturor angajatilor, împartit la numarul total al
angajatilor companiei (14).
EMP
Grupuri de date
Pâna acum, toate functiile grup au tratat tabelul ca fiind un larg grup de informatii.
Uneori, trebuie sa împartiti tabelul de informatii în grupuri mai mici. Aceasta se poate face
folosind clauza GROUP BY.
SELECT column,group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
Împartirea câmpurilor dintr-o tabela în câmpuri mai mici folsind clauza GROUP BY .
6
Clauza GROUP BY
Puteti folosi clauza GROUP BY pentru a împarti rândurile din tabel în grupuri. Puteti folosi deci
functiile grup pentru a întoarce sumarul informatiei pentru fiecare grup.
În sintaxa :
group by expresion specifica coloanele ale caror valori determina bazele
pentru gruparea rândurilor.
Îndrumar
Daca includeti o functie grup intr-o clauza SELECT, nu puteti selecta rezultatele
individuale decât daca coloana individuala apare în clauza GROUP BY. Veti primi un
mesaj de eroare daca nu includeti coloana.in clauza Group By.
Folosind o clauza WHERE, se exclud rândurile înainte de a le diviza în grupuri.
Implicit, rândurile sunt sortate în ordinea ascendenta a coloanelor incluse în lista
GROUP BY. Puteti specifica o alta ordine folosind clauza ORDER BY.
Toate coloanele din lista SELECT care nu sunt în functiile de grup trebuie sa fie în clauza
GROUP BY.
DEPTNO AVG(SAL)
_________ __________
10 2916.6667
20 2175
30 1566.6667
7
Folosirea clauzei Group By
AVG(SAL)
___________
2916.6667
2175
1566.6667
DEPTNO AVG(SAL)
_________ __________
30 1566.6667
20 2175
10 2916.6667
8
Gruparea mai multor coloane
Grupuri în grupuri
Câteodata trebuie sa vedem rezultate pentru grupuri din grupuri. Extragerea de deasupra arata un
raport care afiseaza totalul salariilor ce au fost platite pentru fiecare nume de functie, din fiecare
departament.
Tabelul EMP este grupat mai întâi dupa numarul departamentului si apoi aceasta grupare se
grupeaza dupa numele functiei. De exemplu, doi functionari din departamentul 20 sunt grupati
împreuna si se afiseaza un singur rezultat ( salariul total ).
9
Grupuri în grupuri ( continuare )
Puteti întoarce rezultatele sinteza pentru grupuri si subgrupuri prin listarea a mai mult de o
coloana GROUP BY. Puteti determina ordinea implicita de ordonare a rezultatelor prin ordinea
coloanelor din clauza GROUP BY. Iata cum se evalueaza declaratia SELECT de mai sus, care
contine o clauza GROUP BY :
Clauza SELECT specifica coloana ce trebuie afisate:
- Numarul departamentului din tabelul EMP
- Numele functiei din tabelul EMP
- Suma tuturor salariilor din grupul pe care l-ati specificat în clauza GROUP BY
Clauza FROM specifica tabelul pe care baza de date trebuie sa-l acceseze : tabelul
EMP
Clauza GROUP BY specifica cum trebuie sa grupati rândurile :
- Mai întâi rândurile se grupeaza dupa numarul departamentului.
- Apoi, din grupurile dupa numarul departamentului, rândurile se grupeaza dupa
numele functiei.
Deci functia SUM este aplicata coloanei salariilor pentru toate numele de functii din fiecare grup
dupa numarul departamentului.
Orice coloana sau expresie în lista SELECT care nu este o functie trebuie sa fi o clauza
GROUP BY.
SELECT deptno,COUNT(ename)
*
ERROR at line 1:
ORA-00937: not a single group group function
Ori de câte ori folositi o combinatie de articole individuale ( DEPTNO ) si functii grup
(COUNT) în aceeasi declaratie SELECT, trebuie sa includeti o declaratie ( GROUP BY ) care sa
specifice articolele individuale ( în acest caz, DEPTNO ). Daca clauza GROUP BY lipseste, atunci
mesajul de eroare ’’ not a single-group function’’ apare si un asterisc (*) arata catre coloana gresita.
Puteti repara eroarea de mai sus adaugând clauza (GROUP BY).
10
DEPTNO COUNT(ENAME)
_________ _________________
10 3
20 5
30 6
Orice coloana sau expresie din lista SELECT care nu este o functie agregat trebuie sa fie în
clauza GROUP BY.
WHERE AVG(sal)>2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
Clauza WHERE nu poate fi folosita pentru a restrictiona grupuri. Declaratia SELECT de mai sus
rezulta cu o eroare pentru ca foloseste clauza WHERE pentru a restrictiona afisarea mediei salariilor
din acele departamente care au un salariu mediu mai mare de 2000 $.
Puteti corecta eroarea de mai sus prin folosirea clauzei HAVING pentru a restrictiona grupurile.
DEPTNO AVG(SAL)
_________ ______________
10 2916.6667
20 2175
11
Excluderea rezultatelor Group
EMP
În acelasi mod în care folositi clauza WHERE pentru a restrictiona rândurile pe care le-ati
selectat, folositi clauza HAVING pentru a restrictiona grupuri. Pentru a gasi salariul maxim la
fiecare departament, dar sa includa doar departamentele care au salariul maxim mai mare de 2900 $,
trebuie sa faceti urmatoarele doua lucruri :
1. Gasiti salariul mediu pentru fiecare departament grupând dupa numarul departamentului.
2. Restrictionati grupurile la acele departamente cu un salariu maxim mai mare de 2900 $.
12
Clauza HAVING
Folositi clauza HAVING pentru a specifica care grupuri trebuiesc afisate. De aceea, mai întâi
restrictionati grupurile pe baza informatiilor totale.
În sintaxa :
group condition restrictioneaza grupurile de rânduri raportate la acele grupuri a caror
conditie specificata este TRUE ( adevarat ).
Serverul Oracle desfasoara urmatorii pasi când folositi clauza HAVING :
Se grupeaza rândurile
Functia grup se aplica grupului
Se afiseaza grupurile care îndeplinesc criteriul din clauza HAVING.
Clauza HAVING poate precede clauza GROUP BY, dar este recomandat sa puneti mai întâi
clauza GROUP BY pentru ca este mai logic. Grupurile sunt formate si functiile grup sunt calculate
înainte de aplicarea clauzei HAVING pentru grupurile din lista SELECT.
DEPTNO MAX(SAL)
_________ __________
10 5000
20 3000
Exemplul de mai sus afiseaza numarul departamentului si salariul maxim la acele departamente
la care salariul minim este mai mare de 2900 $.
Puteti folosi clauza GROUP BY fara a folosi o functie grup în lista SELECT.
Daca restrictionati rândurile bazat pe o functie grup, trebuie sa aveti o clauza GROUP BY bazata
la fel ca si clauza HAVING.
Exemplul de mai jos afiseaza numerele departamentelor si salariul mediu la acele departamente
la care salariul minim este mai mare de 2900 $.
DEPTNO AVG(SAL)
_________ __________
10 2916.6667
20 2175
13
Folosirea clauzei HAVING
JOB PAYROLL
____________ __________
ANALYST 6000
MANAGER 8275
Exemplul de mai sus afiseaza numele functiei si totalul salariului lunar pentru fiecare nume de
functie cu un total al statului de plata depasind 5000 $. Exemplul exclude vânzatorii si sorteaza lista
dupa salariul lunar total.
MAX(AVG(SAL))
________________
2916.6667
Functiile de grup pot fi grupate pe orice adâncime. Exemplul de mai sus afiseaza salariul mediu
maxim.
Rezumat
14
Ordinea evaluarii clauzelor :
Clauza WHERE
Clauza GROUP BY
Clauza HAVING
Rezumat :
Practica.
1. Functiile de grup actioneaza asupra mai multor randuri si produc un rezultat. (True/False)
4. Afisati cel mai mare, cel mai mic, suma si media salariului pentru toti angajatii. Etichetati
coloanele cu Maxim, Minim, Suma si Medie. Rotunjiti rezultatele (fara zecimale). Salvati
instructiunea in fisierul p4.sql.
5. Modificati p4.sql astfel incat sa afiseze aceleasi informatii pentru fiecare tip de meserie. Salvati
modificarile in p5.sql.
7. Determinati numarul managerilor fara sa-i listati. Etichetati coloana Nr. Manageri.
8. Scrieti o interogare care sa afiseze diferenta dintre salariile cele mai mari si cele mai mici.
Etichetati coloana ‘Diferenta’.
15
9. Afisati numarul managerului si salariul celui mai prost platit angajat pentru acel manager.
Excludeti pe cei care nu au manager. Excludeti grupurile care au salariul minim mai mic decat
1000$. Sortati rezultatele in ordine descrescatoare dupa salar.
10. Scrieti o interogare care sa afiseze numele departamentului, localitatea, numarul de angajati si
salariul mediu al angajatilor din acel departament. Etichetati coloanele Dname, Loc, No of
People si Salary.
11. Scrieti o interogare care afiseaza numarul total de angajati si numarul total de anagajati care au
fost angajati in anii 1980,1981,1982 si 1983. Etichetati coloanele corespunzator.
12. Afisati meseria, suma salariilor pentru meseria respectiva in cadrul fiecarui departament,
precum si salariul total pentru meserie pentru toate departamentele. Etichetati coloanele
corespunzator: Job, Dept .., …, Dept .., Total.
16