Sunteți pe pagina 1din 5

Laborator 7 - Recapitulare

1. Realizati urmatoarele restrictii de integritate:


a. Cantitatea aprovizionata sa fie mai mare sau egala cu 1.

b. Anul angajarii sa fie cu 15 mai mare decat anul nasterii angajatilor.

1 | Page

2. Realizati un trigger pentru operatiunea de stergere care sa nu permita stergerea


aprovizionarilor din 2007, de la furnizorii din Bucuresti.
create TRIGGER Aprovizionari2007 ON APROV FOR DELETE AS
IF EXISTS(SELECT CODFZ FROM DELETED WHERE YEAR(DATAAP)=2007 and CODFZ IN
(SELECT CODFZ FROM FURNIZORI WHERE LOCALITATE='Bucuresti'))
BEGIN
RAISERROR('Nu este permisa stergerea tranzactiilor din 2007,
cu furnizori din Bucuresti', 18,1)
ROLLBACK TRANSACTION
END

3. Afiai numrul de materiale cu care fiecare furnizor aprovizioneaz societatea i


ordonai selecia descresctor n funcie de numrul de materiale frunizate.

SELECT
TOP (100) PERCENT dbo.FURNIZORI.NumeFz, dbo.FURNIZORI.Tara,
dbo.FURNIZORI.Localitate, COUNT(dbo.APROV.CodM) AS [Numar Materiale]
FROM
dbo.FURNIZORI INNER JOIN
dbo.APROV ON dbo.FURNIZORI.CodFz = dbo.APROV.CodFz
GROUP
BY
dbo.FURNIZORI.NumeFz,
dbo.FURNIZORI.Tara,
dbo.FURNIZORI.Localitate
2 | Page

ORDER BY [Numar Materiale] DESC


4. Afiai CNP-ul, numele, localitatea, sexul fiecrui angajat i codul departamentul
pentru angajaii cu domiciliul n Piteti i Bucureti, a caror nume incepe cu litera
P sau T iar penultima litera este N.
SELECT
CodAngajat, CNP, Nume, LEFT(Adresa, CHARINDEX(',', Adresa) - 1) AS
Localitate, CASE WHEN LEFT(CNP, 1) = '1' THEN 'M' WHEN LEFT(CNP, 1)
= '2' THEN 'F' WHEN LEFT(CNP, 1) = '3' THEN 'M' ELSE 'F' END AS
Sex
FROM
dbo.ANGAJATI
WHERE
(LEFT(Adresa, CHARINDEX(',', Adresa) - 1) IN ('Bucuresti', 'Pitesti'))
AND (Nume LIKE N'[TP]%N_')
5. Calculai salariul mediu pe fiecare departament, apoi adaugati campuri
reprezentand rotunjire rezultatului cu ROUND la 2 zecimale, apoi cu FLOOR i
apoi cu CEILING. mprii rezultatul obinut n mai multe partiii n funcie de
salariul mediu.
SELECT
dbo.DEPARTAMENTE.Denumire, AVG(dbo.ANGAJATI.Salariu) AS [Salariu
Mediu], ROUND(AVG(dbo.ANGAJATI.Salariu), 2) AS Round,
FLOOR(AVG(dbo.ANGAJATI.Salariu))
AS Floor, CEILING(AVG(dbo.ANGAJATI.Salariu)) AS Ceiling,
NTILE(4) over (order by AVG(dbo.ANGAJATI.Salariu)) as Partitii
FROM
dbo.ANGAJATI INNER JOIN
dbo.DEPARTAMENTE ON dbo.ANGAJATI.CodDepartament =
dbo.DEPARTAMENTE.CodDepartament
GROUP BY dbo.DEPARTAMENTE.Denumire
Order by AVG(dbo.ANGAJATI.Salariu)

6. Creai o procedur stocata care s selecteze toate datele aferente


aprovizionrilor ce s-au realizat n aceeai lun cu luna unei date introduse de
utilizator. Luna va fi memorat ntr-o variabil separat.
CREATE PROC AprovizionariLunare
@Data datetime
AS
DECLARE @LUNA int
SET @LUNA=MONTH(@Data)
Select * from APROV WHERE MONTH(DataAp)=@LUNA
EXEC AprovizionariLunare '05/25/2007'

7. Modificati procedura anterioara pentru a introduce subtotaluri care sa afiseze


cate aprovizionari au fost realizate in fiecare zi a lunii respective.
ALTER PROC AprovizionariLunare
@Data datetime
AS
DECLARE @LUNA int

3 | Page

SET @LUNA=MONTH(@Data)
Select * from APROV WHERE MONTH(DataAp)=@LUNA
order by DataAp
compute count(CodAProv) by DataAp
EXEC AprovizionariLunare '05/25/2007'

8. Realizati o procedura stocata care afiseaza lista furnizorilor cu care societatea a


realizat tranzactii care depasesc o anumita suma transmisa ca paramentru. Lista
va contine CodFZ, NumeFz, valoarea totala a aprovizionarilor si rangul
furnizorului dupa valoarea aprovizionarilor in ordine descrescatoare.
Create proc Rang_Furnizori
@suma money
as
select Furnizori.CodFz, NumeFz, SUM(PretUnitar*cantitate)as TotalValoare,
RANK() over (order by sum(PretUnitar*cantitate) desc) as Rang
from Furnizori inner join Aprov on aprov.Codfz=furnizori.Codfz
group by furnizori.Codfz, NumeFz
having sum(PretUnitar*cantitate)>@suma
order by SUM(PretUnitar*cantitate) desc
exec Rang_Furnizori 100

9. Conducerea companiei dorete s acorde prime angajailor i v cere o list cu


CNP-ul, numele, prenumele, departamentul, vechimea i salariul fiecrui angajat,
precum i valorile primelor calculate pentru fiecare angajat folosind urmtorul
algoritm:
a. pentru cei de la Contabilitate cu salariu sub 1800 --> 50% din salariu
b. pentru cei de la Contabilitate cu salariu peste 1800 --> 20% din salariu
c. pentru cei de la alte departamente : 100 lei
Realizati o functie pentru calcularea acestor prime si o procedura pentru afisarea
listei.
CREATE FUNCTION dbo.Prime_Salarii(@Dept nvarchar(50), @Salariu money)
RETURNS MONEY
AS
BEGIN
RETURN
CASE
WHEN @Dept='Contabilitate' and @Salariu<1800 THEN @Salariu*0.5
WHEN @Dept='Contabilitate' and @Salariu>=1800 THEN @Salariu*0.2
ELSE 100
END
END
CREATE PROC PRIME_Angajati
AS
Select CNP, LEFT(Nume,charindex(' ', Nume))as Nume,
Right(Nume, charindex(' ', Reverse(Nume))) as Prenume, Denumire,
DATEDIFF(year, DataAngajare,GetDate()) as Vechimea, Salariu,
dbo.Prime_Salarii(Denumire,Salariu) AS Prima
FROM ANGAJATI inner join DEPARTAMENTE on
ANGAJATI.CodDepartament=DEPARTAMENTE.CodDepartament
Sau mai simplu:

4 | Page

CREATE PROC PRIME_Angajati


AS
Select CNP, Nume, Denumire,
DATEDIFF(year, DataAngajare,GetDate()) as Vechimea, Salariu,
dbo.Prime_Salarii(Denumire,Salariu) AS Prima
FROM ANGAJATI inner join DEPARTAMENTE on
ANGAJATI.CodDepartament=DEPARTAMENTE.CodDepartament
Exec PRIME_Angajati

10.Realizati o functie tabelara care sa retina numarul de aprovizionari pentru fiecare


furnizor, ordonata descrescator dupa numarul de aprovizionari.
CREATE FUNCTION dbo.Numar_Aprovizionari()
RETURNS @LISTA TABLE
(Nume nvarchar(50), Numar_Aprovizionari int)
AS
BEGIN
INSERT into @LISTA
Select NumeFz, COUNT(CodAprov) FROM Furnizori inner join APROV
on FURNIZORI.CodFz=APROV.CodFz
GROUP BY NumeFZ
ORDER BY COUNT(CodAprov) desc
RETURN
END
Select * from dbo.Numar_Aprovizionari()

5 | Page

S-ar putea să vă placă și