SECTION 5 L1 - Group By and Having Clauses Clauza Group By 1. SELECT department_id, AVG(salary),MAX(salary) 2. SELECT job_id, last_name, AVG(salary) GROUP BY job_id; ORA-00979: not a GROUP BY expression 3. SELECT count(first_name), shirt_color FROM students GROUP BY shirt_color 4. WHERE last_name <> King 5. SAU SELECT count(*), shirt_color FROM students GROUP BY shirt_color SELECT AVG(media), specializare FROM studenti WHERE data-absolvire >= 01-JUN-2010 GROUP BY specializare; 6. SELECT COUNT(prenume), an_studiu FROM studenti GROUP BY an_studiu;
In clauza SELECT putem avea: - Functii de grup ( dar nu statistice) - Cimpuri ( care trebuie sa apara si in clauza GROUP BY) Clauza WHERE : Filtreaza inregistrarile asupra carora va actiona SELECT Clauza GROUP BY: - Nu poate contine alias de cimp/coloana Grupuri si subgrupuri (maxim 2) SELECT department_id, job_id, count(*) WHERE department_id > 40 GROUP BY department_id, job_id; Clauza Having Doar grupurile ce respecta conditia mentionata in clauza HAVING vor fi returnate WHERE COUNT(*) > 1 ORA-00934: group function is not allowed here HAVING COUNT(*) >1; Ordinea clauzelor in instructiunea SELECT: SELECT column, group_function FROM table WHERE GROUP BY HAVING ORDER BY
SECTION 5, L2 extensii ale clauzei GROUP BY: Rollup - genereaza subtotaluri la nivel de grup si un total general SELECT department_id, job_id, SUM(salary) GROUP BY ROLLUP (department_id, job_id) Cube genereaza rapoarte cross-tabulate ( la nivel de subgroup / grup /raport) SELECT department_id, job_id, SUM(salary) GROUP BY CUBE (department_id, job_id) GROUPING SETS similar cu utilizarea mai multor clause GROUP BY in aceeasi instructiune SELECT. SELECT department_id, job_id, manager_id, SUM(salary) GROUP BY GROUPING SETS ( (job_id, manager_id), (department_id, job_id), (department_id, manager_id)); 1 2 3 Functia GROUPING(coloana/cimp), utilizata in clauza SELECT Furnizeaza 2 valori: - 1 daca in inregistrarea returnata coloana/cimpul este calculate - 0 in cazul unui cimp simplu
SELECT department_id, job_id, SUM(salary), GROUPING(department_id) Dept_sub_total, GROUPING(job_id) job_sub_total, GROUP BY CUBE (department_id, job_id); SELECT depart_id, job_id, SUM(salary), DECODE(GROUPING(depart_id),1,'DeptAggr row',depart_id) AS DT, DECODE(GROUPING(job_id),1,'JobID Aggr row',job_id) AS JI WHERE depart_id < 50 GROUP BY CUBE (depart_id, job_id);
SELECT cimp1,cimp2 FROM tabel1 <operator> SELECT cimp1,cimp2 FROM tabel2 SECTION 5 L3 operatorii Set UNION, UNION ALL, INTERSECT, MINUS * unde cimp1 si cimp2 trebuie sa fie de acelasi tip si acelasi nume in ambele tabele SELECT department_name "Department", TO_CHAR(NULL) "Warehouse" FROM departments UNION SELECT TO_CHAR(NULL) "Department", warehouse_name FROM warehouses; * clauza ORDER BY poate fi utilizata doar in al 2-lea SELECT SELECT hire_date (1), employee_id (2), to_date(null) start_date (3), to_date(null) end_date (4) UNION SELECT to_date(null )(1),employee_id (2),start_date (3),end_date (4) FROM job_history ORDER BY employee_id;