Sunteți pe pagina 1din 7

EXERCITIU SEMINAR 9

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
• daca zona firmei este Orientul mijlociu si Africa atunci CT=18% din valoarea totala a comenzilor

SELECT r.denumire_regiune, p.denumire_produs,


(CASE
WHEN UPPER(r.denumire_regiune)='EUROPE' THEN 0.1
WHEN UPPER(r.denumire_regiune)='AMERICAS' THEN 0.15
WHEN UPPER(r.denumire_regiune)='ASIA' THEN 0.12
WHEN UPPER(r.denumire_regiune)='MIDDLE EAST AND AFRICA' THEN 0.18
ELSE 0
END) * SUM(rc.cantitate * rc.pret) AS discount
FROM REGIUNI r, PRODUSE p, RAND_COMENZI rc
WHERE p.id_produs = rc.id_produs
GROUP BY r.denumire_regiune, p.denumire_produs;

EXERCITII SEMINAR 10
SET 1

1) Sa se afiseze nr_comanda, data, valoarea comenzii, pentru comenzile incheiate in 1999 cu


valoarea totala (sum(cantitate*pret)) mai mare de 2000, în ordinea datei.

SELECT r.id_comanda, c.data, sum(r.pret*r.cantitate)


FROM RAND_COMENZI r, COMENZI c
WHERE r.id_comanda = c.id_comanda
AND c.data between to_date('01-01-1999', 'DD-MM-YYYY') and to_date('31-12-1999',
'DD-MM-YYYY')
GROUP BY r.id_comanda, r.pret*r.cantitate, c.data
HAVING sum(r.pret*r.cantitate)>2000;

2) Sa se afiseze numarul comenzii, data, valoarea totala comandata (sum(cantitate*pret)) si sa se


calculeze cheltuielile de transport pentru livrarea acestora astfel:
- pentru comenzi cu valoarea de pana la 1000 cheltuielile de transport sa fie de 100
- pentru comenzi cu valoarea 1000 si 2000 cheltuielile de transport sa fie de 200
- pentru comenzi cu valoarea mai mare de 2000 cheltuielile de transport sa fie de 300
SELECT
r.id_comanda as numar_comanda,
c.data,
SUM(r.cantitate * r.pret) as valoare_totala,
(CASE
WHEN SUM(r.cantitate * r.pret) < 1000 THEN 100
WHEN SUM(r.cantitate * r.pret) BETWEEN 1000 AND 2000 THEN 200
WHEN SUM(r.cantitate * r.pret) > 2000 THEN 300
ELSE 0
END) as cheltuieli_transport
FROM
RAND_COMENZI r, COMENZI c
WHERE
r.id_comanda = c.id_comanda
GROUP BY
r.id_comanda, c.data;

3) Sa se afiseze id_client, id_produs si cantitatea totala din fiecare produs, vanduta unui client.

SELECT c.id_client, p.id_produs, rc.cantitate


FROM PRODUSE p,
RAND_COMENZI rc,
CLIENTI c,
COMENZI cz
WHERE cz.id_client = c.id_client
AND rc.id_comanda = cz.id_comanda
AND p.id_produs = rc.id_produs;

4) Sa se afiseze numele, denumirea departamentului unde lucreaza si nivelul ierarhic pentru toti
angajatii care au subordonati si care au aceeasi functie ca angajatul Russell.

SELECT a.nume, d.denumire_departament, LEVEL


FROM ANGAJATI a,
DEPARTAMENTE d
WHERE d.id_departament = a.id_departament
AND id_functie = (SELECT id_functie FROM angajati WHERE nume = 'Russell')
START WITH a.id_angajat = 100
CONNECT BY PRIOR a.id_angajat = a.id_manager
ORDER BY LEVEL;

5) Sa se afiseze numele angajatilor care nu au subalterni si care au aceeasi functie ca angajatul


Rogers, nivelul ierarhic si denumirea departamentului unde acestia lucreaza.
SELECT LEVEL, CONNECT_BY_ISLEAF, a.id_angajat, a.nume,
d.denumire_departament
FROM ANGAJATI a,
DEPARTAMENTE d
WHERE d.id_departament = a.id_departament
AND a.id_functie = (SELECT a2.id_functie FROM ANGAJATI a2 WHERE a2.nume =
'Rogers')
CONNECT BY PRIOR a.id_angajat = a.id_manager
START WITH a.id_manager is null;

6) Sa se afiseze departamentele (id_departament si denumire_departament) care au numai


angajati cu salariul < 10000.

SELECT DISTINCT d.id_departament, d.denumire_departament


FROM DEPARTAMENTE d,
ANGAJATI a
WHERE d.id_departament = a.id_departament
AND d.id_departament NOT IN (SELECT a.id_departament FROM ANGAJATI a
WHERE a.salariul >= 10000);

SET 2

1) Sa se afiseze numele, salariul, data angajarii, denumirea functiei pentru angajatii care au functia
Programmer sau Accountant si au fost angajati intre 1995 si 1998.
SELECT a.nume, a.salariul, a.data_angajare, f.denumire_functie

FROM
ANGAJATI a,
FUNCTII f
WHERE a.id_functie = f.id_functie
and f.denumire_functie IN ('Programmer', 'Accountant')
and a.data_angajare between to_date('01-01-1995', 'DD-MM-YYYY') and to_date('31-12-
1998', 'DD-MM-YYYY');

2) Sa se realizeze o operatie de modificare a pretului la produse astfel incat noul pret sa se


mareasca cu 15% pentru toate produsele care au pretul mai mic decat pretul mediu al
produsului care contine denumirea cuvantunl sound (se actualizeaza tabela rand_comenzi). La
final sa se anuleze operatia de actualizare.

UPDATE RAND_COMENZI rc
SET rc.pret = rc.pret + 0.15 * rc.pret
WHERE rc.pret < (SELECT avg(rc2.pret)
FROM RAND_COMENZI rc2,
PRODUSE p
WHERE rc2.id_produs = p.id_produs
AND initcap(p.denumire_produs) like '%sound%');

ROLLBACK;
3) Sa se afiseze numele, data angajarii, functia actuala si functiile detinute de angajatii din
departamentele 50 si 80 in perioada 1995-1999.

SELECT a.nume,
a.data_angajare,
f_actual.denumire_functie AS functie_actuala,
f_anterior.denumire_functie AS functie_din_trecut
FROM ANGAJATI a
JOIN
FUNCTII f_actual ON a.id_functie = f_actual.id_functie
LEFT JOIN
ISTORIC_FUNCTII if_anterior ON a.id_angajat = if_anterior.id_angajat
LEFT JOIN
FUNCTII f_anterior ON if_anterior.id_functie = f_anterior.id_functie
WHERE a.id_departament IN (50, 80)
AND (if_anterior.data_inceput BETWEEN TO_DATE('01-01-1995', 'DD-MM-YYYY')
AND TO_DATE('31-12-1999', 'DD-MM-YYYY') OR
if_anterior.data_inceput IS NULL);

4) Sa se realizeze o operatie de modificare a pretului la produse astfel incat noul pret sa se


micsoreze cu 5% pentru toate produsele care au cantitatea comandata mai mica decat cantitatea
medie comandata din produsul cu denumirea care conţine CPU. (se actualizeaza tabela
rand_comenzi). La final sa se anuleze operatia de actualizare.

UPDATE RAND_COMENZI
SET pret = pret - 0.05 * pret
WHERE cantitate < (select avg(rc.cantitate)
from RAND_COMENZI rc,
PRODUSE p
where rc.id_produs = p.id_produs
and upper(p.denumire_produs) like '%CPU%');
ROLLBACK;

5) Sa se afiseze denumirea produselor si valoarea totala comandata a acestora (sum(cantitate*pret)


cuprinsa intre 1500 si 4000.

SELECT p.denumire_produs, sum(rc.cantitate * rc.pret) as valoare_totala


FROM RAND_COMENZI rc,
PRODUSE p
WHERE rc.id_produs = p.id_produs
GROUP BY p.denumire_produs
HAVING sum(rc.cantitate * rc.pret) between 1500 and 4000;

6) Sa se afiseze numarul comenzii, data, valoarea totala (sum(cantitate*pret)), numarul de produse


pentru comenzile online incheiate in perioada 1999-2000 si contin cel putin 2 produse.

SELECT c.id_comanda, c.data, sum(rc.cantitate * rc.pret) as valoare_totala,


count(c.id_comanda) as numar_produse
FROM RAND_COMENZI rc,
COMENZI c
WHERE rc.id_comanda = c.id_comanda
AND c.data between to_date('01-01-1999', 'DD-MM-YYYY') and to_date('31-12-2000',
'DD-MM-YYYY')
GROUP BY c.id_comanda, c.data
HAVING count(distinct rc.id_produs) >= 2;

SET 3

1) Sa se afiseze numarul comenzii, denumirea produsului, pretul, cantitatea si valoarea pentru


produsele care contin in denumire cuvantul Monitor.

SELECT rc.id_comanda, p.denumire_produs, rc.pret, rc.cantitate, sum(rc.pret *


rc.cantitate) as valoare_comenzi
FROM RAND_COMENZI rc,
PRODUSE p
WHERE rc.id_produs = p.id_produs
AND upper(p.denumire_produs) like '%MONITOR%'
GROUP BY rc.id_comanda, p.denumire_produs, rc.pret, rc.cantitate;

2) Să se afişeze numele, id-ul departamentului si numărul de comenzi incheiate de angajatii din


departamentul 80 in luna noiembrie.

SELECT a.nume, a.id_departament, count(c.id_comanda) as numar_comanzi


FROM ANGAJATI a,
COMENZI c
WHERE a.id_angajat = c.id_angajat
AND c.data BETWEEN TO_TIMESTAMP('2018-10-01 00:00:00', 'YYYY-MM-DD
HH24:MI:SS') AND TO_TIMESTAMP('2018-10-30 23:59:59', 'YYYY-MM-DD
HH24:MI:SS')
AND a.id_departament = 80
GROUP BY a.nume, a.id_departament;
3) Sa se realizeze actualizarea pretului la produse astfel incat noul pret sa se micsoreze cu 10%
pentru toate produsele care au pretul mai mare decat al pretul mediu al produsului cu id-ul
‘3155’ (se actualizeaza tabela rand_comenzi). La final sa se anuleze actualizarea.

UPDATE RAND_COMENZI rc
SET rc.pret = rc.pret - 0.10 * rc.pret
WHERE rc.pret > (select avg(rc2.pret)
from RAND_COMENZI rc2
where rc2.id_produs = 3155);
ROLLBACK;

4) Sa se afiseze numele, denumirea functiei, numarul de comenzi pentru angajatii care au incheiat
cel putin 2 comenzi.

SELECT a.nume, f.denumire_functie, count(c.id_comanda)


FROM ANGAJATI a,
COMENZI c,
FUNCTII f
WHERE a.id_angajat = c.id_angajat
AND a.id_functie = f.id_functie
AND c.id_angajat >= 2
GROUP BY a.nume, f.denumire_functie
HAVING count(c.id_comanda) >= 2;

5) Sa se realizeze actualizarea pretului la produse astfel incat noul pret sa se mareasca cu 5% pentru
toate produsele care au valoarea comandata (cantitate*pret) mai mare sau egala cu 1000 (se
actualizeaza tabela rand_comenzi). La final sa se anuleze operatia de actualizare.

UPDATE RAND_COMENZI rc
SET rc.pret = pret + 0.05*pret
WHERE rc.cantitate*rc.pret >= 1000;
ROLLBACK;

6) Sa se afiseze numele, numarul de comenzi, salariul si bonusul fiecarui angajat. Bonusul se va


calcula in functie de numarul de comenzi incheiate, astfel:
-- intre 1-2 comenzi – 5% din salariul lunar;
-- intre 3-5 comenzi – 7% din salariul lunar;
-- mai mult de 5 comenzi – 10% din salariul lunar.

SELECT a.nume,
count(c.id_comanda) as numar_comenzi,
a.salariul,
(CASE
WHEN count(c.id_comanda) between 1 and 2 THEN 0.05
WHEN count(c.id_comanda) between 3 and 5 THEN 0.07
WHEN count(c.id_comanda) > 5 THEN 0.10
ELSE 0
END) * a.salariul as bonus_angajat
FROM ANGAJATI a,
COMENZI c
WHERE a.id_angajat = c.id_angajat
GROUP BY a.nume, a.salariul;

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