Sunteți pe pagina 1din 16

Folosirea functiilor de grup

Obiective

 Identificarea functiilor de grup disponibile


 Descrierea folosirii functiilor de grup
 Gruparea datelor folosind clauza Group By
 Includerea sau excluderea liniilor grupate folosind clauza HAVING

Ce sunt functiile de GRUP ?

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

Functii grup ( Continuare )


Fiecare din functii accepta/primeste un argument. Urmatorul tabel identifica optiunile pe care le
puteti folosi în sintaxa:
Functie Descriere
AVG([DISTINCT|ALL]n) Valoarea medie a lui ’’n’’, ignorând
valorile nule;
COUNT({*|[DISTINCT|ALL]expr}) Numarul de rânduri, unde expresia
evalueaza altceva decât valori nule.
Numara toate rândurile selectate folosind
*, inclusiv duplicatele si rândurile cu
valori nule;
MAX([DISTINCT|ALL]expr) Valoarea maximala a expresiei, ignorând
valorile nule;
MIN([DISTINCT|ALL]expr) Valoarea minima a expresiei, ignorând
valorile nule;
STDDEV([DISTINCT|ALL]x) Abaterea standard a lui ’’n’’, ignorând
valorile nule;
SUM([DISTINCT|ALL]n) Suma valorilor lui ’’n’’, ignorând valorile
nule;
VARIANCE([DISTINCT|ALL]x) Variatia lui ’’n’’, ignorând valorile nule;

Folosirea functiilor de grup

SELECT column, group_function(column)


FROM table
[WHERE condition]
[ORDER BY column ];

Îndrumar pentru folosirea functiilor de grup

 DISTINCT face functia sa considere numai valorile distincte. ’’ALL’’, ia în consideratie


fiecare valoare, inclusiv valorile duble. ’’ALL’’ este implicit si deci nu mai trebuie
specificat
 Tipurile de date pentru argumente pot fi : CHAR, VARCHAR2,NUMBER, sau DATE.
 Toate grupurile de functii, cu exceptia COUNT(*) ignora valorile nule. Pentru a inlocui o
valoare cu valori nule, folositi functia NVL.

2
Folosirea functiilor AVG si SUM

Puteti folosi functiile AVG si SUM pentru date numerice .

SQL> SELECT AVG(SAL),MAX(sal),


2 MIN(sal),SUM(sal)
3 FROM emp
4 WHERE job LIKE ‘SALES’;

AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)


__________ ___________ ___________ ___________
1400 1600 1250 5600

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.

Folosirea functiilor MIN si MAX

Puteti folosi functiile MIN si MAX pentru orice tip de date.

SQL> SELECT MIN(hiredate),MAX(hiredate)


2 FROM emp;

MIN(HIRED) MAX(HIRED)
____________ ____________
17-DEC-80 12-JAN-83

Functiile grup ( continuare )

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.

SQL> SELECT MIN(ename),MAX(ename)


2 FROM emp;

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(*) returneaza numarul de linii dintr-o tabela.

SQL> SELECT COUNT(*)


2 FROM emp
3 WHERE deptno = 30;

COUNT(*)
6

Functia COUNT

Functia COUNT are doua formate :


 COUNT(*)
 COUNT(expr)
COUNT(*) întoarce numarul de rânduri în tabel , incluzând rândurile duble si rândurile continând
valori nule.
 În contrast, COUNT(expr) întoarce numarul rândurilor nenule din coloana identificata
prin expr.
Exemplul de mai sus afiseaza numarul angajatilor din departamentul 30.

Folosirea functiei COUNT

COUNT(expr) returneaza numarul de linii nenule.

SQL> SELECT COUNT(comm)


2 FROM emp
3 WHERE deptno = 30;

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.

SQL> SELECT COUNT(deptno)


2 FROM emp;

4
COUNT(DEPTNO)
14

Afiseaza numarul departamentelor distincte din tabelul EMP.

SQL> SELECT COUNT((DISTINCT (deptno))


2 FROM emp;

COUNT((DISTINCT (DEPTNO))
3

Functiile de grup si valorile Null

Functiile de grup ignora valorile null din coloana.

SQL> SELECT AVG(comm)


2 FROM emp;

AVG(COMM)
550

Functiile grup si valorile nule

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 ).

Folosirea functiei NVL cu functiile Group

Functia NVL forteaza functiile de grup sa includa valori nule.

SQL> SELECT AVG(NVL(comm,0))


2 FROM emp;

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).

Crearea grupurilor de date

EMP

DEPTNO SAL ’’ salariul


____________ ___________ mediu în
tabela EMP
10 2450 pentru fiecare
10 5000 2916.6667 departament “
10 1300
20 800 DEPTNO AVG(SAL)
20 1100 _______ __________
20 3000 2175 10 2916.6667
20 3000 20 2175
20 2975 30 66.6667
30 1600
30 2850
30 1250 1566.6667
30 950
30 1500
30 1250

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.

Creara grupurilor de date :


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.

Folosirea clauzei Group By

Toate coloanele din lista SELECT care nu sunt în functiile de grup trebuie sa fie în clauza
GROUP BY.

SQL> SELECT deptno,AVG(sal)


2 FROM emp
3 GROUP BY deptno;

DEPTNO AVG(SAL)
_________ __________
10 2916.6667
20 2175
30 1566.6667

Clauza GROUP BY( continuare )


Când folositi clauza GROUP BY, asigurati-va ca toate coloanele din lista SELECT care nu sunt
în functiile grup sunt incluse în clauza GROUP BY. Exemplul de mai sus afiseaza numarul si
media salariilor pentru fiecare departament. Iata cum este evaluata declaratia SELECT de mai sus,
continând o clauza GROUP BY :
Clauza SELECT specifica coloanele care sa fie afisate :
- coloana numarului departamentului
- media tuturor salariilor din grupul specificat în clauza GROUP BY
Clauza FROM tabelul pe care baza de date trebuie sa-l acceseze : tabelul EMP.
Clauza WHERE specifica liniile ce trebuie incluse. Daca nu exista nici o clauza WHERE,
implicit toate rândurile sunt incluse.
Clauza GROUP BY specifica cum ar trebui grupate rândurile. Rândurile sunt grupate dupa
numarul departamentului, deci functia AVG care este aplicata coloanei salariilor va calcula
media salariilor pentru fiecare departament.

7
Folosirea clauzei Group By

Coloanele GROUP BY care nu sunt în lista SELECT.

SQL> SELECT AVG(sal)


2 FROM emp
3 GROUP BY deptno;

AVG(SAL)
___________
2916.6667
2175
1566.6667

Clauza GROUP BY( continuare )

Coloana GROUP BY nu trebuie sa fie în clauza SELECT. De exemplu, declaratia SELECT de


mai sus afiseaza media salariilor pentru fiecare departament fara sa afiseze numarul
departamentului respectiv. Totusi, fara numarul departamentului, rezultatele nu arata
semnificativ.
Puteti folosi functia grup în clauza ORDER BY.

SQL> SELECT deptno,AVG(sal)


2 FROM emp
3 GROUP BY deptno
4 ORDER BY AVG(sal);

DEPTNO AVG(SAL)
_________ __________
30 1566.6667
20 2175
10 2916.6667

8
Gruparea mai multor coloane

EMP ’’ suma salariilor in


tabela EMP pentru
fiecare functie
DEPTNO JOB SAL grupate dupa
__________ __________ ______ departament’’
10 MANAGER 2450
10 PRESIDENT 5000 DEPTNO JOB SUM(SAL)
10 CLERK 1300 ________ _________ ________
20 CLERK 800 10 CLERK 1300
20 CLERK 1100 10 MANAGER 2450
20 ANALYST 3000 10 PRESIDENT 5000
20 ANALYST 3000 20 ANALYST 6000
20 MANAGER 2975 20 CLERK 1900
30 SALESMAN 1600 20 MANAGER 2975
30 MANAGER 2850 30 CLERK 950
30 SALESMAN 1250 30 MANAGER 2850
30 CLERK 950 30 SALESMAN 5600
30 SALESMAN 1500
30 SALESMAN 1250

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 ).

Folosirea clauzei GROUP BY


pentru mai multe coloane

SQL> SELECT deptno,job,sum(sal)


2 FROM emp
3 GROUP BY deptno,job;

DEPTNO JOB AVG(SAL)


_________ ___________ __________
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 6000
20 CLERK 1900
...
9 rows selected.

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.

Interogari ilegale în folosirea


functiilor de grup

Orice coloana sau expresie în lista SELECT care nu este o functie trebuie sa fi o clauza
GROUP BY.

SQL> SELECT deptno,COUNT(ename)


2 FROM emp;

SELECT deptno,COUNT(ename)
*
ERROR at line 1:
ORA-00937: not a single group group function

Întrebari ilegale în folosirea functiilor grup

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).

SQL> SELECT deptno,COUNT(ename)


2 FROM emp
3 GROUP BY deptno;

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.

Întrebari ilegale în folosirea


functiilor de grup

 Nu puteti folosi clauza WHERE pentru restrictionarea grupurilor.


 Folositi clauza HAVING pentru restrictionarea grupurilor.

SQL> SELECT deptno,AVG(sal)


2 FROM emp
3 WHERE AVG(sal)>2000
4 GROUP BY deptno;

WHERE AVG(sal)>2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here

Întrebari ilegale în folosirea functiilor grup ( continuare )

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.

SQL> SELECT deptno,AVG(sal)


2 FROM emp
3 GROUP BY deptno
4 HAVING AVG(sal)>2000;

DEPTNO AVG(SAL)
_________ ______________
10 2916.6667
20 2175

11
Excluderea rezultatelor Group

EMP

DEPTNO SAL ’’ salariul


____________ ___________ maxim pe
10 2450 departament
10 5000 5000 mai mare de
10 1300 2900 $
pentru fiecare
20 800 DEPTNO AVG(SAL)
20 1100 _______ __________
20 3000 3000 10 5000
20 3000 20 3000
20 2975
30 1600
30 2850
30 1250 2850
30 950
30 1500
30 1250

Restrictionarea rezultarelor grupului

Î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 $.

Excluderea rezultatelor Group :


Clauza HAVING

Folositi clauza HAVING pentru restrictionarea grupurilor:


- Câmpurile sunt grupate.
- Se aplica functia GROUP.

SELECT column, group_function


FROM table
[WHERE condition ]
[GROUP BY group_by_expression]
[HAVING group condition]
[ORDER BY column];

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.

Folosirea clauzei HAVING

SQL> SELECT deptno,max(sal)


2 FROM emp
3 GROUP BY deptno
4 HAVING max(sal)>2900;

DEPTNO MAX(SAL)
_________ __________
10 5000
20 3000

Clauza HAVING( continuare )

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 $.

SQL> SELECT deptno,AVG(sal)


2 FROM emp
3 GROUP BY deptno
4 HAVING MAX(sal)>2900;

DEPTNO AVG(SAL)
_________ __________
10 2916.6667
20 2175
13
Folosirea clauzei HAVING

SQL> SELECT job,SUM(sal) PAYROLL


2 FROM emp
3 WHERE job NOT LIKE ’SALES%’
4 GROUP BY job
5 HAVING SUM(sal)>5000
6 ORDER BY SUM(sal);

JOB PAYROLL
____________ __________
ANALYST 6000
MANAGER 8275

Clauza HAVING( continuare )

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.

Gruparea functiilor de grup

Afisarea medie a salariului maxim.

SQL> SELECT max(avg(sal))


2 FROM emp
3 GROUP BY deptno;

MAX(AVG(SAL))
________________
2916.6667

Gruparea functiilor grupate

Functiile de grup pot fi grupate pe orice adâncime. Exemplul de mai sus afiseaza salariul mediu
maxim.
Rezumat

SELECT column, group_function(column)


FROM table
[WHERE condition ]
[GROUP BY group_by_expression]
[HAVING group condition]
[ORDER BY column];

14
Ordinea evaluarii clauzelor :
 Clauza WHERE
 Clauza GROUP BY
 Clauza HAVING

Rezumat :

În SQL sunt disponibile sapte functii grup :


 AVG
 COUNT
 MAX
 MIN
 SUM
 STDDEV
 VARIANCE
Puteti crea subgrupuri folosind clauza GROUP BY. Grupurile pot fi excluse folosind clauza
HAVING.
Plasati clauzele HAVING si GROUP BY dupa clauza WHERE. Plasati clauza ORDER BY
ultima.
Serverul Oracle evalueaza clauzele în ordinea urmatoare :
 Daca declaratia contine clauza WHERE, serverul stabileste rândurile candidate.
 Serverul identifica grupurile sprcificate în clauza GROUP BY.
 Clauza HAVING restrictioneaza mai departe grupurile de rezultate care nu satisfac
grupurile de criterii din clauza HAVING.
Practica
 Afisarea diferitelor interogari folosind functiile de grup
 Gruparea câmpurilor pentru a obtine mai mult de un rezultat
 Excluderea grupurilor folosind clauza HAVING

Practica.

1. Functiile de grup actioneaza asupra mai multor randuri si produc un rezultat. (True/False)

2. Functiile de grup includ valoarea null in calcule (True/False).

3. Clauza WHERE restrictioneaza rindurile anterior includerii acestora in grupurile de calcul


(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.

6. Scrieti o interogare pentru afisarea numarului de angajati cu aceeasi meserie.

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

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