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

Inapoi la cuprins.

BogSoft 1999