Professional Documents
Culture Documents
Rezolvari Exercitii - 2013
Rezolvari Exercitii - 2013
1.--Gasiti angajatii care castiga cel mai mare salariu pentru fiecare departament. Sortati in
ordinea descrescatoare a salariului.
SELECT a.nume, a.prenume, a.salariu, a.DepartamentID
FROM angajati a
WHERE a.salariu IN
(SELECT max(a2.salariu) FROM angajati a2
WHERE a2. departamentID=a.departamentID
GROUP BY departamentID)
ORDER BY salariu DESC
sau
SELECT a.nume,a.prenume,a.salariu,a.DepartamentID
FROM Angajati A
WHERE a.salariu=(SELECT max(aa.salariu) FROM Angajati aa WHERE
aa.DepartamentID=a.DepartamentID )
ORDER BY a.Salariu DESC
sau
SELECT A.Nume, A.Prenume, A.Salariu, D.DepartamentID
FROM Angajati As A
INNER JOIN
( SELECT MAX(AA.Salariu) as SalariuMaxim, DD.DepartamentID
FROM Angajati as AA
INNER JOIN Departamente As DD on AA.DepartamentID = DD.DepartamentID
GROUP BY DD.DepartamentID
) As D on A.DepartamentID = D.DepartamentID and D.SalariuMaxim = A.Salariu
ORDER BY A.Salariu DESC
sau
SELECT X.Nume, X.Prenume, Z.NumeDepartament, X.Salariu
FROM Angajati X
JOIN (SELECT DepartamentID, MAX(Salariu) AS Salariu
FROM Angajati
GROUP BY DepartamentID) Y
ON X.DepartamentID = Y.DepartamentID AND X.Salariu = Y.Salariu
JOIN Departamente Z ON X.DepartamentID = Z.DepartamentID
ORDER BY X.Salariu DESC
sau
SELECT A.DepartamentID, A.AngajatID, X.Sal FROM Angajati A RIGHT JOIN (SELECT DepartamentID,MAX(Salariu) Sal FROM Angajati
sau
SELECT a.nume,a.prenume,a.salariu,a.DepartamentID
FROM Angajati A
WHERE a.salariu>= ALL(SELECT an.salariu FROM Angajati an
WHERE an.DepartamentID=a.DepartamentID )
ORDER BY a.Salariu DESC
2.--Gasiti cei mai recenti angajati din fiecare departament.Ordonati dupa data angajarii.
SELECT nume, prenume, departamentID, dataangajarii
FROM angajati
WHERE (dataangajarii) IN
(SELECT max(a2.dataangajarii) FROM angajati a2
WHERE a2. departamentID=angajati.departamentID
GROUP BY departamentID)
ORDER BY dataangajarii
sau
SELECT X.Nume, X.Prenume, Z.NumeDepartament, X.DataAngajarii
FROM Angajati X
JOIN (SELECT DepartamentID, MAX(DataAngajarii) AS DataAngajarii
FROM Angajati
GROUP BY DepartamentID) Y
ON X.DepartamentID = Y.DepartamentID AND X.DataAngajarii=Y.DataAngajarii
JOIN Departamente Z ON X.DepartamentID = Z.DepartamentID
sau
Select A.Nume, A.Prenume, A.DataAngajarii, D.DepartamentID
from Angajati As A
inner join
( select MAX(AA.DataAngajarii) as DataAngajarii, DD.DepartamentID
from Angajati as AA
inner join Departamente As DD on AA.DepartamentID = DD.DepartamentID
group by DD.DepartamentID
) As D on A.DepartamentID = D.DepartamentID and D.DataAngajarii = A.DataAngajarii
order by A.DataAngajarii
sau
SELECT X.Nume, X.Prenume, Z.NumeDepartament, X.Salariu, Y.Salariu
AS SalariuMediuPeDepartament
FROM Angajati
X
JOIN (SELECT DepartamentID, AVG(Salariu) AS
Salariu
FROM Angajati
GROUP BY DepartamentID) Y
ON X.DepartamentID = Y.DepartamentID AND X.Salariu >= Y.Salariu
JOIN Departamente Z ON X.DepartamentID = Z.DepartamentID
sau
SELECT A.Nume, A.Prenume, A.Salariu, D.NumeDepartament
FROM Angajati A, Departamente D
WHERE A.Salariu >= (SELECT AVG(A2.Salariu)
FROM Angajati A2
GROUP BY A2.DepartamentID
HAVING A2.DepartamentID = A.DepartamentID) AND A.DepartamentID =
D.DepartamentID;
sau
SELECT A.Nume, A.Prenume, A.Salariu, D.NumeDepartament FROM Angajati A JOIN
Departamente
D ON A.DepartamentID=D.DepartamentID
JOIN (SELECT DepartamentID,AVG(Salariu) SalM FROM Angajati GROUP BY DepartamentID)
Y ON A.DepartamentID=Y.DepartamentID AND A.Salariu >Y.SalM
6. --In ce an s-au angajat cei mai multi in companie ? Afisati anul si numarul angajatilor.
SELECT year(dataangajarii) An, count(angajatid) NUMAR_DE_ANGAJATI
FROM angajati
GROUP BY year(dataangajarii)
HAVING count(angajatid)=
(SELECT max(s.nrang)
FROM (select (count(angajatid)) AS nrang
FROM angajati
GROUP BY year(dataangajarii)) AS s)
sau
SELECT X.An, Q.AngajatiMax
FROM (SELECT Year(DataAngajarii) AS An, COUNT(DataAngajarii) AS Angajati
FROM Angajati
GROUP BY YEAR(DataAngajarii)) X JOIN
(SELECT MAX(X.Angajati) AS AngajatiMax
FROM
(SELECT Year(DataAngajarii) AS An, COUNT(DataAngajarii) AS Angajati
FROM Angajati
GROUP BY YEAR(DataAngajarii)) X)Q ON X.Angajati = Q.AngajatiMax
sau
SELECT YEAR(DataAngajarii) AS An, COUNT(DataAngajarii)
FROM Angajati
GROUP BY YEAR(DataAngajarii)
HAVING COUNT(DataAngajarii) = (SELECT MAX(X.Angajati) AS AngajatiMax
FROM (SELECT Year(DataAngajarii) AS An, COUNT(DataAngajarii) AS Angajati
FROM Angajati
GROUP BY YEAR(DataAngajarii)) X)
sau
SELECT An, Numar
FROM (SELECT Year(dataAngajarii) as An, count(AngajatID)as Numar FROM Angajati
GROUP BY Year(DataAngajarii)) A
GROUP BY An, Numar
HAVING A.Numar=(SELECT max(Numar) FROM (select Year(dataAngajarii) as An,
count(AngajatID)as Numar FROM Angajati GROUP BY Year(DataAngajarii)) B)
sau
SELECT YEAR(DataAngajarii) AS An, COUNT(DataAngajarii) as Nr
FROM Angajati
GROUP BY YEAR(DataAngajarii)
HAVING COUNT(YEAR(DataAngajarii)) >= ALL(SELECT
COUNT(YEAR(A.DataAngajarii))
FROM Angajati A
GROUP BY YEAR(A.DataAngajarii))
sau(cu observatia ca daca avem 2 ani diferiti cu acelasi numar de angajati va afisa doar unul)
SELECT top 1 YEAR(A.DataAngajarii), COUNT(A.AngajatID) AS
'Nr.Angajati' FROM Angajati A
GROUP BY YEAR(A.DataAngajarii)
ORDER BY COUNT(A.AngajatID) DESC
7. --Aflati angajatii care au salariul mai mare decat vreun angajat al departamentului cu
ID-ul 2 si care nu fac parte din acest departament.
SELECT nume, prenume, departamentID, salariu
FROM angajati
WHERE (salariu > ANY
(SELECT salariu
FROM angajati
WHERE departamentID = 2))
AND departamentID <> 2
sau
SELECT * FROM Angajati A
WHERE A.Salariu > ALL(SELECT A2.Salariu FROM Angajati A2 WHERE A2.DepartamentID
= 2) and A.DepartamentID != 2
sau
SELECT nume, sal
FROM( SELECT a.nume++a.prenume as nume, a.salariu as sal
FROM angajati a
WHERE a.departament id<> 2 as ad)
GROUP BY nume, sal
HAVING ad.sal>( (SELECT min(d.sal) FROM (SELECT a.nume++a.prenume as nume,
a.salariu as sal
FROM angajati a
WHERE a.departament id= 2) as d)
8. --Gasiti angajatii care au salariul mai mare decat toti angajatii departamentului cu ID-ul 5.
SELECT nume, prenume, departamentID, salariu
FROM angajati
WHERE salariu > ALL
(SELECT salariu
FROM angajati
WHERE departamentid = 5)
9. --Gasiti numele, data angajarii si salariul angajatilor al caror salariu este mai mare decat
cel mai mare salariu al vreunei persoane angajate dupa data de 01.01.2007.
SELECT nume, prenume, dataangajarii, salariu
FROM angajati
WHERE salariu >
(SELECT max(salariu)
FROM angajati
WHERE dataangajarii IN
(SELECT dataangajarii
FROM angajati
WHERE dataangajarii >'01/01/2007'))
sau
SELECT A.Nume, A.DataAngajarii, A.Salariu
FROM Angajati A
WHERE A.Salariu >ANY
(SELECT MAX(Salariu) FROM Angajati
WHERE DataAngajarii > '01.01.2007'
)
13. -- Sa se afiseze numele, prenumele si salariul angajatului insotit de codul managerului sau,
pentru angajatii al caror salariu este mai mic de 1500 lei.
SELECT a.nume, a.prenume, a.Salariu, s.nume, s.prenume
FROM angajati a INNER join angajati s ON a.SupervizorID = s.AngajatID
WHERE a.Salariu < 1500
sau
SELECT A.Nume, A.Prenume, A.Salariu, D.ManagerID
FROM Angajati A
JOIN Departamente D
ON D.DepartamentID = A.DepartamentID
WHERE A.AngajatID IN (
SELECT AngajatID FROM Angajati
WHERE Salariu < 1500)
sau
SELECT A.Nume, A.Prenume,A.salariu, (SELECT D.ManagerIDFROM Departamente D WHERE
A.DepartamentID=D.DepartamentID) As Manager
FROM Angajati A
WHERE A.Salariu<1500
14. --Sa se afiseze numele salariatilor care lucreaza intr-un departament in care exista cel
puin un angajat cu salariul cu salariul mai mare de 2000 lei.
SELECT a.nume, a.prenume, a.DepartamentID
FROM Angajati a
WHERE a.DepartamentID IN (SELECT
DepartamentID FROM Departamente d
WHERE EXISTS (SELECT angajatid FROM angajati a2
WHERE a2.DepartamentID= d.DepartamentID AND a2.Salariu > 2000))
sau
SELECT Nume, Prenume
FROM Angajati
WHERE DepartamentID IN ( SELECT DepartamentID
FROM Angajati
WHERE Salariu > 2000
GROUP BY DepartamentID)
sau
SELECT A.Nume, A.Prenume
FROM Angajati A
WHERE A.DepartamentID IN (SELECT Distinct B.DepartamentID
FROM Angajati B
WHERE B.Salariu>2000)
15. --Sa se afiseze numele si salariul angajatilor al caror salariu este mai mare decat
salariile medii din toate departamentele.
SELECT a.nume, a.prenume, a.Salariu
FROM Angajati a
WHERE a.Salariu > ALL (SELECT
avg(salariu)
FROM Angajati
GROUP BY DepartamentID)
sau
SELECT A.Nume, A.Prenume, A.Salariu,
D.DepartamentID FROM Angajati AS A JOIN
Departamente AS D
ON A.DepartamentID = D.DepartamentID
WHERE Salariu > ALL (SELECT AVG(Salariu) AS MEDIE FROM Angajati
GROUP BY DepartamentID)
Exercitiu suplimentar. Sa se afiseze numele, prenumele si media nr de ore lucrate de
fiecare angajat pe saptamana la toate proiectele la care lucreaza.
SELECT X.Nume, X.Prenume, Y.MedieOreSapt
FROM Angajati X JOIN
(SELECT AngajatID, AVG(NrOreSaptamana) AS MedieOreSapt
FROM AngajatiProiecte
GROUP BY AngajatID) Y
ON X.AngajatID = Y.AngajatID
sau
SELECT A.Nume, A.Prenume, AVG(AP.NrOreSaptamana) as
'medie' FROM Angajati A, AngajatiProiecte AP
WHERE A.AngajatID=AP.AngajatID
GROUP BY A.Nume,A.Prenume