Sunteți pe pagina 1din 5

1

Urmtoarele cerine SQL vor fi rezolvate n baza de date de la seminar


BazaDeDateSQL.mdb:

01. Sa se creeze tabela SALARIATI cu urmtoarea structur CNP, Nume, Functia,


DataAngajare, Salariu.
CREATE TABLE SALARIATI ( CNP TEXT(13) CONSTRAINT CNP PRIMARY KEY, Nume
TEXT(30), FUNCTIA TEXT(10), DataAngajare DATE, Salariu CURRENCY)
02. Sa se adauge in tabela SALARIATI angajatul Ionescu Ion cu CNP
1751115463041, funcia contabil, angajat pe 1/1/2000 cu un salariu de 12.000.000.
INSERT INTO SALARIATI
VALUES ("1751115463041", "IONESCU ION", "CONTABIL", #1/1/2000#, 12000000);
03. Sa se adauge in tabela SALARIATI toate persoanele din tabela GESTIONARI
(n coloana Funcia se va completa Gest).
INSERT INTO SALARIATI ( CNP, NUME, FUNCTIA, DATAANGAJARE, SALARIU )
SELECT CNPGEST, NUMEGEST, "GEST", [DATA ANGAJARE], SALARIU
FROM GESTIONARI;
04. Sa se majoreye cu 500.000 salariile din tabela SALARIATI pentru persoanele
angajate inainte de 1-1-1999..
UPDATE SALARIATI SET SALARIU = [SALARIU]+1000000
WHERE DATAANGAJARE<#1/1/1999#;

05. Sa se tearg din tabela SALARIATI toate persoanele agajate nainte de 1-1-2000
care au salariu sub 10.000.000 lei..
DELETE
FROM SALARIATI
WHERE SALARIU<10000000 And DATAANGAJARE<#1/1/2000#;

06. Sa se afieze, n odine alfabetic numele furnizorilor din Iai i Braov.


SELECT NumeFz
FROM Furnizori
WHERE AdresaFZ LIKE "*IASI" OR ADRESAFZ LIKE "*Brasov"
ORDER BY NumeFz;
07. Sa se afieze lista localitilor unde firma are depozite (fiecare oras va figura o
singur dat).
SELECT DISTINCT LOCALITATED
FROM DEPOZITE;
08. Sa se afieze lista cu numele, funciile i salariile primilor 3 angajai cu cele mai
mari salarii din tabela SALARIATI.
SELECT TOP 3 Nume, Functia, Salariu
FROM SALARIATI
WHERE FUNCTIA="GESTIONAR"
ORDER BY SALARIU DESC;
09. Sa se afiseze numerele notelor de recepie, datele recepiilor i s se calculeze
numrul de zile trecut de la recepie pentru toate recepiile de la un anumit depozit
tastat ca parametru.
SELECT NrNotaReceptie, DataReceptie, INT(NOW()-DataReceptie) AS [ZILE TRECUTE]
FROM RECEPTIE
WHERE NrDepozit=[TASTATI NR DEPOZIT];
10. Sa se afieze numerele notelor de receptie si numele gestionarilor ce le-au
intocmit de la inceputul anului pina in prezent.
Solutia I
SELECT NumeGest, NrNotaReceptie, DataReceptie
FROM GESTIONARI INNER JOIN RECEPTIE ON GESTIONARI.CNPGest=RECEPTIE.CNPGest
WHERE DataReceptie Between #1/1/2004# And Now()

ORDER BY NumeGest, NrNotaReceptie;


sau
Solutia II
SELECT NumeGest, NrNotaReceptie, DataReceptie
FROM GESTIONARI AS G, RECEPTIE AS R
WHERE G.CNPGest=R.CNPGest AND DataReceptie Between #1/1/2004# And Now()
ORDER BY NumeGest, NrNotaReceptie;
11. Sa se afieze numele materialelor consumate in lunile februarie si aprile 2005.
Solutia I
SELECT DenMaterial
FROM Materiale AS M, LINIE_CONSUM AS LC, CONSUM AS C
WHERE M.CODMATERIAL=LC.CODMATERIAL AND LC.NRBONCONSUM=C.NRBONCONSUM
AND MONTH(DATACONSUM) IN (2,4) AND YEAR(DATACONSUM) = 2005
Sau

Solutia II
SELECT DenMaterial
FROM (MATERIALE INNER JOIN LINIE_CONSUM ON
MATERIALE.CODMATERIAL=LINIE_CONSUM.CODMATERIAL) INNER JOIN CONSUM ON
LINIE_CONSUM.NRBONCONSUM=CONSUM.NRBONCONSUM
WHERE MONTH(DATACONSUM) IN (2,4) AND YEAR(DATACONSUM)=2005;
12. Sa se calculeze cte depozite are firma n fiecare localitate.
SELECT LOCALITATED, COUNT(NRDEPOZIT) AS DEPOZITE
FROM DEPOZITE
GROUP BY LOCALITATED
13. Sa se calculeze valorile bonurilor de consum intocmite a cror valoare depete 1
million. Se va ordona descresctor dup valoare.
SELECT CONSUM.NRBONCONSUM, SUM(CantitateC*PretC) AS ValoareBon
FROM CONSUM INNER JOIN Linie_Consum ON
CONSUM.NRBONCONSUM=LINIE_CONSUM.NRBONCONSUM
GROUP BY CONSUM.NRBONCONSUM
HAVING SUM(CantitateC*PretC)>1000000
ORDER BY SUM(CantitateC*PretC) DESC;

14. Sa se calculeze preturile minime de receptie, preturile maxime de receptie si


preturile maxime cu TVA pentru fiecare dintre produsele din clasa de calitate 1 din
cu pret mediu peste 20.000.
SELECT Materiale.CodMaterial, DenMAterial, Max(PretR) AS MAXIM, Min(PretR) AS MINIM,
MAXIM*1.19 as MAXIMCUTVA
FROM MATERIALE INNER JOIN LINIE_RECEPTIE ON
MATERIALE.CODMATERIAL=LINIE_RECEPTIE.CODMATERIAL
WHERE CLASACALITATE=1
GROUP BY Materiale.CodMaterial, Materiale.DenMaterial
HAVING AVG(PRETR)>20000;

15 Realizai o interogare UNION pentru a afisa localitatile si adresele pentru toate


depozitele i ateliere firmei din afara Bucurestiului. Intr-o a treia coloana numita
TipObiectiv se va afisa Dep pentru depozite i At pentru ateliere
SELECT LocalitateD, AdresaD, "Dep" AS TIP
FROM DEPOZITE
WHERE LocalitateD <>"BUCURESTI"
UNION
SELECT LocalitateA, AdresaA, "At" AS TIP
FROM Ateliere
WHERE LocalitateA <>"BUCURESTI"
16Realizai o interogare cu subinterogare pentru a afisa denumirile materialelor din
clasa de calitate 1 care nu au fost receptionate la preturi sub 20.000.
SELECT DENMATERIAL
FROM MATERIALE
WHERE CLASACALITATE =1
AND CODMATERIAL NOT IN (SELECT CODMATERIAL FROM LINIE_RECEPTIE WHERE
PRETR<20000)
17 Realizai o interogare cu subinterogare pentru a sterge receptiile de la furnizorii
din Iasi.
DELETE FROM RECEPTIE
WHERE YEAR(DATARECEPTIE)=2005
AND CODFISCAL IN (SELECT CODFISCAL FROM FURNIZORI WHERE ADRESAFZ LIKE "*IASI")

Realizai o interogare cu subinterogare pentru a afisa numele gestionarilor care


au cel mai mic salariu din tabela gestionari.
SELECT NumeGest, Salariu
18.

FROM GESTIONARI
WHERE SALARIU<=ALL(SELECT SALARIU FROM GESTIONARI)
Realizai o interogare cu subinterogare pentru majora cu 10% salariile
gestionarilor care lucreaza in depozite din Ploiesti
UPDATE GESTIONARI
SET SALARIU=1.1 * SALARIU
WHERE NRDEPOZIT = ANY(SELECT NRDEPOZIT FROM DEPOZITE WHERE
LOCALITATED="PLOIESTI")
19.

20.

Realizati o interogare CROSSTAB pentru a afisa cte recepii s-au primit de la


fiecare furnizor n fiecare an.

TRANSFORM COUNT(NRNOTARECEPTIE)
SELECT NUMEFZ
FROM FURNIZORI INNER JOIN RECEPTIE ON
FURNIZORI.CODFISCAL=RECEPTIE.CODFISCAL
GROUP BY NUMEFZ
PIVOT YEAR(DATARECEPTIE)