Sunteți pe pagina 1din 6

BAZE DE DATE – SEMINAR 9

_____________________________________________________________________

Jonctiuni externe
Functia DECODE si expresia CASE

1) Jonctiuni externe
Permit regasirea inregistrarilor comune si in plus fata de jonctiunea de egalitate si a
celor care se regasesc doar intr-o singura tabela.
Jonctiunea se poate realiza precizand in dreptul legaturii dintre tabele a semnului (+),
de exemplu conditia: tabela_A.cheie_primara=tabela_B.cheie_externa(+) va returna
inregistrarile comune si a celor care apartin doar tabelei A.

Exemple:

1. Sa se afiseze produsele comandate impreuna cu cele care nu se regasesc pe


nici o comanda.

SELECT p.id_produs, p.denumire_produs, rc.cantitate, rc.pret


FROM produse p, rand_comenzi rc
WHERE p.id_produs = rc.id_produs (+);

...

1
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

2. Sa se afiseze toti angajatii care au incheiat comenzi, precum si cei care nu au


incheiat comenzi.

SELECT a.id_angajat, a.nume, c.nr_comanda, c. data


FROM angajati a, comenzi c
WHERE a.id_angajat= c.id_angajat (+);

...

2) Realizarea interogarilor pe baza unor conditii

Functia DECODE – este utilizata pentru calcularea si returnarea unor expresii in


functie de anumite conditii de egalitate

Sintaxa este:

DECODE (VARIABILA, conditie1, expresie1, conditie2, expresie2, ….., conditie_n,


expresie_n, valoare n+1 implicita)

Expresia CASE – este utilizata pentru calcularea si returnarea unor expresii in functie
de anumite conditii diverse in care se pot utiliza operatori de comparatie, nu
numai operatorul de egalitate.

Sintaxa este:

2
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

1) CASE [VARIABILA]
WHEN conditie1 THEN expresie1
WHEN conditie2 THEN expresie2
…………………………………….
WHEN conditie_n THEN expresie_n
ELSE valoare n+1 implicita
END

Sau daca se utilizeaza comparatii pe variabile sau coloane diferite se poate apela la
varianta urmatoare:

2) CASE
WHEN VARIABILA1 conditie1 THEN expresie1
WHEN VARIABILA2 conditie2 THEN expresie2
…………………………………….
WHEN VARIABILA conditie_n THEN expresie_n
ELSE valoare n+1 implicita
END

Exemple:

1. Sa se identifice ierarhia angajatilor responsabili cu vanzarile.

SELECT id_angajat, nume, id_functie, LEVEL FROM angajati


CONNECT BY id_angajat = PRIOR id_manager
START WITH id_functie = 'SA_REP';

2. Sa se calculeze comisionul agentilor in functie de pozitia (functia) ocupata:


 0.1% din valoarea comenzilor daca functia este SA_REP
 0.2% din valoarea comenzilor daca functia este SA_MAN

3
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

 0.3% din valoarea comenzilor daca functia este AD_PRES


Pentru celelalte functii comisionul va fi 0.
SELECT nume, id_functie,
CASE WHEN UPPER(id_functie) = 'AD_PRES' THEN 0.3
WHEN UPPER(id_functie) = 'SA_MAN' THEN 0.2
WHEN UPPER(id_functie) = 'SA_REP' THEN 0.1
ELSE 0 END comision
FROM angajati;

...

Daca se aplica acest comision la valoarea comenzilor (SUM(cantitate*pret))


interogarea devine:

SELECT a.nume, a.id_functie,


(CASE WHEN UPPER(a.id_functie) = 'AD_PRES' THEN 0.3
WHEN UPPER(a.id_functie)= 'SA_MAN' THEN 0.2
WHEN UPPER(a.id_functie)= 'SA_REP' THEN 0.1
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.nr_comanda=r.nr_comanda
GROUP BY a.nume, a.id_functie;

4
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

Cu functia DECODE cerinta se poate rezolva astfel:


SELECT nume, id_functie,
DECODE(UPPER(id_functie) , 'AD_PRES' , 0.3,'SA_MAN', 0.2, 'SA_REP' , 0.1, 0)
comision
FROM angajati;

2) Sa se calculeze diferit discountul (DC) pentru clienti astfel:


 daca clientul a incheiat 1 comanda atunci DC= 10%;
 daca a incheiat 2 comenzi atunci DC =15%;
 daca a incheiat mai mult de 3 comenzi atunci DC =20%.

SELECT cl.nume_client, count(co.nr_comanda) numar_comenzi,


CASE WHEN COUNT(co.nr_comanda) = 1 THEN 0.1
WHEN COUNT(co.nr_comanda) = 2 THEN 0.15
WHEN COUNT(co.nr_comanda)>=3 THEN 0.2
ELSE 0 END discount
FROM clienti cl, comenzi co
WHERE cl.id_client=co.id_client
GROUP BY cl.nume_client;

Case imbricat
select nume_client, limita_credit, starea_civila,
case
when starea_civila ='married' then
case when limita_credit <400
then 'married with low budget'
when limita_credit between 400 and 1000
then 'married with medium budget'
else 'married with high budget' end
else 'single' end clasificare
from clienti;

Tema individuala: Sa se calculeze discountul pentru produse astfel:


 daca regiunea este Europe atunci CT= 10% din valoarea totala a comenzilor
 daca zona firmei este America atunci CT=15% din valoarea totala a
comenzilor
 daca zona firmei este Asia atunci CT=12% din valoarea totala a comenzilor

5
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

 daca zona firmei este Orientul mijlociu si Africa atunci CT=18% din valoarea
totala a comenzilor

SELECT denumire_produs, categorie,


CASE WHEN categorie like 'hardware%' THEN 0.1
WHEN categorie LIKE 'software%' THEN 0.11
ELSE 0.01 END discount
FROM produse;

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