Lab 04
Lab 04
END;
/
3. Instructiuni SELECT noi; filtrari utilizand mai multe valori numerice.
- filtrare pe camp numeric VALORI DISCRETE – facturile clientilor 10, 30 SAU 50
SELECT nrfact, clienti_DEF.codcl, dencl, valoare, datafact
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+) AND (clienti_DEF.codcl=10 OR clienti_DEF.codcl=30 OR
clienti_DEF.codcl=50)
ORDER BY 2,4;
SELECT nrfact, clienti_DEF.codcl, dencl, valoare, datafact
FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
WHERE clienti_DEF.codcl=10 OR clienti_DEF.codcl=30 OR clienti_DEF.codcl=50
ORDER BY 2,4;
Pentru a reduce conditia de filtrare, se poate utiliza IN
SELECT nrfact, clienti_DEF.codcl, dencl, valoare, datafact
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+) AND clienti_DEF.codcl IN (10,30,50)
ORDER BY 2,4;
UPDATE facturi_DEF
SET cota_tva=
CASE
WHEN nrfact IN (102, 105, 203, 206) THEN 0.05
WHEN nrfact IN (104, 107, 207, 210) THEN 0.10
ELSE 0.19
END;
SELECT * From facturi_DEF;
SELECT nrfact, clienti_DEF.codcl, dencl, valoare, cota_tva, valoare*(1+cota_tva)
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+)
ORDER BY 2,4;
SELECT nrfact, clienti_DEF.codcl, dencl, NVL(valoare,0) AS valnoua, NVL(cota_tva,0) AS cota_noua,
valnoua*(1+cota_noua) AS Valoare_cu_TVA
FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 2,4;
SELECT nrfact, clienti_DEF.codcl, dencl, NVL(valoare,0) AS valnoua, NVL(cota_tva,0) AS cota_noua,
valnoua*(1+NVL(cota_tva,0)) AS Valoare_cu_TVA
FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 2,4;
SELECT nrfact, clienti_DEF.codcl, dencl, NVL(valoare,0) AS valnoua, NVL(cota_tva,0) AS cota_noua,
NVL(valoare,0)*(1+NVL(cota_tva,0)) AS Valoare_cu_TVA
FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 2,4;
OBS: seminarul trecut am vazut ca noul nume al unui camp calculat nu poate fi folosit in conditiile de filtrare.
Conform exemplelor de mai sus, noul nume nu poate fi utilizat nici in calculul unui alt camp.
5. Grupari pe camp calculat
- totalul general – NU contine nicio grupare, deci NU are nevoie de optiunea GROUP BY
SELECT SUM(valoare*(1+cota_tva)) AS Total_brut_general
FROM facturi_DEF;
- subtotaluri – presupun obtinerea de valori partiale, pe subgrupuri obtinute prin gruparea in functie de
valorile unuia sau mai multor campuri; de exemplu subtotaluri lunare; in aceasta situatie se poate pune in
discutie si un anumit criteriu de ordonare
OBS: daca se doreste ordonare descrescatore la fiecare criteriu, optiunea DESC trebuie precizata la fiecare camp.
- Combinatia grupare – filtrare pe camp calculat– clientii cu total facturi peste 10000
OBSERVATII
- Filtrarea din clauza WHERE actioneaza inaintea gruparii datelor iar filtrarea din clauza HAVING actioneaza
dupa ce se fac gruparile;
- Se pot utiliza la filtrarea datelor inaintea gruparii, adica in WHERE, atat campuri care apar in SELECT, cat si
campuri care nu apar in SELECT intrucat, din cauza eterogenitatii valorilor lor, ar face ca gruparea sa nu se
realizeze. In exemplul de mai sus se observa ca datafact nu apare intre campurile SELECT, ea fiind utilizata
doar ca si criteriu de filtrare.
6. Grupari, calcule, subinterogari
SELECT MAX(valoare) AS Maxim_facturi, ROUND(AVG(valoare),2) AS Medie_facturi
FROM facturi_DEF;
OBS: NU avem GROUP BY intrucat sunt doar valori calculate pentru intreaga coloana de valori.
- Utilizarea lui MAX
Sa se determine factura cu valoarea cea mai mare si sa se afiseze clientul / clientii care are / au facturi cu
aceasta valoare.
OBS: maximul general este maximul maximelor fiecarui client. Maximul calculat mai sus se va utiliza in
subinterogare
- intrucat e o dubla grupare, campul localit trebuie sa dispara din SELECT dar trebuie sa ramana in GROUP
BY intrucat gruparea dupa localitate este cea care da totalurile partiale.
Obs: utilizarea tabelei clienti_DEF este necesara doar pentru ca se face gruparea dupa campul localit
- utilizarea celei de-a doua interogari ca subinterogare in prima interogare; intrucat filtrarea se face pe
campul SUM, conditia de filtrare se pune in clauza HAVING
OBS: subinterogarea de mai sus poate fi valorificata mai bine daca se doreste afisarea localitatilor care au un volum
de vanzari mai mare de 50% din cel mai mare volum de vanzari, ordonate descrescator in functie de aceste valori.
Sa se determine si sa se afiseze lunile care au totalul facturilor mai mare decat media acestor totaluri.
Obs: intrucat media s-a utilizat doar pentru comparare, nu fost necesara rotunjirea acesteia la doua zecimale.
TEMA:
- ADAUGAREA IN TABELA incasari_DEF A UNUI CAMP NUMIT TRIMESTRU AL CARUI CONTINUT SA FIE
COMPLETAT AUTOMAT CU CUVINTELE primul, al doilea, al treilea, al patrulea IN FUNCTIE DE LUNA DATEI
INCASARII
- 5 INSTRUCTIUNI SELECT CAT MAI INEDITE, FOLOSIND GRUPARI, DUBLE GRUPARI, FILTRARI PENTRU
DIVERSE CAMPURI EXISTENTE SAU CALCULATE, DIN TOATE CELE 3 TABELE.
Astept raspunsurile intr-un document WORD atat instructiunile cat si capturi ale executiei acestora.
Documentul se va incarca pe platforma, in sectiunea dedicata.
Termen: 03.04.2023