Sunteți pe pagina 1din 4

1

RECAPITULARE EXAMEN

Aveti la dispozitie urmatoarea baz de date:

1. ADAUGATI TABELUL Concedii tinand cont ca pentru fiecare concediu se cunosc: DataPlecare, Numar
zile, TipConcediu.
Un angajat poate sa solicite mai multe concedii de odihna. Data plecare si numarul de zile trebuie
obligatoriu completate.
CREATE TABLE CONCEDII (IdConcediu int identity primary key,
Data date NOT NULL, NumarZile int NOT NULL,
CodAngajat bigint FOREIGN KEY
REFERENCES Angajati(CodAngajat) )

2. Adaugati o restrictie pentru salariul din tabelul Angajati pentru a nu permite valori peste 2000.

ALTER TABLE ANGAJATI ADD CONSTRAINT PlafonSalarii CHECK (Salariu<2000)

3. Realizati un trigger astfel incat un salariat sa nu poata beneficia de mai mult de 30 de zile de concediu.
CREATE TRIGGER LIMITA_CONCEDII ON CONCEDII FOR UPDATE, INSERT AS
IF EXISTS (SELECT CODANGAJAT, SUM(NUMARZILE) FROM CONCEDII
GROUP BY CODANGAJAT HAVING SUM(NUMARZILE) >30)
BEGIN
RAISERROR ('ATI DEPASIT 30 DE ZILE', 1,1)
ROLLBACK TRANSACTION
END

4. Realizati un View pentru a calcula un spor salarial de 100 lei pentru toti salariatii, iar pentru cei care au
participat la mai mult de 10 aprovizionari sa se mai adauge 5% din salariu.

5. Realizati o procedura stocata pentru a determina care sunt furnizorii dintr-o anumita tara (parametru)
pentru care valoarea vanzarilor depaseste o anumita suma (parametru) prin parametru, dupa
1.1.2007.
CREATE PROC ListaFz
@tara nvarchar(20),
@suma money
as
SELECT F.CODFZ, NUMEFZ,
SUM(CANTITATE*PRETUNITAR) AS TOTAL
FROM FURNIZORI F INNER JOIN APROV ON F.CODFZ=APROV.CODFZ
WHERE TARA=@TARA AND DATAAP>'01/01/2007'
GROUP BY f.CODFZ, NUMEfz
HAVING SUM(CANTITATE*PRETUNITAR)>@SUMA

6. Realizati o procedura pentru a clasifica furnizorii dupa valoarea vanzarilor (descrescator). Apoi,
selectati doar acei furnizori care se incadreaza intre primii 10 si, de la care s-au primit aprovizionari in
2007 sau 2008.

Se va utiliza tehnica CTE pentru realizarea clasamentului.


CREATE PROC FURNIZORI_DUPA_VANZARI AS
WITH LISTA(CODFZ, NUMEFZ, TOTAL, CLASAMENT) AS
(SELECT FURNIZORI.CODFZ, NUMEFZ, SUM(CANTITATE*PRETUNITAR), ROW_NUMBER() OVER
(ORDER BY SUM(CANTITATE*PRETUNITAR) DESC)
FROM FURNIZORI INNER JOIN APROV ON FURNIZORI.CODFZ=APROV.CODFZ GROUP
BY FURNIZORI.CODFZ, NUMEFZ)
SELECT DISTINCT NUMEFZ, CLASAMENT FROM
LISTA INNER JOIN APROV ON LISTA.CODFZ=APROV.CODFZ
WHERE CLASAMENT<10 AND (YEAR(DATAAP)=2007 OR YEAR(DATAAP)=2008 )

7. Realizati o functie de tip scalar care sa primeasca drept argument un cod de furnizor si sa returneze
numarul de aprovizionari realizate din aceeasi localitate, pe langa aprovizionarile respectivului
furnzior.
CREATE FUNCTION NUMAR_APROV_ACELASI_ORAS (@COD AS BIGINT)
RETURNS INT
AS
BEGIN
DECLARE @ORAS AS NVARCHAR(20)
SET @ORAS=(SELECT LOCALITATE FROM FURNIZORI
WHERE CODFZ=@COD)
DECLARE @TOTALORAS AS INT
SET @TOTALORAS=(SELECT COUNT(CODAPROV) FROM APROV A INNER JOIN FURNIZORI F ON A.CODFZ=F.CODFZ
WHERE LOCALITATE=@Oras)
RETURN (SELECT @TOTALORAS-COUNT(CODAPROV)
FROM APROV WHERE CODFZ=@COD AND Localitate=@Oras)
END

EXEMPLU DE UTILIZARE:
CREATE PROC EXEMPLUUTILIZARE
AS
SELECT CODFZ, NUMEFZ, DBO.APROV2(CODFZ)
FROM FURNIZORI
WHERE TARA='ROMANIA'

8. Realizati o functie de tip tabel care sa primeasca drept argument un an si o luna calendaristica si sa
returneze, codul furnizorului, numele si totalul valoric al aprovizionarilor pe furnizor din perioada
respectiva si, intr-un alt cmp, ct reprezint acest total din totalul aprovizionarilor pe luna respectiva.
CREATE FUNCTION FURNIZORIAPROV(@AN AS INT, @LUNA AS INT)
RETURNS @TABEL TABLE (COD INT, NUME NVARCHAR(50),

TOTALFZ MONEY, PONDERE MONEY)


AS
BEGIN
DECLARE @TOTALLUNA AS MONEY
SET @TOTALLUNA=(SELECT SUM(CANTITATE*PRETUNITAR)
FROM APROV WHERE YEAR(DATAAP)=@AN AND
MONTH(DATAAP)=@LUNA)
INSERT INTO @TABEL
SELECT F.CODFZ, NUMEFZ, SUM(CANTITATE*PRETUNITAR),
SUM(CANTITATE*PRETUNITAR)/@TOTALLUNA
FROM APROV A INNER JOIN FURNIZORI F ON A.CODFZ=F.CODFZ
WHERE YEAR(DATAAP)=@AN AND
MONTH(DATAAP)=@LUNA
GROUP BY F.CODFZ, NUMEFZ
RETURN
END

9.
Utilizati functia intr-o procedura care sa afiseze care sunt furnizorii cu pondere mai mare de 8%
din valoarea totala aprovizionata in ianuarie 2008.
CREATE PROC AF_FZ
SELECT *
FROM DBO.FURNIZORIAPROV (2008,1)
WHERE PONDERE>0.08

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