You are on page 1of 11

Rezolvari exercitii

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

GROUP BY DepartamentID) X ON X.DepartamentID=A.DepartamentID AND X.Sal=A.Salariu ORDER BY X.Sal DESC


sau
SELECT
a.nume,a.prenume
FROM Angajati a
WHERE a.DataAngajarii>=(SELECT max(aa.dataangajarii)
FROM Angajati aa
WHERE aa.DepartamentID=a.DepartamentID)
ORDER BY a.DataAngajarii
sau
SELECT A.DepartamentID, A.AngajatID, X.Ang
FROM Angajati A
RIGHT JOIN (
SELECT DepartamentID,Min(DataAngajarii) Ang
FROM Angajati GROUP BY DepartamentID) X
on X.DepartamentID=A.DepartamentID AND X.Ang=A.DataAngajarii
ORDER BY X.Ang
3. --Afisati numele, prenumele, salariul si numele departamentului la care lucreaza pentru orice
angajat care castiga un salariu mai mare decat media pentru departamentul din care face parte.
SELECT
a.nume,
a.prenume,
a.salariu,
d.NumeDepartament
FROM angajati a INNER JOIN Departamente d ON a.DepartamentID =
d.DepartamentID WHERE salariu >
(SELECT
avg(salariu) FROM
angajati
WHERE a.departamentID =
angajati.departamentID) ORDER BY a.salariu
DESC
sau
SELECT a.nume, a.prenume, a.salariu, a.departamentid
FROM Angajati a, (SELECT a2.departamentid, avg(a2.salariu) AS sal
FROM angajati a2 GROUP BY a2.DepartamentID) AS b
WHERE (a.DepartamentID = b.departamentid) AND (a.Salariu > b.sal)

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

4. --Listati toate departamentele care nu au angajati (folositi o subcerere)


SELECT NumeDepartament
FROM Departamente
WHERE DepartamentID NOT IN
(SELECT
X.DepartamentID
FROM Angajati X JOIN Departamente Y ON X.DepartamentID = Y.DepartamentID)
sau
SELECT * from Departamente D
WHERE D.DepartamentID != ALL(SELECT A.DepartamentID FROM Angajati A);
sau
SELECT DepartamentID
FROM Departamente D
WHERE (SELECT count(*) FROM angajati a WHERE a.DepartamentID=D. DepartamentID)=0
sau
SELECT DepartamentID, NumeDepartament
FROM Departamente D
WHERE NOT EXISTS(SELECT * FROM Angajati WHERE DepartamentID=D.DepartamentID)
sau
SELECT D.DepartamentID
FROM Departamente D
WHERE D.DepartamentID NOT IN
(SELECT DepartamentID FROM Angajati GROUP BY DepartamentID
HAVING COUNT(AngajatID)> 0)

5. --Afisati numele , prenumele si salariul primilor trei angajati in functie de salariul


castigat.
SELECT a.nume, a.prenume, a.salariu
FROM angajati a
WHERE 3>(SELECT count(*)
FROM angajati
WHERE a.salariu < salariu)
sau
SELECT TOP 3 nume,prenume, salariu
FROM angajati a
ORDER BY a.Salariu DESC

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'
)

10. --Gasiti angajatii care nu au subordonati.


SELECT nume, prenume
FROM angajati
WHERE angajatID NOT IN (SELECT a.AngajatID
FROM angajati a, angajati s
WHERE a.SupervizorID = s.AngajatID and SupervizorID IS NOT NULL )
sau
SELECT A.Nume, A.Prenume
FROM Angajati A
WHERE A.AngajatID NOT IN (
SELECT A.SupervizorID
FROM Angajati A
WHERE A.SupervizorID >= 1
GROUP BY A.SupervizorID)
sau
SELECT Nume, Prenume, AngajatID
FROM Angajati
WHERE AngajatID NOT IN(SELECT DISTINCT SupervizorID FROM Angajati WHERE
SupervizorID IS NOT NULL)
11. --Gasiti angajatii care au cel putin 2 persoane in intretinere.
SELECT a.nume, a.prenume
FROM angajati a INNER JOIN Intretinuti i ON a.AngajatID=i.angajatid
GROUP BY i.AngajatID, a.Nume, a.Prenume
HAVING count(i.IntretinutID) >=2
12. --Afisati numele si departamentul angajatilor care ii sunt subordonati angajatului cu
numele Popescu.
SELECT a.nume, a.prenume, d.numedepartament
FROM Angajati a inner join Departamente d ON a.DepartamentID = d.DepartamentID
inner JOIN angajati s ON a.SupervizorID = s.AngajatID
WHERE s.Nume = 'Popescu'
sau
SELECT A.Nume, A.Prenume,
A.DepartamentID FROM Angajati A
WHERE A.SupervizorID
IN ( SELECT
AngajatID FROM
Angajati
WHERE Nume = 'Popescu')

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

You might also like