Sunteți pe pagina 1din 3

BAZE DE DATE – SEMINAR 12

_____________________________________________________________________

Exercitii recapitulative III – Interogari, functii de grup, CASE, DECODE

In aceste exercitii utilizati tabelele My_emp, My_dept si My_jobs create pe baza


tabelelor Employees, Departmens si Jobs din schema (user-ul) HR. Utilizati
comenzilede mai jos pentru a crea aceste tabele:
DROP TABLE MY_EMP;
DROP TABLE MY_DEPT;
DROP TABLE MY_JOBS;
CREATE TABLE MY_EMP AS SELECT * FROM HR.EMPLOYEES;
CREATE TABLE MY_DEPT AS SELECT * FROM HR.DEPARTMENTS;
CREATE TABLE MY_JOBS AS SELECT * FROM HR.JOBS;

Exercitii:

1. Sa se calculeze pe fiecare departament (department_name) suma totala


corespunzatoare salariilor angajatilor, denuminind coloana respectiva
total_salarii.
Select a.id_departament,d.denumire_departament,
sum(a.salariul)total_salarii
from angajati a, departamente d
where a.id_departament=d.id_departament
group by a.id_departament,d.denumire_departament;
2. Sa se calculeze urmatoarele statistici pe fiecare tip de functie (job_title):
salariul minim, salariul mediu si salariul maxim corespunzator fiecarei functii.
select id_functie,min(salariul),max(salariul),avg(salariul)
from angajati
group by id_functie;
3. Modificati conditia de sus astfel incat sa se afiseze si numarul total de angajati
care detin o anumit functie.
select id_functie,min(salariul),max(salariul),avg(salariul),
count(id_angajat)
from angajati
group by id_functie;
4. Sa se calculeze numarul de angajati pe fiecare departament.
select a.id_departament,d.denumire_Departament, count (a.id_angajat)
from angajati a, departamente d
where a.id_Departament=d.id_Departament
group by a.id_departament, d.denumire_Departament;
5. Sa se calculeze numarul de angajati din departamentele: Purchasing, Shipping,
IT.
select count(a.id_angajat), a.id_departament,d.denumire_departament
from angajati a, departamente d
where a.id_departament=d.id_departament and
d.denumire_departament in ('Purchasing','Shipping','IT')
group by a.id_departament,d.denumire_departament ;
6. Sa se calculeze numarul de salariati angajati inainte de 15 august 2000
(hire_date).
select count(id_angajat) nr_angajati
from angajati
where data_angajare<to_date('15-AUG-2000','DD-MM-YY');

1
BAZE DE DATE – SEMINAR 12
_____________________________________________________________________

7. Sa se afiseze doar departamentele care au un numar de angajati >5. Sa se


calculeze pentru aceste departamente suma total de plata referitoare la salarii.
select id_departament, count (id_angajat),sum(salariul)
from angajati
group by id_departament
having count(id_angajat)>5;
8. Sa se afiseze numai departamentele care platesc salarii totale cu valoarea mai
mare de 20000. Sa se calculeze pentru acestea salariul mediu pe department.
select id_departament,round(avg(salariul),2) salariu_mediu
from angajati
group by id_departament
having sum(salariul)>2000;
9. Sa se calculeze pe fiecare functie in parte suma totala incasata formata din
salariu * (1+comisionul) aferent. Sa se afiseze doar functiile cu valori peste
25000.
select id_functie, sum(salariul*nvl(comision,0)+salariul)salariu_total
from angajati
group by id_functie
having sum(salariul*nvl(comision,0)+salariul)>25000;
10. Realizati o statistica pe fiecare department (department_id) si pe fiecare
functie din departamente (job_id) referitoare la salariul minim, salariul mediu,
salariul maxim si numarul total de angajati.
select id_Departament, id_functie,
min(salariul),max(salariul),round(avg(salariul),2),count(id_angajat)
from angajati
group by id_Departament, id_functie
order by id_departament;
11. Sa se afiseze numele angajatilor si sa se mareasca salariile in functie de
departament astfel:
- Daca department_id= 20 atunci cresterea sa fie de 10%
- Daca department_id= 40 atunci cresterea sa fie de 15%
- Daca department_id= 60 atunci cresterea sa fie de 20%
- In rest sa nu se aplice cresteri salariale.
select id_departament,nume, decode
(id_departament,20,0.1,40,0.15,60,0.2,0) marire
from angajati
order by id_Departament;
12. Sa se afiseze numele, salariul si functia angajatiilor, precum si suma de incasat
astfel:
- daca job_id este SA_REP sau SA_MAN atunci suma_incasat = salary*
(1+commission_pct)
- daca job_id este IT atunci suma_incasat = salary*1.2
- pentru celelalte functii suma_incasat = salary
select nume, salariul, id_functie,
(case when id_functie='SA_REP' or id_functie='SA_MAN' then
salariul*(1+nvl(comision,0))
when id_functie='IT' then salariul*1.2
else salariul
end) suma_de_incasat
from angajati

2
BAZE DE DATE – SEMINAR 12
_____________________________________________________________________

order by salariul;
13. Sa se acorde prime fiecarui angajat in functie de vechime astfel:
- Pentru cei angajati inainte de 1 ianuarie 1995 prima=30%*salary
- Pentru cei angajati inainte de 1 ianuarie 1997 prima=20%*salary
- Pentru cei angajati inainte de 1 ianuarie 2000 prima=10%*salary
- Pentru ceilalti angajati prima = 5%*salary
select nume,
(case when data_angajare<to_date('01-JAN-95','DD-MM-YY') then
0.3*salariul
when data_angajare<to_date('01-JAN-97','DD-MM-YY') then
0.2*salariul
when data_angajare<to_date('01-JAN-00','DD-MM-YY') then
0.1*salariul
else 0.05*salariul
end) prima
from angajati;
14. Sa se rezolve punctul de mai sus cu ajutorul operatorului UNION.
select nume, (0.3*salariul )prima
from angajati
where data_angajare<to_date('01-JAN-95','DD-MM-YY')

union

select nume, (0.2*salariul )prima


from angajati
where data_angajare<to_date('01-JAN-97','DD-MM-YY') and
data_angajare>to_date('01-JAN-95','DD-MM-YY')

union

select nume, (0.1*salariul )prima


from angajati
where data_angajare<to_date('01-JAN-00','DD-MM-YY') and
data_angajare>to_date('01-JAN-97','DD-MM-YY')

union

select nume, (0.05*salariul )prima


from angajati
where data_angajare>=to_date('01-JAN-95','DD-MM-YY');
15. Sa se calculeze valoarea comisionului pentru fiecare angajat si folosind
operatorul MINUS sa se elimine angajatii care nu au comision (este null).
select nume,(salariul*comision+salariul) valoare_comision
from angajati

minus

select nume,(salariul*comision+salariul) valoare_comision


from angajati
where comision is null;

S-ar putea să vă placă și