Sunteți pe pagina 1din 4

BAZE DE DATE – SEMINAR 9

_____________________________________________________________________

JONCȚIUNI EXTERNE
Funcția DECODE și expresia CASE

I. Joncțiuni externe
Permit regăsirea înregistrărilor comune și în plus față de joncțiunea de egalitate și a
celor care se regăsesc doar într-o singură tabelă.
Joncțiunea se poate realiza precizând în dreptul legăturii dintre tabele a semnului (+),
de exemplu condiția: tabela_A.cheie_primara=tabela_B.cheie_externa(+) va returna
înregistrările comune și a celor care aparțin doar tabelei A.

Exemple:
1. Să se afișeze produsele comandate împreună cu cele care nu se regăsesc 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 (+);

2. Să se afișeze toți angajații care au încheiat comenzi, precum și cei care nu au


încheiat comenzi.
SELECT a.id_angajat, a.nume, c.id_comanda, c. data
FROM angajati a, comenzi c
WHERE a.id_angajat= c.id_angajat (+);

Pagina 1 din 4
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

II. Realizarea interogărilor pe baza unor condiții

A. Funcția DECODE – este utilizata pentru calcularea și returnarea unor expresii în


funcție de anumite condiții de egalitate
Sintaxa este:
DECODE (VARIABILA, conditie1, expresie1, conditie2, expresie2, …..,
conditie_n, expresie_n, valoare n+1 implicita)

B. Expresia CASE – este utilizată pentru calcularea și returnarea unor expresii în


funcție de anumite condiții diverse în care se pot utiliza operatori de
comparație, nu numai operatorul de egalitate.
Sintaxa este:
1) CASE [VARIABILA]
WHEN conditie1 THEN expresie1
WHEN conditie2 THEN expresie2
…………………………………….
WHEN conditie_n THEN expresie_n
ELSE valoare n+1 implicita
END

Sau dacă se utilizează comparații pe variabile sau coloane diferite se poate apela la
varianta următoare:
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. Să se identifice ierarhia angajaților responsabili cu vânzările.
SELECT id_angajat, nume, id_functie, LEVEL FROM angajati
CONNECT BY id_angajat = PRIOR id_manager
START WITH id_functie = 'SA_REP';

Pagina 2 din 4
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

2. Să se calculeze comisionul agenților în funcție de poziția (funcția) ocupată:


• 0.1% din valoarea comenzilor dacă funcția este SA_REP
• 0.2% din valoarea comenzilor dacă funcția este SA_MAN
• 0.3% din valoarea comenzilor dacă funcția este AD_PRES
Pentru celelalte funcții 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;

Dacă se aplică 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.id_comanda=r.id_comanda
GROUP BY a.nume, a.id_functie;

Pagina 3 din 4
BAZE DE DATE – SEMINAR 9
_____________________________________________________________________

Cu funcția DECODE cerința 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;

3. Să se calculeze diferit discountul (DC) pentru clienți astfel:


• dacă clientul a încheiat 1 comandă atunci DC= 10%;
• dacă a încheiat 2 comenzi atunci DC =15%;
• dacă a încheiat mai mult de 3 comenzi atunci DC =20%.

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


CASE WHEN COUNT(co.id_comanda) = 1 THEN 0.1
WHEN COUNT(co.id_comanda) = 2 THEN 0.15
WHEN COUNT(co.id_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;

Temă individuală: Să se calculeze discountul pentru produse astfel:


• dacă regiunea este Europe atunci CT= 10% din valoarea totală a comenzilor;
• dacă zona firmei este America atunci CT=15% din valoarea totală a comenzilor;
• dacă zona firmei este Asia atunci CT=12% din valoarea totală a comenzilor;
• dacă zona firmei este Orientul mijlociu și Africa atunci CT=18% din valoarea
totală a comenzilor.

Răspuns

Pagina 4 din 4

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