05 - Raportimi i te dhenave te grupuara duke perdorur funksionet e grupimit
Ne kete leksion
Shembuj
shembull 1
Per cdo kod departamenti ne tabelen Employees the afishojme:
Zgjidhje
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees group by department_id
order by department_id
;
Shembull 2
Per cdo pozicion pune ne tabelen Employees the afishojme:
Zgjidhje
select
job_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees group by job_id
order by job_id
;
Shembull 3
Grupimi i vlerave te nje shprehje
Pika a
Te afishojme sipas viteve te vjetersise ne pune sa eshte numri i punonjesve, si me poshte
Vite Pune
10
Punonjes
4
Zgjidhje
select
trunc(months_between(sysdate,hire_date)/12) as vite_pune,
count(*) as Punonjes
from employees
group by trunc(months_between(sysdate,hire_date)/12)
order by vite_pune
;
Shenim:
Vini re klauzolen group by
Pika B
Te shtojme edhe nje analize per pagat:
Paga maksimale
paga minimale
paga mesatare
Zgjidhje
select
trunc(months_between(sysdate,hire_date)/12) as vite_pune,
count(*) as Punonjes,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees
group by trunc(months_between(sysdate,hire_date)/12)
order by vite_pune
;
Filtrimi - Having vs Where
Rasti 1- Filtojme sipas nje funksioni grupi
Te afishojme vetem dept me shpenzime mujore pagash me te madhe se nje vlere e caktuar
Sakte - perdor having:
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees group by department_id
having sum(salary)> &paga
order by department_id
;
Gabim - Perdor where
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees
where sum(salary) >&paga
group by department_id
order by department_id
Rasti 2 Filtrojme sipas nje kollone te listes group by
Te afishojme te gjithe departamentet qe ndodhen ne USA:
Sakte perdor where
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees
where department_id IN
(
select department_id
from departments
where location_id IN
(
select location_id
from locations
where country_id='US'
)
)
group by department_id
order by department_id
;
Sakte perdor Having
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees
group by department_id
having department_id IN
(
select department_id
from departments
where location_id IN
(
select location_id
from locations
where country_id='US'
)
)
order by department_id
;
Rekomandim:
Filtrojme sa me pare te mundemi per efelte te performances. Where filtron para grupimit.
Rasti 3 - Filtrojme sipas nje kollone qe nuk eshte ne listen group by
Shembull te perfshijme ne rezultat vetem punonjesit qe kane me shume se 5 vjet pune
Sakte perdor where
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees
where (months_between(sysdate,hire_date)/12)>5
group by department_id
order by department_id
;
gabim perdor having. Kollona hire_date nuk eshte disponibel pas grupimit.
select
department_id,
sum(salary) as Paga_Mujore,
sum(salary*12) as Paga_Vjetore,
min(salary) as Paga_Minimale,
max(salary) as Paga_Maksimale,
avg(salary) as Paga_Mesatare
from employees
group by department_id
having (months_between(sysdate,hire_date)/12)>5
order by department_id
;
Ushtrime shtese
Shembull
Te afishojme listen e shteteve ne te cilet kemi zyra me me shume se 5 punonjes.
Zgjidhje
select * from countries
where country_id IN
(
select Country_id from locations
where location_id
in
(
select LOCATION_ID from DEPARTMENTS
where department_id IN
(
select
department_id
from employees
group by DEPARTMENT_ID
having count(*)>&nr
)
)
)
Ushtrim
Te afishojme te dhenat e punonjesve qe kane nderruar pune me shume se sa nje here.
Udhezim: Punonjesit kodi i te cileve gjendet me shume se 1 here ne job_history
Zgjidhje
select * from employees
where employee_id
IN
(
select employee_id
from job_history
group by employee_id
having count(*)>1
);
Detyre
A- per sejcilin nga pozicionet e punes afishoni nje analize mbi pagat si me poshte:
zgjidhje
B-
(Where apo Having?)
Te dhenat e mesiperme te llogariten vetem per punonjesit
e nivelit te dyte ( dmth qe manager_id IS NOT NULL)
Zgjidhje
C-(Where apo having)
Te dhenat e mesiperme te llogariten vetem per
pozicionet e punes te cilet kane pagen minimale me te madhe se 1000
Zgjidhje