Sunteți pe pagina 1din 3

-- CASE si DECODE

-- DECODE(VARIABILA, cond1, expr1, cond2, expr2, ...., cond n , expr n, val n+1
implicita);

-- CASE[VARIBLA]
-- WHEN cond1
-- THEN expr1
-- WHEN cond2
-- THEN expr2
-- .....
-- WHEN cond n
-- THEN expr n
-- ELSE val n+1 implicita
-- END

--1. Sa se calculeze comisionul angajatilor in functie de pozitia pe care o ocupa:


-- 0.1% din valoarea comenzilor daca pozitia este SA_REP
-- 0.2% din valoarea comenzilor daca pozitia este SA_MAN
-- 0.3% din valoarea comenzilor daca pozitia este AD_PRES

select nume, id_functie,

CASE
WHEN UPPER(id_functie) = 'AD_PRES'
THEN 0.3

WHEN UPPER(id_functie) = 'SA_REP'


THEN 0.1

WHEN UPPER(id_functie) = 'SA_MAN'


THEN 0.2

ELSE 0
END comision

from angajati;

-- 2. sa se aplice comisionul la valoarea comenzilor din exemplul de mai sus


select nume, id_functie,
(CASE
WHEN UPPER(a.id_functie) = 'AD_PRES'
THEN 0.3
WHEN UPPER(a.id_functie) = 'SA_REP'
THEN 0.1
WHEN UPPER(a.id_functie) = 'SA_MAN'
THEN 0.2
ELSE 0
END) * SUM( r.cantitate * r.pret) valoare_comision

from angajati a, comenzi c, rand_comenzi r


where a.id_angajat = c.id_angajat
and
c.id_comanda = r.id_comanda
GROUP BY a.nume, a.id_functie;

--3. cu decode
select nume, id_functie,
decode(upper(id_functie), 'AD_PRES', 0.3, 'SA_MAN', 0.2, 'SA_REP', 0.1, 0) comision
from angajati;

--4. sa se faca o clasificare a angajatilor in functie de salariu si comision


-- cei care au sal > 10000 intra in categoria 'venituri_mari'
-- cei care au comision nenul au 'venituri medii'
-- restul angajatilor au 'venituri_mici'

select nume, salariul, id_functie, comision,


case
when salariul > 10000 then 'venituri_mari'
when comision IS NOT NULL then 'venituri_medii'
else 'venituri_mici'
end clasificare
from angajati;

--5. acelasi exercitiu numai ca sa se afiseze si nivelul ierarhic;


select nume, salariul, id_functie, comision,LEVEL,
case
when salariul > 10000 then 'venituri_mari'
when comision IS NOT NULL then 'venituri_medii'
else 'venituri_mici'
end clasificare
from angajati
CONNECT BY PRIOR id_angajat= id_manager
START WITH id_angajat = 100; --de jos in sus

--6. sa se adiseze departamentele in functie de nr de angajati din acestea si o


clasificare in cazurile ormatoare:
-- 1. nr de angajati din dep se afla intre 25-50 -> 'volum_mare'
-- 2. ----------------------------- 10-24 -> 'volum_mediu'
-- 3. ----------------------------- 4-9 -> 'volum_mic'
-- in caz contrar sa se afiseze 0

select id_departament, COUNT(id_angajat) nr_angajati,


case
when COUNT(id_angajat) BETWEEN 25 AND 50 then 'volum_mare'
when COUNT(id_angajat) BETWEEN 10 AND 24 then 'volum_mediu'
when COUNT(id_angajat) BETWEEN 4 AND 9 then 'volum_mic'
else '0'
end volum_angajati
from angajati
group by id_departament
order by 'volum_mare';

--7. Sa se acorde un spor de vechime in functie de vechimea fiecarui angajat si sa


se afiseze si vechimea acestuia
-- vechimea>25 -> spor 1.1
-- vechimea 1- 24 -> spor 1.05
-- daca nu atunci spor 1.01

select nume, data_angajare, salariul, (EXTRACT(YEAR from sysdate) - EXTRACT(YEAR


from data_angajare)) vechime,
case
when (EXTRACT(YEAR from sysdate) - EXTRACT(YEAR from data_angajare)) > 25
then salariul * 1.1
when (EXTRACT(YEAR from sysdate) - EXTRACT(YEAR from data_angajare)) between 10
and 24
then salariul * 1.05
else salariul * 1.01
end spor_vechime
from angajati;

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