Grupisanje podataka
Ciljevi Preoznati mogućnosti groupnih funkcija Upotrijebiti groupne funkcije u SELECT iskazima Grupisati podatake upotrebom GROUP BY klauzule Uključiti ili isključiti grupisane redova upotrebom HAVING klauzule
Grupne funkcije Grupne funkcije rade nad skupinom redova i vraćaju jedan red za svaku grupisanu grupu EMPLOYEES DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 Maksimalna plata u employees tabeli MAX(SAL) --------- 5000
Tipovi grupnih funkcija AVG COUNT MAX MIN STDDEV SUM VARIANCE SELECT [column,] group_function(column) FROM table [WHERE condition] [GROUP BY column] [ORDER BY column];
AVG, SUM, MIN i MAX funkcije AVG i SUM koriste se za numeričke podatke MIN i MAX funkcije vraćaju minimalnu i maksimalnu vrijednost iz grupe podataka za bilo koji tip podatka 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
COUNT funkcija COUNT(Izraz) vraća broj slogova sa ne NULL vrijednostima za izraz SQL> SELECT COUNT(*) COUNT(*) --------- 107 SQL> SELECT COUNT(commission_pct) COUNT(COMMISSION_PCT) ---------------------- 35
NVL i DISTINCT sa GROUP-nim funkcijama COUNT(DISTINCT izraz) vraća broj različitih non-null vrijednosti izraza izraz NVL funkcijom se forsira da grupne funkcije prihvate i Null vrijednosti kolona SQL> SELECT COUNT(distinct department_id) COUNT(DISTINCT DEPARTMENT_ID) ---------------------------- 11 SQL> SELECT AVG(NVL(commission_pct,0)) PROSJEK PROSJEK ---------------- 0.072897196
Grupe podataka EMPLOYEES DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 2916.6667 2175 Prosječna č plata za odjele 10, 20 i 30 1566.6667 DEPTNO AVG(SAL) ------- --------- 10 2916.6667 20 2175 30 1566.6667
Grupisanje podataka sa GROUP BY klauzulom Za podjelu redova u tabeli na manje grupe koristi se GROUP BY klauzula SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; Sve kolone u SELECT listi koje nisu group-ne funkcije moraju biti u GROUP BY klauzuli SQL> SELECT deptment_id, AVG(salary) 3 GROUP BY department_id; DEPTNO AVG(SAL) --------- --------- 10 2916.6667 20 2175 30 1566.6667
Grupisanje po više kolona EMPLOYEES DEPTNO JOB_TITLE SAL --------- --------- --------- 10 MANAGER 2450 10 PRESIDENT 5000 10 CLERK 1300 20 CLERK 800 20 CLERK 1100 20 ANALYST 3000 20 ANALYST 3000 20 MANAGER 2975 30 SALESMAN 1600 30 MANAGER 2850 30 SALESMAN 1250 30 CLERK 950 30 SALESMAN 1500 30 SALESMAN 1250 suma plata grupisana po odjelima i poslovima u tabeli zaposlenih DEPTNO -------- 10 10 10 20 20 20 30 30 30 JOB_TITLE SUM(SAL) --------- ------- CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 5600
Upotreba GROUP BY klauzule sa više kolona SQL> SELECT department_id deptno, job_id, sum(salary) 3 GROUP BY department_id, job_id; DEPTNO JOB_ID SUM(SALARY) --------- --------- ----------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900... 21 rows selected.
Greške pri korištenju GROUP funkcija Sve kolone ili izrazi iz SELECT liste koji nisu grupišuće funkcije moraju biti u GROUP BY klauzuli SQL> SELECT department_id, COUNT(last_name) ; SELECT department_id, COUNT(last_name) * ERROR at line 1: ORA-00937: not a single-group group function
Greške pri korištenju GROUP funkcija Grupišuće funkcije ne mogu se koristiti u WHERE klauzuli za restrikciju podataka HAVING klauzula se koristi za restrikciju podataka po grupi SQL> SELECT department_id, AVG(salary) 3 WHERE AVG(salary) > 2000 4 GROUP BY deptment_id; WHERE AVG(salary) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here
Isključivanje grupnih rezultata EMPLOYEES DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 5000 3000 2850 maksimalna plata po grupi veća do 2900 BAM DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000
Isključivanje grupnih rezultata HAVING klauzula Upotrebom HAVING klauzule vrši se restrikcija rezultata: Redovi se grupišu Primijeni se grupišuća funkcija Vrši se selekcija grupisanih redova pomoću HAVING klauzule SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column];
HAVING klauzula SQL> SELECT department_id deptno, max(salary) 3 GROUP BY department_id 4 HAVING max(salary)>2900; DEPTNO MAX(SALARY) --------- ----------- 10 5000 20 3000 SQL> SELECT job_id, SUM(salary) PAYROLL 3 WHERE job NOT LIKE 'SALES%' 4 GROUP BY job_id 5 HAVING SUM(salary)>5000 6 ORDER BY SUM(salary); JOB_ID PAYROLL --------- --------- ANALYST 6000 MANAGER 8275
Ugniježdene grupne funkcije SQL> SELECT max(avg(salary)) 3 GROUP BY department_id; MAX(AVG(SALARY)) ---------------- 2916.6667 Upotreba dodatnih kolona prilikom pisanja ugniježdenih grupnih funkcija može izazvati dodatne probleme čak i sa prisustvom GROUP BY klauzule SQL> SELECT department_id, max(avg(salary)) 3 GROUP BY department_id; select department_id, max(sum(salary)) * ERROR at line 1: ORA-00937: not a single-group group function
Kratak pregled SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; Izraz WHERE GROUP BY HAVING Opis Klauzula za restriktivno poređenje podataka koji nisu grupisani Grupisanje kolona koje nisu grupne funkcije Klauzula za restriktivno poređenje podataka koji su ili grupne funkcije ili obične kolone tabele
Grupisanje podataka