Upload
elena-cimpoca
View
225
Download
0
Embed Size (px)
Citation preview
8/17/2019 Recapitulare SQL ase
1/37
Interogarea
bazelor
de date
utiliz
ând
limbajul SQL
Lect. Univ. Dr. Cătălin Tudor
8/17/2019 Recapitulare SQL ase
2/37
Vocabularul SQL:
Instruc ţiuni – permit execuţia anumitor acţiuni(CREATE, ALTER, SELECT, UPDATE, DELETE , etc.)
Clauze – specifică argumentele unei instrucțiuni
(FROM, WHERE, ORDER BY , etc.)
Funcții – efectuează prelucrări asupra datelor (care
devin argumente sau parametrii) în scopul afișării unor
rezultate specifice (SUM, ROUND, UCASE, LEFT, DATE,
IIF, etc.).Operatori – acționează asupra datelor (care devin
operanzi), permițând definirea unor expresii, calcule,
etc. (aritmetici, de comparare, logici, de concatenare,
etc.).
8/17/2019 Recapitulare SQL ase
3/37
instrucţiuni de definire a datelor (permit descrierea
structurii bazei de date):
CREATE, ALTER, DROP
instrucţiuni de selecţie a datelor (permit consultarea
bazei de date):
SELECT
instrucțiuni de manipulare a datelor (permit
adăugarea, modificarea și ștergerea înregistrărilor):
INSERT, UPDATE, DELETE
instrucţiuni privind controlul accesului la date(permit acordarea sau revocarea drepturilor de
acces pe utilizatori):
GRANT, REVOKE
8/17/2019 Recapitulare SQL ase
4/37
Formatul general al frazei SQL de selecție:
SELECT [ALL / DISTINCT / DISTINCTROW / TOP N]
FROM [WHERE ]
[GROUP BY ]
[HAVING ]
[ORDER BY [ASC|DESC]];
unde:• Lista de selecţie precizează atributele sau expresiile ale căror valori
vor fi returnate;
• listă-tabele specifică tabelele din care se vor extrage datele înlănţuite
prin condiţii de compunere;
• WHERE permite exprimarea criteriului de selecţie înaintea efectuăriioricărei grupări în vederea sintetizării informaţiei;
• GROUP BY folosit pentru a partiţiona o tabelă în grupuri după câmpul
specificat;
• HAVING specifică criterii de selecţie pentru date agregate;
• ORDER BY precizează atributul/atributele după care se va faceordonarea.
8/17/2019 Recapitulare SQL ase
5/37
Precizarea domeniului de selecțiePredicatele ALL, DISTINCT
și TOP:
ALL – permite selectarea tuturor înregistrărilor, afişând
valorile câmpurilor specificate din tabelul selectat;
DISTINCT – permite excluderea valorilor dublură pentru
fiecare câmp selectat (doar înregistrări unice la nivelul
atributelor vizibile);
TOP ”n” – permite afișarea primelor ”n” înregistrări din
lista rezultatului interogării, ordonată după valorile unor
câmpuri.
8/17/2019 Recapitulare SQL ase
6/37
Instrucțiuni de selecție
-
ExempleExemple de utilizare a predicatelor din clauza SELECT:
1. Să se afișeze toți angajații cu numele Ionescu:
SELECT ALL * FROM Angajati WHERE Nume=“Ionescu”
sau
SELECT * FROM Angajati WHERE Nume=“Ionescu”
Rezultat:
Marca angajat Nume Prenume Salariu
M120 Ionescu Paul 1230
M432 Popescu Ion 1760
M431 Ionescu Marcel 3300
Marca angajat Nume Prenume Salariu
M120 Ionescu Paul 1230
M431 Ionescu Marcel 3300
8/17/2019 Recapitulare SQL ase
7/37
Instrucțiuni de selecție – rezultate unice
Să se afișeze, în mod unic, doar numele angajaților:
Utilizare DISTINCT:SELECT DISTINCT Nume FROM Angajați
Marca angajat Nume Prenume Salariu
M120 Ionescu Paul 1230M432 Popescu Ion 1760
M431 Ionescu Marcel 3300
Nume
Ionescu
Popescu
Valori unice ale câmpului
8/17/2019 Recapitulare SQL ase
8/37
Instrucțiuni de selecție
Utilitatea predicatului TOP n/procent:
Afișați numele și prenumele primilor 2 angajați cu salariile celemai mari:
SELECT TOP 2 Nume, Prenume
FROM Angajati
ORDER BY Salariu DESC
Nume Penume
Ionescu Marcel
Popescu Ion
Marca angajat Nume Prenume Salariu
M120 Ionescu Paul 1230
M432 Popescu Ion 1760
M431 Ionescu Marcel 3300
A i i j SQL I i ii
8/17/2019 Recapitulare SQL ase
9/37
Asocierea ta e e or n im aju SQL I – con iţii ecompunere
Să se afișeze toate denumirile de produse facturate după data de 12.05.2008.
Soluția 1: Compunerea condiționată prin clauza WHERE:SELECT DenumireProdus
FROM Produs, ProduseFacturate, Facturi
WHERE Facturi.IDFactura=ProduseFacturate.IDFacturaand ProduseFacturate.CodProdus=Produs.CodProdus
and DataFactura>#12.05.2008#
Condiții de compunere
Enumerare
tabele
8/17/2019 Recapitulare SQL ase
10/37
Asocierea tabelelor în limbajul SQL (II) - Compunerea internă
Să se afișeze toate denumirile de produse facturate după data de 12.05.2008.
Soluția 2: Combinarea tabelelor în clauza FROM:
Select DenumireProdus
FROM (Facturi INNER JOIN ProduseFacturate
ON Facturi.IdFactura=ProduseFacturate.IdFactura)INNER JOIN Produs ON Produs.CodProdus=ProduseFacturate.CodProdus
WHERE DataFactura>#12.05.2008#
Compunere internă
Asociere tabele
8/17/2019 Recapitulare SQL ase
11/37
Asocierea tabelelor în limbajul SQL (III) - Compunerea externă
Să se afișeze toate denumirile denumirile furnizorilor care nu au emis nici o factură.
Soluția 2: Combinarea tabelelor în clauza FROM:
Select DenumireFz
FROM (Furnizori LEFT JOIN Facturi
ON Furnizori.CodFiscal=Facturi.CodFiscal)Where Facturi.IdFactura is NULL
Condiţie de joncţiune
Asociere tabele
Eliminare înregistrări cu valori nule
8/17/2019 Recapitulare SQL ase
12/37
Câmpuri calculate în limbajul SQL
Marca angajat Nume Prenume Salariu
M120 Ionescu Paul 1230
M432 Popescu Ion 1760
M431 Ionescu Marcel 3300
Să se afișeze cât reprezintă prima de 10% din salariu pentru
fiecare salariat
SELECT Nume, (Salariu * 10/100) AS Prima FROM Angajati
Nume Prima
Ionescu 123
Popescu 176
Ionescu 330
ă d d f d
8/17/2019 Recapitulare SQL ase
13/37
Grupări de date şi funcţii de grup
Să se afișeze câte facturi au fost emise în luna februarie , anul 2008.
1. Funcții de agregare aplicate tuturor înregistrărilor, fără a fi
necesară gruparea:
SELECT Count(*) AS [Numar de facturi]
FROM Facturi
WHERE Month([DataFactura])=2 AND Year([DataFactura])=2008
2. Funcții de agregare aplicate pe grupuri de înregistrări:
Să se afișeze pentru fiecare denumire de furnizor câte facturi au fost emise de
acesta.
SELECT DenumireFz, Count(*) AS [Numar de facturi]
FROM Facturi INNER JOIN Furnizori
ON Furnizori.CodFiscal=Facturi.CodFiscal
GROUP BY DenumireFz
ă i d d i f ii d
8/17/2019 Recapitulare SQL ase
14/37
Grupări de date şi funcţii de grup
Să se afișeze câte facturi au fost emise în luna februarie , anul 2008 ,
de fiecare furnizor.
3. Funcții de agregare aplicate grupurilor, cu criterii de filtrare:
SELECT Count(*) AS [Numar de facturi]
FROM Facturi INNER JOIN Furnizori
ON Furnizori.CodFiscal=Facturi.CodFiscal
WHERE Month([DataFactura])=2 AND Year([DataFactura])=2008
GROUP BY DenumireFz
4. Funcții de agregare aplicate pe grupurilor, cu filtrare pe expresii:Să se afișeze care sunt furnizorii care au emis mai mult de 3 facturi în luna
februarie a anului 2008.
SELECT DenumireFzFROM Facturi INNER JOIN Furnizori
ON Furnizori.CodFiscal=Facturi.CodFiscal
WHERE Month([DataFactura])=2 AND Year([DataFactura])=2008
GROUP BY DenumireFzHAVING Count(*)>3
8/17/2019 Recapitulare SQL ase
15/37
Utilizarea sub-interogărilor în limbajul SQL
Sub-interogare=structură SQL al cărei rezultat ajută în
rezolvarea unei alte interogări (interogări imbricate)Predicate utilizate pentru sub-interogări:
ANY – compară partea stângă a sa cu oricare dintre rezultateleunei sub-interogări situate în partea dreaptă
ALL – Compară partea stângă a sa cu toate rezultatele sub-interogării
EXISTS – se comportă ca un operator după clauza WHERE careevaluează dacă sub-interogarea returnează cel puțin o înregistrare
IN – poate fi utilizat când se compară rezultatele a douămulțimi, dintre care cea din dreapta este returnată de sub-interogare
8/17/2019 Recapitulare SQL ase
16/37
Exemple de interogări cu sub-interogări1. Lista furnizorilor care nu au emis facturi în anul 200 7
SELECT DenumireFurnizor FROM FurnizoriWHERE Furnizori.CodFiscal NOT IN
(Select Facturi.CodFiscal FROM Facturi
WHERE Year( DataFactura)=2007)
2. Lista produselor cu categoria de calitate I care au prețul mai mic decât oricare dintre prețurile produselor de calitate II:
SELECT DenumireProdus FROM Produse
WHERE CategorieCalitate=1 AND Pret >
ANY (Select [ Pret ] From Produse
Where CategorieCalitate=2)
8/17/2019 Recapitulare SQL ase
17/37
Exemple de interogări cu sub-interogări
3. Furnizorul care a emis cele mai multe facturi.
SELECT DenumireFurnizor
FROM Furnizori, Facturi
WHERE Furnizori.CodFiscal = Facturi.CodFiscal
Group By DenumireFurnizorHaving Count(NrFactură)>=
ALL (Select Count(NrFactură)
FROM Furnizori, Facturi
WHERE Furnizori.CodFiscal = Facturi.CodFiscal Group By DenumireFurnizor )
8/17/2019 Recapitulare SQL ase
18/37
Exemple de interogări cu sub-interogări
4. Furnizorii care au emis cel puțin o factură după data de 20 septembrie 2008.
SELECT Furnizori.DenumireFZFROM Furnizori
WHEREEXISTS
(Select DataFactura FROM Facturi WHERE DataFactura>#09/20/2008#
AND Facturi.CodFiscal=Furnizori.CodFiscal)
SELECT Furnizori.DenumireFz
FROM Furnizori
WHERE Furnizori.CodFiscal IN
(Select Facturi.CodFiscal FROM Facturi
WHERE DataFactura>#09/20/2008#)
Al b l ți lă
8/17/2019 Recapitulare SQL ase
19/37
Algebra relațională
Reprezintă un set de operații cu relații (tabele) ale unei
baze de date făcând apel la operatori relaționali utilizați
pentru a compune, modifica și combina tupluri din cadrulacestora.
Rezultatul utilizării operatorilor relaționali pe un set de
relații este tot o relație.• Operatorii algebrei relaționale:• operatori unari
proiecţia selecţia
• operatori binari
reuniunea intersecţia diferenţa produsul cartezian
• operatori de extensie compunerea
di viziunea
Operatori de asamblare
O t ii i i l b i l ți l
8/17/2019 Recapitulare SQL ase
20/37
Operatorii unari ai algebrei relaționale
Selecția
Permite decuparea pe orizontală a unei relații
Produce un tabel conținând un subset de
înregistrări din cadrul relației sursă, care satisfac o
anumită condiție.Schema de câmpuri a relației rezultat este identică
cu cea a relației de intrare.
Numărul de tupluri sau cardinalitatea relațieirezultat este mai mic decât cel al relației de intrare.
Notație: σcondiție(Relație)
O t ii i i l b i l ți l
8/17/2019 Recapitulare SQL ase
21/37
Operatorii unari ai algebrei relaționale
Exemplu de utilizare a operatorului de selecție
Cod salariat Nume Prenume Salariu
M100 Jinga Paul 2000
M200 Nicsulescu Ion 1800
M300 Popescu George 2700
M400 Lovinescu Remus 2800
Afișarea tuturor salariaților cu salariul peste 2500
Notație: σ Salariu>2500 ( Salariati )Cod salariat Nume Prenume Salariu
M300 Popescu George 2700
M400 Lovinescu Remus 2800
Implementarea în SQL:
SELECT * FROM Salariati WHERE Salariu>2500
O t ii i i l b i l ți l
8/17/2019 Recapitulare SQL ase
22/37
Operatorii unari ai algebrei relaționale
Proiecția
Permite decuparea pe verticală a unei relații (R).
Produce o relație (R1) care afișează înregistrările
doar pentru anumite câmpuri prezente în lista de
proiecție.Gradul relației rezultat (R1) este mai mic decât
gradul relației de intrare (R).
Numărul de tupluri al relației rezultat poate diferi decel al relației de intrare, dacă are loc eliminarea
duplicatelor .
Notație: A1,…,An(Relație), {A1, A2, …, An}=Atribute
O t ii i i l b i l ți l
8/17/2019 Recapitulare SQL ase
23/37
Operatorii unari ai algebrei relaționale
Exemplu de utilizare a operatorului de proiecție
Cod salariat Nume Prenume Salariu
M100 Jinga Paul 2000
M200 Nicsulescu Ion 1800
M300 Popescu George 2700
M400 Lovinescu Remus 2800
Afișarea numelor și prenumelor salariaților
Notație: N ume, Prenume ( Salariati )
Implementarea în SQL:
SELECT Nume, Prenume FROM Salariati
Nume Prenume
Jinga Paul
Nicsulescu Ion
Popescu George
Lovinescu Remus
Operatorii binari ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
24/37
Operatorii binari ai algebrei relaționale
Produsul cartezian
Pentru două relații R(cu gradul g1 și cardinalitatea c1)și S (cu gradul g2 și cardinalitatea c2), produsul
cartezian are ca rezultat o relație T (cu gradul g1+g2 și
cardinalitatea c1xc2) , în care fiecare tuplu al relației R
este concatenat cu fiecare tuplu al relației S.
A B
X1 Y1
X2 Y2
X3 Y3
C D
Z1 T1
Z2 T2
A B C D
X1 Y1 Z1 T1
X1 Y1 Z2 T2
X2 Y2 Z1 T1
X2 Y2 Z2 T2
X3 Y3 Z1 T1
X3 Y3 Z2 T2
Relația R
Relația S Relația T=RxS
Implementare în SQL:
SELECT * FROM R,S
Operatorii binari ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
25/37
Operatorii binari ai algebrei relaționale
Operatorii de asamblare:
Reuniunea, intersecția și diferența
sunt operații care acționează asupra a două relații
de intrare, compatibile din punctul de vedere al
unificării (să prezinte cel puțin un câmp corespondentcare să aibă același tip pentru ambele relații)
Rezultatul este o singură relație care nu trebuie să
conțină duplicate, privind în ansamblul câmpurilor.
Operatorii binari ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
26/37
Operatorii binari ai algebrei relaționale
Reuniunea
Construiește o relație rezultat constând din toate tuplurile care apar în
ambele relații sursă, sau doar în una dintre acestea, fără a afişa rezultateduplicat.
Numărul de câmpuri, numele și tipul lor trebuie să fie identice pentru
ambele relații.
Cod fiscal Denumire
R101102 SC X SA
R102103 SC Y SA
R104105 SC Z SA
Cod fiscal Denumire
R101102 SC X SA
R105106 SC A SA
R107108 SC B SA
Cod fiscal Denumire
R101102 SC X SA
R102103 SC Y SA
R104105 SC Z SA
R105106 SC A SAR107108 SC B SA
∪
=
Furnizori Clienti
Parteneri
Implementarea în SQL:
SELECT CodFiscal, Denumire FROM Furnizori
UNION
SELECT CodFiscal, Denumire FROM Clienti
Operatorii binari ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
27/37
Operatorii binari ai algebrei relaționale
Intersecția
Construiește o relație rezultat constând din toate tuplurile care apar în
ambele relații sursă.
Operația de intersecție poate fi stabilită și pentru un singur câmp
comun al relațiilor de intrare.
Cod fiscal Denumire
R101102 SC X SA
R102103 SC Y SA
R104105 SC Z SA
Cod fiscal Denumire
R101102 SC X SA
R105106 SC A SA
R107108 SC B SA
Cod fiscal Denumire
R101102 SC X SA=
Furnizori Clienti
Parteneri cu dublu rol
Implementarea în SQL:
SELECT CodFiscal, Denumire FROM Furnizori
Where Furnizori.CodFiscal IN
(SELECT CodFiscal FROM Clienti)
Operatorii binari ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
28/37
Operatorii binari ai algebrei relaționale
Diferența
Construiește o relație rezultat constând din toate tuplurile care apar
într-una din relațiile sursă, dar nu și în cealaltă.
Operatorul de diferență poate acționa și pentru un singur câmp
comun al relațiilor de intrare.
Cod fiscal Denumire
R101102 SC X SA
R102103 SC Y SA
R104105 SC Z SA
Cod fiscal Denumire
R101102 SC X SA
R105106 SC A SA
R107108 SC B SA
Cod fiscal Denumire
R102103 SC Y SA
R104105 SC Z SA=
Furnizori Clienti
Parteneri doar furnizori
Implementarea în SQL:
SELECT CodFiscal, Denumire FROM Furnizori
Where Furnizori.CodFiscal NOT IN
(SELECT CodFiscal FROM Clienti)
—
Operatorii de extensie ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
29/37
Operatorii de extensie ai algebrei relaționale
Compunerea (JOIN)
Construiește o relație rezultat constând din toate combinațiile posibile
de perechi de înregistrări concatenate din două tabele (sau proiecţii ale
acestora) realizate în urma unei condiţii.
Compunerea presupune existenţa unei condiţii de compunere (=, >,
8/17/2019 Recapitulare SQL ase
30/37
Operatorii de extensie ai algebrei relaționale
Exemplu de utilizare a compunerii (INNER JOIN)
CodFiscal DenumireR101102 SC X SA
R102103 SC Y SA
R104105 SC Z SA
NrFactura DataFactura CodFiscal132112 12.05.2008 R101102
144231 13.06.2008 R102103
132112 14.08.2008 R102103
NrFactura DataFactura Facturi.CodFiscal Furnizori.CodFiscal Denumire132112 12.05.2008 R101102 R101102 SC X SA
144231 13.06.2008 R102103 R102103 SC Y SA
132112 14.08.2008 R102103 R102103 SC Y SA
Implementarea în SQL:SELECT CodFiscal, Denumire FROM Furnizori, Facturi WHERE
Furnizori.CodFiscal =Facturi.CodFiscal
sau
SELECT CodFiscal, Denumire FROM Furnizori INNER JOIN Facturi
ON Furnizori.CodFiscal =Facturi.CodFiscal
Operatorii de extensie ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
31/37
Operatorii de extensie ai algebrei relaționale
Exemplu de utilizare a compunerii (OUTER JOIN)
CodFiscal DenumireR101102 SC X SA
R102103 SC Y SA
R104105 SC Z SA
NrFactura DataFactura CodFiscal132112 12.05.2008 R101102
144231 13.06.2008 R102103
132112 14.08.2008 R102103
NrFactura DataFactura Facturi.CodFiscal Furnizori.CodFiscal Denumire132112 12.05.2008 R101102 R101102 SC X SA
144231 13.06.2008 R102103 R102103 SC Y SA
132112 14.08.2008 R102103 R102103 SC Y SA
R104105 SC Z SA
Implementarea în SQL:
SELECT CodFiscal, Denumire FROM Furnizori LEFT JOIN Facturi
ON Furnizori.CodFiscal =Facturi.CodFiscal
Operatorii de extensie ai algebrei relaționale
8/17/2019 Recapitulare SQL ase
32/37
Operatorii de extensie ai algebrei relaționale
Diviziunea
Presupune împărţirea unei relații R3 de grad m+n, la o
relație R1 de grad n, câtul împărţirii fiind o relație R2 de grad
m.
A B
X1 Y1
X1 Y2
X1 Y3
X1 Y4
X2 Y1X2 Y2
X3 Y2
X4 Y2
X4 Y4
R3
B
Y2
1R2
R3/1R2
A
X1
X2
X3
X4
1R1
B
Y2
Y4
2R2
R3/2R2
A
X1
X4
2R1
B
Y1
Y2
Y4
3R2
R3/1R2
A
X1
3R1
Interogări SQL pentru adăugarea de noi înregistrări
8/17/2019 Recapitulare SQL ase
33/37
Interogări SQL pentru adăugarea de noi înregistrări
INSERT INTO nume-tabela (nume-atribut1, nume-atribut2,…)
VALUES (valoare1, valoare2,…)
Varianta 1: Adăugarea pe baza unor valori noi
Exemplu: Să se adauge un nou client în baza de date cu codul fiscal R101221 și
denumirea SC GAMA SA
INSERT INTO Clienti (CodFiscal, Denumire) VALUES (‘R101221’, ‘SC GAMA SA’)
Varianta 2: Adăugarea pe baza valori lor preluate dintr -un tabel
INSERT INTO nume-tabela SELECT nume-atribut1, nume-atribut2, …
FROM nume-tabela-sursa [WHERE Conditii …]
Exemplu: Să se adauge în tabela Parteneri toți Furnizorii din localitateaBucurești
INSERT INTO Parteneri SELECT * FROM Furnizori WHERE Localitate=‘București’
Interogări SQL pentru
modificarea
valorilor
c
â
mpurilor
8/17/2019 Recapitulare SQL ase
34/37
Interogări SQL pentru modificarea valorilor câmpurilor
UPDATE nume-tabel
SET nume-atribut1=valoare1, nume-atribut2=valoare2, …WHERE Condiții
Exemplul 1: Să se transforme în KG toate unitățile de măsură ale produselor
cu codul mai mare decât 3.
UPDATE Produse SET UnitateMasura=‘KG’ WHERE CodProdus:3
Exemplul 2: Să se majoreze cu 5% toate prețurile din facturile emise după
data de 12.09.2008.
UPDATE ProduseFacturate
SET PretFacturat=[PretFacturat]+[PretFacturat]*5/100
WHERE IDFactura IN
(Select IDFactura FROM Facturi WHERE DataFactura>#12.09.2008#)
Interogări SQL pentru ștergerea înregistrărilor
8/17/2019 Recapitulare SQL ase
35/37
Interogări SQL pentru ștergerea înregistrărilor
DELETE *
FROM nume-tabel
WHERE Condiție
Exemplu: Să se șteargă toți clienții din localitatea Brăila
DELETE *
FROM Clienti
WHERE Localitate=‘Braila’
Interogări SQL pentru
crearea
de
tabele
rezultat
8/17/2019 Recapitulare SQL ase
36/37
Interogări SQL pentru crearea de tabele rezultat
SELECT nume-atribut1, nume-atribut2, …
INTO nume-tabel-rezultat
FROM listă-tabele-sursă[WHERE Condiții …]
Exemplu: Să se creeze un nou tabel denumit ProduseFacturateOctombrie care
să afișeze denumirile de produse facturate în luna curentă
SELECT DenumireProdus
INTO ProduseFacturateOctombrie
FROM Produse, ProduseFacturate, FacturiWHERE Produse.CodProdus=ProduseFacturate.CodProdus AND
ProduseFacturate.IDFactura=Facturi.IDFactura AND
Month(DataFactura)=Month(Date())
Exemple de rezolvat
8/17/2019 Recapitulare SQL ase
37/37
Exemple de rezolvat
1. Să se afișeze lista produselor facturate de furnizorul SC BETASA în anul 2008.
2. Să se precizeze denumirile tuturor produselor care au fost achiziționate în anul 2011 într -o valoare totală mai mare de500 lei.
3. Să se afișeze toate denumirile produselor care nu provin din
achiziţii de la furnizori.4. Ce produse au fost cel mai des achiziţionate în luna martie a
anului curent?
5. Care sunt furnizorii care în anul 2012 au emis facturi cuvaloarea totală mai mare decât cea a tuturor facturilor emise în trimestrul 4 al anului 2011.