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