Capitolul 6

Functii de grup

Acest capitol explica cum informatiile concise pot fi obtinute pen- tru grupuri de siruri folosind functiile de grup.

Vom discuta cum puteti divide sirurile dintr-o tabela in seturi mai mici si cum sa specificati criteriile de cautare intr-un grup de siruri.

Functiile de grup se aplica unui set de siruri.Ele intorc rezultate bazate pe grupuri de siruri , spre deosebire de un rezultat pe sir care e returnat de functii singulare.De regula , toate sirurile din tabela sunt tratate ca un grup.Clauza GROUP BY din cadrul lui SELECT e folosita pentru a imparti sirurile in grupuri mai mici.

Functiile de grup sunt listate mai jos:


     Valoare returnata

AVG({DISTINCT/ALL})
valoarea medie a lui n, ignorind valorile nule.
COUNT({DISTINCT/ALL} expr*)
nr. de siruri unde expresia e evaluata la altceva decit NULL. (*) face ca COUNT sa numere toate sirurile selectate, incluzind duplicatele si sirurile cu NULL.
MAX({DISTINCT/ALL}expr)
maximul valorilor expr.
MIN({DISTINCT/ALL}expr)D
minimul valorilor expresiei expr.
STDDEV({DISTINC/ALL}n)
deviatia standard a lui n , ignorind valorile nule.
SUM({DISTINC/ALL}n)
suma valorilor lui n , ignorind valorile nule.
VARIANCE({DISTINCT/ALL}n)
variatia lui n , ignorind valorile nule.

Toate functiile de deasupra opereaza pe un nr. de siruri (de ex., o intreaga tabela) si sunt cunoscute ca functii de grup sau agregate. DISTINCT face ca functia de grup sa considere doar valorile(nedupli- cate).

ALL considera fiecare valoare , incluzind si toate duplicatele. Implicit este ALL.
Tipul datelor argumentelor poate fi CHAR,NUMBER sau DATA unde expr e listata.
Toate fuctiile de grup cu exceptia lui COUNT(*) ignora valorile nule. Folositi NVL ca de obicei pentru a include null.

FUNCTII DE GRUP

Folosirea functiilor de grup

Pentru a calcula salriul mediu al tuturor angajatilor, introducem :



      SELECT AVG(SAL)

      FROM EMP;



      AVG(SAL)

      --------

      2073.21429

Notati ca liniile din tabela EMP sint considerate ca un singur grup.

O functie de grup poate fi aplicata pe un subset de linii din tabela prin folosirea clauzei WHERE.

Pentru a gasi salariul minim cistigat de un functionar, introducem :



      SELECT MIN(SAL)

      FROM EMP

      WHERE JOB = 'CLERK';



      MIN(SAL)

      --------

        800

Pentru a numara angajatii din departamentul 20, introducem :





      SELECT COUNT(*)

      FROM EMP

      WHERE DEPTNO = 20;



      COUNT(*)

      --------

         5

Clauza GROUP BY

Clauza GROUP BY poate fi folosita pentru a imparti liniile dintr-o tabela in grupuri mai mici. Functiile de rup pot fi folosite pentru a intorece informatii sumare pentru fiecare grup.

Pentru a calcula salariul mediu pentru fiecare functie diferita, introducem:





      SELECT JOB, AVG(SAL)

      FROM EMP

      GROUP BY JOB;



      JOB         AVG(SAL)

     -------    -----------

     ANALYST        3000

     CLERK          1037.5

     MANAGER        2758.33333

     PRESIDENT      5000

     SALESMAN       1400

Excluderea liniilor cind folosim GROUP BY

Liniile pot fi excluse mai intii cu o clauza WHERE, inainte de a le imparti in grupuri.

Pentru a determina salariul mediu pentru fiecare functie in afara de manager, introducem :



      SELECT JOB, AVG(SAL)

      FROM EMP

      WHERE JOB != 'MANAGER'

      GROUP BY JOB;



      JOB         AVG(SAL)

     -------    -----------

     ANALYST        3000

     CLERK          1037.5

     PRESIDENT      5000

     SALESMAN       1400

Solutii


  1. 
         SELECT MIN(SAL) MINIMUM
    
         FROM EMP;
    
    

  2. 
         SELECT MAX(SAL), MIN(SAL), AVG(SAL)
    
         FROM EMP;
    
    

  3. 
         SELECT JOB,
    
                MAX(SAL) MAXIMUM,
    
                MIN(SAL) MINIMUM
    
         FROM EMP
    
         GROUP BY JOB;
    
    

  4. 
         SELECT COUNT(*) MANAGERS
    
         FROM EMP
    
         WHERE JOB = 'MANAGER';
    
    

  5. 
         SELECT JOB,
    
                AVG(SAL) AVSAL,
    
                AVG(SAL * 12 + NVL(COMM, 0)) AVCOMP
    
         FROM EMP
    
         GROUP BY JOB;
    
    

  6. 
         SELECT MAX(SAL) - MIN(SAL) DIFFERENCE
    
         FROM EMP;
    
    

  7. 
         SELECT DEPTNO, COUNT(*)
    
         FROM EMP
    
         GGROUP BY DEPTNO
    
         HAVING COUNT(*) > 3;
    
    

  8. 
         SELECT EMPNO
    
         FROM EMP
    
         GROUP BY EMPNO
    
         HAVING COUNT(*) > 1;
    
    

  9. 
         SELECT MGR, MIN(SAL)
    
         FROM EMP
    
         GROUP BY MGR
    
         HAVING MIN(SAL) >= 1000
    
         ORDER BY MIN(SAL);