Sunteți pe pagina 1din 22

CODURI

--Seminar 2 --1) S se afieze tipurile de plata (fiecare tip de plata se va afia o singur dat) select distinct tipplata from plati --2) S se afieze lista cu primele 3 pli ce au suma cea mai mare. select top 3 SumaPlatita from Plati order by SumaPlatita desc --3) S se afieze valoarea produselor de pe bonul cu numrul 9. select sum(cantitate*pretvanzare) from produsevandute where nrboncasa=9 --4) S se afieze bonurile din anul 2012 ce conin produse perisabile. select bonuridecasa.nrboncasa from BonuriDeCasa inner join produsevandute on bonuridecasa.nrboncasa=produsevandute.NrBonCasa inner join produse on produse.idprodus=ProduseVandute.IdProdus where year(dataoraboncasa)=2012 and Perisabil = 1 --5) S se afieze numarul de plai din fiecare tip de plata. select tipplata, count(*) as numar from plati group by tipplata --6) S se afieze bonurile cu valoarea total mai mic de 2000 ordonate n funcie de valoare. select produsevandute.nrboncasa, sum(cantitate*pretvanzare) as Valoare from ProduseVandute inner join BonuriDeCasa on ProduseVandute . NrBonCasa =BonuriDeCasa .NrBonCasa group by ProduseVandute .NrBonCasa having sum(cantitate*pretvanzare)<2000 order by sum(cantitate*pretvanzare) asc --7 S se afieze preurile minime i maxime pentru produsele din categoria cu codul 1 pentru care media preturilor este mai mare de 20. select min(pretvanzare) as Minim, max(pretvanzare) as Maxim, avg(pretvanzare) as Media from ProduseVandute inner join produse on Produsevandute.IdProdus = Produse .idprodus inner join categoriiproduse on CategoriiProduse.CodCategorie =Produse .CodCategorie where produse.CodCategorie =1 group by Produse.CodCategorie having avg(pretvanzare)>20

--8 S se afieze produsele care nu au fost vndute. select idprodus from produse where idprodus not in (select idprodus from produsevandute) --SAU select produse.idprodus, produsevandute.nrboncasa from produse left join produsevandute on produsevandute.idprodus=produse.idprodus where NrBonCasa is null --9 S se afieze produsele care nu au fost vndute in anul 2012. select idprodus from produse where idprodus not in(select idprodus from produsevandute inner join bonuridecasa on ProduseVandute .NrBonCasa =BonuriDeCasa .NrBonCasa where year(dataoraboncasa) =2012)

--Seminar 3 --1 Prin intermediul SQL Manageament Studio sa se creeze tabelul CategorieClient (CodCategorie, Denumire). create table CategorieClient(CodCategorie int primary key, Denumire nvarchar(255)) --2) Prin intermediul SQL Manageament Studio sa se creeze tabelul Client (CodClient, Nume, Adresa, Telefon, CodCategorie). Cmpul CodCategorie va avea valoarea implicita 1. create table Client(CodClient int primary key, Nume nvarchar(100), Adresa nvarchar(255), Telefon char(10), CodCategorie int constraint fk_CodCategorie foreign key (codCategorie) references CategoriiProduse(CodCategorie)) --4 Prin T-SQL sa se creeze tabelul Contract (NrContract, DataContract, DataFinalizare, ValoareContract, TipContract CodClient). Se va aduga la creare restricia potrivit creia valoarea este pozitiva. create table Contract (NrContract int primary key, DataContract date, DataFinalizare date, ValoareContract money constraint chk_valoare check(valoareContract>0), TipContract nvarchar(100), CodClient int constraint Fk_CodClient foreign key (CodClient) references Client(CodClient))

--5 In tabelul Contract sa se adauge (prin T-SQL) cmpul observatii. alter table contract add Observatii Nvarchar(255)

--6 In tabelul Contract sa se adauge (prin T-SQL) restricia privind introducerii unei valori din lista urmtoare (A, B, C) pentru cmpul TipContract. alter table contract add constraint chk_TipContract check (tipcontract in ('a','b','c'))

--Tema seminar 3

--1 Prin T-SQL s se creeze tabelul Gestiune (CodGestiune, DenumireGestiune) Create table Gestiune(CodGestiune int primary key, DenumireGestiune nvarchar(255))

--2 Prin T-SQL s se creeze tabelul BonConsum (NrBonConconsum, DataBonConsum, CodGestiune). create table BonConsum(NrBonConsum int primary key, DataBonConsum date, CodGestiune int constraint FK_CodGestiune foreign key (CodGestiune) references gestiune(codgestiune))

--4 in tabelul Contract sa se adauge (prin T-SQL) restricia privind introducerii unei valori anterioare pentru cmpul DataContract fa de valoarea introdus pentru Datafinalizare. alter table Contract add constraint chk_Data check(datacontract<datafinalizare)

--Seminar 4

--1 S se afieze plile din anul curent, data se va afia n formatul (zi/luna/an). Pentru fiecare plata se va afia numrul de zile trecute de la de la emiterea acesteia pn astzi. select idplata, convert(char(10),DataOraPlata,103) as Data, tipplata, sumaplatita,datediff(day,dataoraplata, getdate()) as NrZile from plati where year(dataoraplata)=2013

--2 S se afieze cu majuscule denumirile produselor. Se va afia pentru fiecare denumire de produs numrul de caractere coninut. Se va afia pentru fiecare produs primele 4 caractere din denumire. select upper(Denumire) as Majuscule, lower(denumire) as Minuscule, len(denumire) as NrCaractere, left(denumire, 4) as _4Caractere from Produse --3 S se realizeze tabelul temporar #TotalPC (Departament nvarchar(100), ValTotalaPrime money) create table #TotalPC(Departament nvarchar(100), ValoareTotalaPrime Money) --4 Sa se adauge in tabelul #TotalPC valorile totale ale primelor colaboratorilor pentru fiecare departament. insert into #totalPC select departament, sum(procentprima) as ValoarePrime from PrimeColaborator inner join colaborator on Colaborator .cod=PrimeColaborator .CodColaborator group by Departament

--5 S se afieze pentru fiecare departament din tabelul #TotalPC valoarea total a primelor, precum i valoarea total rotunjit i trunchiat. (ROUND). select departament, valoaretotalaprime, round(valoaretotalaprime,0) as Rotunjire, round(valoaretotalaprime,0,1) as Trunc from #TotalPC group by Departament,valoaretotalaprime --6 S se calculeze numarul de tipuri de plata. select count(tipplata) from plati --7 S se afieze se afieze numrul de produse pe fiecare categorie. select count(idprodus), DenumireCategorie from produse inner join categoriiproduse on produse.codcategorie=CategoriiProduse .CodCategorie group by DenumireCategorie

--8 S se numeroteze plile n ordine descresctoare a sumelor (ROW_NUMBER), utiliznd funcia RANK s se atribuie un rang plilor n funcie de suma pltit. S se mpart plile n dou grupe n ordine descresctoare a sumelor (NTILE). select idplata, row_number()over(order by sumaplatita desc), rank()over(order by sumaplatita desc), NTILE(2) over(order by sumaplatita desc) from plati

--Tema seminar 4

--1 ) S se afieze colaboratorii (domiciliul se va afia cu majuscule) care si -au nceput activitatea dup anul 1990, data se va afia n formatul (zi/luna/an). Pentru fiecare colaborator se va afia vechimea in ani. select cod, nume, upper(domiciliu), convert(char(10),datainceput,103), datediff(year,datainceput, getdate()) from colaborator where year(datainceput)>1990

--2 ) S se realizeze tabelul temporar #TotalDEP (Departament nvarchar(100), TotalSalarii money) create table #totalDEP(Departament nvarchar(100), TotalSalarii Money)

--3 Sa se adauge in tabelul #TotalDEP salariile totale pentru fiecare departament. insert into #totalDep select departament, sum(salariu) as Salariu from Colaborator group by Departament

--4 S se afieze numrul departamentelor n care lucreaz colaboratorii. select departament, count(departament) from colaborator group by departament

--5 S se numeroteze colaboratorii n ordine descresctoare a salariilor (ROW_NUMBER), utiliznd funcia RANK s se atribuie un rang colaboratorilor n funcie de salariu. S se mpart colaboratorii n dou grupe n ordine descresctoare a salariilor (NTILE). select nume, salariu, ROW_NUMBER () over (order by salariu desc), rank() over (order by salariu desc), ntile(2) over (order by salariu desc) from Colaborator

--Seminar 5

--1 S se adauge toate nregistrrile tabelului colaborator in tabelul Arhivacolaboratori. select * into ArhivaColaboratori from Colaborator

--2 S se tearg toate nregistrrile din tabelul ArhivaColaboratori. delete ArhivaColaboratori --3 ) S se tearg (cu afiare a rezultatului) categoriile de produse al cror cod are 3 caractere. delete CategoriiProduse output deleted.* where len(CodCategorie) =3

--4 S se tearg (cu transfer n tabelul ArhivaColaboratori) colaboratorii al cror cod are 5 caractere si ncepe cu 23. insert into ArhivaColaboratori select * from Colaborator where len(cod)=5 and cod like '23%'

--5 ) Sa se majoreze cu 10 % salariul colaboratorilor ce lucreaza in departamentul Marketing update Colaborator set salariu=salariu*0.10+salariu where departament='Marketing'

--6 Sa se modifice denumirea departamentului Marketing in Marketing & IT si sa

se adauge un an la data de sfarsit a activitatii pentru fiecare colaborator de la departamentul Marketing update Colaborator set DataSfarsit=DATEADD(year,1,datasfarsit), departament = 'Marketing & IT' where departament ='Marketing'

--7 ) S se realizeze un declanator (TRIGGER) care s nu permit adugarea unui colaborator al crui cod nu are trei caractere. create trigger S5_7 on Colaborator for insert as if exists(select * from inserted where len(cod)<>3) begin raiserror ('NU',1,1) rollback end

--8 ) S se realizeze un declanator (TRIGGER) care s nu permit tergerea colaboratorilor nscui n anul 1982. create trigger S5_8 on colaborator for delete as if exists(select * from deleted where year(data_nasterii)=1982) begin raiserror ('NU', 1,1) rollback end --9 S se realizeze un declanator (TRIGGER) care s nu permit modificarea salariului la o valoare mai mic. create trigger S5_9 on Colaborator for update as if exists (select * from inserted inner join deleted on inserted.cod=deleted.cod where inserted.salariu<deleted.salariu) begin raiserror ('NU',1,1) rollback end --Tema seminar 5

--1 S se realizeze un declanator (TRIGGER) care s adauge n tabela ArhivaColaborator toi colabratorii teri din tabela Colabo rator. create trigger T5_1 on colaborator for delete as insert into arhivacolaboratori select * from deleted

--2 S se realizeze un declanator (TRIGGER) care s permit modificarea pretului unui produs vandut doar cu o valoare mai mare. create trigger T5_2 on produsevandute for update as if exists(select * from deleted inner join inserted on inserted.idprodus=deleted.idprodus where inserted.pretvanzare<deleted.pretvanzare) begin raiserror ('NU',1,1) rollback end

--3 S se tearg (cu afiare a rezultatului) colaboratorii cu vrsta mai mare de 50 ani. delete colaborator output deleted.*into arhivacolaboratori where datediff(year,data_nasterii,getdate())>50

--4 Sa se majoreze cu 25 % salariul colaboratorilor ce lucreaza in departamentul Contabilitate update colaborator set salariu=salariu*1.25 where departament='contabilitate'

--5 Sa se modifice denumirea orasului (domiciliu) din Bucuresti in Bucureti si sa se adauge trei luni la data de sfarsit a activitatii pentru fiecare colaborator din Bucuresti update colaborator set datasfarsit=dateadd(month,3,DataSfarsit), domiciliu='Bucureshti' where domiciliu='Bucuresti' --seminar 6 --1 Pentru fiecare produs vndut se va acorda un numr de puncte de fidelitate n funcie de valoarea acestuia astfel:

Altfel se acord 0 puncte. select idprodus, sum(cantitate*pretvanzare) as Valoare, case when sum(cantitate*pretvanzare)>150 then 5 when sum(cantitate*pretvanzare) between 120 and 150 then 3 else 0 end as Nrpuncte from produsevandute group by idprodus --2 S se creeze prin T-SQL un VIEW (S6_2) care s afieze lista colaboratorilor al cror nume conine Ion create view S6_2 as

select * from colaborator where nume='%ion%' --3 S se creeze un VIEW (S6_3) care s afieze colaboratorii ce lucreaz n departamentul Contabilitate. Lista se va ordona descrescator n funcie de salariu i alfabetic n funcie de numele colaboratorului. create view S6_3 as select top (100) percent * from colaborator where departament='Contabilitate' order by salariu desc, nume asc

--4 S se creeze un VIEW (S6_4) care sa afieze vechimea fiecrui colaborator. Se va ordona lista descresctor n funcie de vechime. create view S6_4 as select top (100) percent cod, nume, datediff(year,datainceput, getdate()) as vechime from colaborator order by datediff(year,datainceput, getdate()) desc

--5 S se adauge n obiectul de tip VIEW S6_4 o coloan spor vechime calculat astfel: re de 10 ani 10%

create view S6_5 as select top (100) percent cod, nume, datediff(year,datainceput, getdate()) as vechime, case when datediff(year,datainceput, getdate()) >10 then 0.10 when datediff(year,datainceput, getdate()) between 5 and 10 then 0.05 else 0 end as ProcentVechime from colaborator order by datediff(year,datainceput, getdate()) desc

--6 S se creeze un VIEW (S6_6) care s afiseze vrsta medie a colaboratorilor din departamentul Contabilitate create view S6_6 as select avg(datediff(year,data_nasterii, getdate())) as VarstaMedie from Colaborator where departament='Contabiliate'

--7 S se creeze un VIEW (S6_7) care s se afiseze departamentele cu mai mult de 5 colaboratori cu salarii peste 500. create view S6_7

as select departament, count(cod) as NrColaboratori, salariu from colaborator where salariu>=500 group by departament, salariu having count(cod)>=5 and sum(salariu)>=500 select * from s6_7 --tema seminar 6

--1 S se creeze prin T-SQL un VIEW (ST6_1) care s afiseze lista departamentelor n care lucreaz colaboratorii (fiecare departament se va afia o singur dat). create view T6_1 as select distinct departament from colaborator

--2 . S se creeze un VIEW (ST6_2) care s afieze valoarea n euro (1 euro=4,5 lei) a salariului fiecrui angajat. create view T6_2 as select nume, salariu/4.5 as SalariuEuro from colaborator

--3 S se creeze un VIEW (ST6_3) care sa afieze colaboratorii din localiti ce ncep cu litera B i care au o vechime mai mare de 3 ani. create view T6_3 as select nume, domiciliu, datediff(year,datainceput, getdate()) as Vechime from colaborator where domiciliu like 'B%' group by nume, datainceput, domiciliu having datediff(year,datainceput, getdate())>3

--4 S se creeze un VIEW (ST6_4) care sa afieze suma total a salariilor pe fiecare departament. Lista se va odona n funcie de suma total descresctor. create view T6_4 as select top (100) percent departament, sum(salariu) as sumatotala from colaborator group by departament order by sum(salariu) desc

--5 S se creeze un VIEW (ST6_5) care s afiseze vrsta medie a colaboratorilor nscui dup anul 1970 pe fiecare departamant. Lista se va afia ordonat n funcie de media salariului i denumirea departamentului.

create view T6_5 as select top (100) percent departament, avg(datediff(year,data_nasterii,getdate())) as MedieVarsta from Colaborator where year( data_nasterii)>1970 group by departament order by sum(salariu) asc, Departament asc

--6 S se creeze un VIEW (ST6_6) care s afieze colaboratorii cu salariul mai mare de 500. Lista se va ordona descrescator n funcie de salariu i alfabetic create view T6_6 as select top (100) percent nume, salariu from Colaborator where salariu>500 order by salariu desc, nume asc

--seminar 7

--1 S se afieze colaboratorii pentru care salariul este mai mare dect salariul mediu. (Subinterogare) select * from Colaborator where salariu>(select avg(salariu) from Colaborator )

--2 S se afieze colaboratorii pentru care salariul este mai mare dect salariul mediu. (Se va declara o variabil prin intermediul creia se va calcula salariul mediu) declare @salariu money set @salariu= (select avg(salariu) from colaborator) select * from Colaborator where salariu>@salariu

--3 in cazul n care numrul total al colaboratorilor este mai mare decat 100 se va afia lista primilor 5 colaboratori cu cele mai mari salarii, altfel se vor afia primii 3 colaboratori cu cele mai mari salarii (IF). declare @nr int set @nr=(select count(cod) from Colaborator) if @nr>100 begin select top 5 * from Colaborator order by salariu desc end else begin select top 3 * from Colaborator order by salariu desc end

--4 S se dubleze salariile tuturor colaboratorilor atta timp ct media salariilor nu depete 3000 (WHILE). while (select avg(salariu) from Colaborator) >3000

begin salariu*2 end

select avg(salariu) from colaborator update colaborator set salariu =

--5 S se afieze colaboratorii cu o ntarziere de 5 secunde (WAITFOR) waitfor delay '00:00:05'select* from Colaborator

--6 Sa se realizeze o procedura stocata ce afiseaza valoarea fiecarui produs vandut ulterior unei date ce se introduce ca parametru, denumirea produsului se va introduce ca parametru.

create procedure P7_6 @data date, @denumire nvarchar(255) as select produse.idprodus, denumire, cantitate* pretvanzare as Valoare from produse inner join produsevandute on Produse.IdProdus =ProduseVandute.IdProdus inner join BonuriDeCasa on BonuriDeCasa .NrBonCasa =ProduseVandute .NrBonCasa where denumire=@denumire and DataOraBonCasa >@data

exec P7_6 '01.01.2011','sirop'

--7 Sa se realizeze o procedura stocata ce afiseaza valoarea totala a bonurilor de casa, pe zile, pentru un an introdus ca parametru. create procedure S7_7 @an int as select distinct day(dataoraboncasa) as Zi, month(dataoraboncasa) as Luna, sum(cantitate*pretvanzare) as Valoare from ProduseVandute inner join BonuriDeCasa on ProduseVandute .NrBonCasa = BonuriDeCasa . NrBonCasa where year(dataoraboncasa)=@an group by dataoraboncasa exec S7_7 '2012'

--8 Sa se realizeze o procedura stocata ce afiseaza toate platile dintr-un anumit tip introdus ca parametru. Procedura va contine un parametru de tip OUTPUT care va returna media sumelor platite pentru tipul de plata introdus ca parametru de tip INPUT. create procedure S7_8 @tip nvarchar(225), @ceva money output as select * from plati

where TipPlata =@tip select @ceva=avg(sumaplatita) from plati where tipplata=@tip declare @ceva money exec S7_8 'card',@ceva output select @ceva

--tema seminar 7

--1 Sa se realizeze o procedura stocata ce permite afisarea valorii totale pentru fiecare produs (IdProdus, Denumire) create procedure T7_1_1 as select produse.idprodus, denumire , sum(cantitate *pretvanzare) as Valoare from produse inner join ProduseVandute on Produse.IdProdus =ProduseVandute .IdProdus group by produse.idprodus, denumire

exec T7_1_1

--2 . Sa se realizeze o procedura stocata ce permite afisarea valorii totale a unui produs al b carui cod se va introduce ca parametru. create procedure T7_2_1 @cod int as select produse.idprodus, denumire , sum(cantitate *pretvanzare) as Valoare from produse inner join ProduseVandute on Produse.IdProdus =ProduseVandute .IdProdus where produse.IdProdus =@cod group by produse.idprodus, denumire exec T7_2_1 '8'

--3 n cazul n care suma totala a bonurilor de casa din anul 2012 este mai mare decat 2000 se va afia lista primelor 5 bonuri din anul 2012, altfel se vor afisa primele 3 bonuri din anul 2012 (IF). declare @variabla money set @variabla =(select sum(cantitate*pretvanzare) from produsevandute inner join BonuriDeCasa on ProduseVandute .NrBonCasa =BonuriDeCasa .NrBonCasa where year(dataoraboncasa)=2012) if @variabila>2000 begin select top 5 * from bonuridecasa where year(dataoraboncasa)=2012 order by dataoraboncasa end else begin select top 3 * from bonuridecasa where year(dataoraboncasa)=2012

order by dataoraboncasa end

--4 . Sa se realizeze o procedura stocata ce afiseaza valorile toatale ale bonurilor dintr-un anumit an ce se va introduce ca parametru. Procedura va contine un parametru de tip OUTPUT care va returna valoarea totala a bonurilor din anul introdus ca parametru de tip INPUT. create procedure T7_3 @an int, @suma money output as select @suma = Sum(cantitate*pretvanzare) from produsevandute inner join BonuriDeCasa on ProduseVandute .NrBonCasa =BonuriDeCasa .NrBonCasa where @an=2012 declare @suma money exec T7_3 '2012', @suma output select @suma

--seminar 9

--1 S se a. Pentru b. Pentru c. Altfel

realizeze o funcie scalar ce retuneaz sporul de vechime asfel: vechime mai mare de 10 ani 10% vechime nte 5 si 10 ani 5% sporul de vechime este este 0%.

create function S9_1(@vechime as int) returns money as begin return (select case when @vechime>10 then 0.10 when @vechime between 5 and 10 then 0.05 else 0 end) end -- 2) S se folosesc aceast funcie n cadrul unui obiect de tip view i a unei proceduri stocate. create procedure asd as select nume, datediff(year,datainceput, getdate()) as vechime, dbo.s9_1(datediff(year,datainceput, getdate())) from Colaborator exec asd create view sdf as select nume, datediff(year,datainceput, getdate()) as vechime, dbo.s9_1(datediff(year,datainceput, getdate())) as Spor from Colaborator select * from sdf

--3 S se realizeze o funcie tabelar inline ce returneaz colaboratori cu salarii mai mari decat o valoare introdusa ca parametru.

create function s9_3(@salariu money) returns table as return select * from Colaborator where salariu>@salariu select * from S9_3(1200)

--4 S se realizeze o funcie tabelar multiinstructiune ce returneaz primii 3 colaboratori cu cele mai mari salarii. create function S9_4() returns @tabel table(nume nvarchar (200),salariu money) as begin insert into @tabel select top 3 nume,salariu from Colaborator order by salariu desc return end select * from S9_4()

--tema seminar 9

--1 S se realizeze o funcie tabelar cu parametrii care returneaz lista departamentelor i 50% din salariul fiecrui colaborator pentru o anumit perioad introdusa prin parametrii. create function T9_1( @datainceput date, @datasfarsit date) returns table as return(select departament, salariu/2 as Jumate from Colaborator where DataInceput between @datainceput and @datasfarsit) -- 2) S se folosesc aceast funcie n cadrul unei proceduri stocate care va afia valoarea total a salariilor reduse cu 50% pe fiecare departament pentru o anumit perioad precizat ca parametru. create procedure T9_2 as select departament, sum(jumate) as Total from dbo.t9_1('09/01/2012','15/10/2012') group by departament exec T9_2

--seminar 10

--1 S se afieze prin intermediul unei variabile toate numele col aboratorilor din departamentul Contabilitate. Se va parcurge tabelul Colaborator cu ajutorul unui cursor i se vor concatena numele prin intermediul unei variabile. declare @nume nvarchar(100) declare @text nvarchar(max) declare S10_1 cursor for select nume from Colaborator where departament='contabilitate'

open S10_1 fetch next from S10_1 into @nume set @text=@nume while @@FETCH_STATUS =0 begin fetch next from S10_1 into @nume set @text=@text+','+@nume end close S10_1 deallocate S10_1 select @text --2 Se vor parcurge cronologic bonurile de cas (data bon, valoare total) cu ajutorul unui cursor i se va determina la ce dat s-a atins plafonul de 5000 de RON valoare total. declare @suma money declare @data date declare @total money declare S10_2 cursor for select Sum(cantitate*pretvanzare) as SUMA, dataoraboncasa from BonuriDeCasa inner join ProduseVandute on BonuriDeCasa.NrBonCasa=ProduseVandute.NrBonCasa group by DataOraBonCasa order by dataoraboncasa open S10_2 fetch next from S10_2 into @suma, @data set @total=@suma while @@FETCH_STATUS =0 begin if @total>5000 break fetch next from s10_2 into @suma, @data set @total=@total+@suma end close S10_2 deallocate s10_2 select @suma, @data

--3 S se realizeze o procedur stocat care prin intermediul unui cursor s determine la ce dat s-a atins plafonul de 1000 de RON valoare total prime pentru un an introdus ca parametru. create procedure T10_3 @an int as declare @prima money declare @data date declare @total money declare T10_2 cursor for select dataprima, sum(procentprima*salariu) from PrimeColaborator inner join Colaborator on PrimeColaborator.codcolaborator=Colaborator.cod where year(dataprima)=2000 group by dataprima order by dataprima open t10_2 fetch next from t10_2 into @data, @prima set @prima=@total while @@FETCH_STATUS=0 begin if @total>1000 break

fetch next from t10_2 into @data,@prima set @total=@total+@prima end close t10_2 deallocate t10_2 select @data,@total exec t10_3 2000

--recapitulare

--1 S se adauge n baza de date tabelul Promotie avnd structura: IdPromotie cheie primar numr ntreg, DataInceput, DataSfarsit, DenumirePromotie, ProcentReducere. create table Promotie(IdPromotie Int primary key, DataInceput Date, DataSfarsit Date, DenumirePromotie nvarchar(100), ProcentReducere money) --2 S se adauge n baza de date tabelul ProdusePromotie avnd structura: IdPromotie, IdProdus, cheia primar este compusa din IdPromotie, IdProdus. create table ProdusePromotie(IdPromotie int, Idprodus int, constraint pk_produsepromotie primary key(idpromotie, idprodus))

--3 S se realizeze legtura dintre tabelul ProdusePromotie i tabelul Produse. alter table ProdusePromotie ADD constraint fk_idprodus foreign key(idprodus) references produse(idprodus)

--4 S se realizeze legtura dintre tabelul ProdusePromotie i tabelul Promotie. alter table ProdusePromotie ADD constraint Fk_idpromotie foreign key (idpromotie) references Promotie(idpromotie)

--5 S se adauge restricia ca DataInceput promotie s fie anterioar DataSfarsit promotie. Alter table Promotie add constraint Cdata Check (datainceput<datasfarsit)

--6 Sa se realizeze un declansator (trigger) care sa nu permita adaugarea unui produs in mai mult de 3 promotii. create trigger s12_6 on produsepromotie for insert, update as if exists (select count (*), inserted.idprodus from inserted inner join produsepromotie on inserted.idprodus=produsepromotie.idprodus group by inserted.idprodus

having count(*)>3) begin raiserror('un produs nu poate fi adaugat decat in 3 promotii',11,1) rollback end

--7 Sa se realizeze un declansator (trigger) care sa nu permita stergerea produselor din promotiile care au expirat. create trigger s12_7 on produsepromotie for delete as if exists (select * from deleted inner join promotie on deleted.idpromotie=promotie.idpromotie where datasfarsit<getdate()) begin raiserror ('nu se pot sterge produsele unei promotii care a expirat',11,1) rollback end --8 S se realizeze un obiect de tip view care sa afiseze cronologic lista bonurilor de casa cu sume totale mai mari de 100 i s se afieze vechimea acestora n ani. create view s12_8 as select top(100) percent bonuridecasa.nrboncasa, dataoraboncasa, sum(cantitate*pretvanzare) as SumaTotala, datediff(year,dataoraboncasa,getdate()) as vechime from bonuridecasa inner join produsevandute on bonuridecasa.nrboncasa=produsevandute.nrboncasa group by bonuridecasa.nrboncasa, dataoraboncasa,datediff(year,dataoraboncasa,getdate()) having sum(cantitate*pretvanzare)>100 order by dataoraboncasa select * from S12_8 --!!!folosirea lui order by ne obliga sa folosim top(100)percent --!!!toate campurile din select vor avea eticheta

--9 S se realizeze o procedur stocat cu parametru care s afieze produsele pentru care valoarea total din anul 2012 este mai mare dect parametrul. create procedure S12_9 @valoare money as select sum(cantitate*pretvanzare) as valoare, idprodus from bonuridecasa inner join produsevandute on bonuridecasa.nrboncasa=produsevandute.nrboncasa where year(dataoraboncasa)=2012 group by idprodus having sum(cantitate*pretvanzare)>=@valoare

--10 S se realizeze o procedur stocat cu parametru de iesire care s afieze valoarea totala a vanzarilor pentru un vanzator al carui cod se introduce ca parametru. Sa se execute aceasta procedura in cadrul altei proceduri stocate. create procedure S12_10

@marcavanzator as int, @valoare money output as set @valoare=( select sum(cantitate*pretvanzare) as valoare from bonuridecasa inner join produsevandute on bonuridecasa.nrboncasa=produsevandute.nrboncasa where marcavanzator=@marcavanzator) --executie procedura declare @val money exec S12_10 16211, @val output select @val --executie procedura create procedure s12_10_verificare as declare @val money exec s12_10 16211, @val output select @val --executie procedura verificare exec s12_10_verificare --11 . S se realizeze o procedura stocat ce se afieze suma total a salariilor pentru colaboratorii cu domiciliu in anumite orase ce se vor introduce ca parametru de tip tabel. create type tblOrase as table(denumire nvarchar(100))

create procedure s12_11 @tblO tblorase readonly as select nume, sum(salariu) as saltotal from colaborator where domiciliu in (select denumire from @tblO) group by nume --executie procedura declare @tbl tblorase insert into @tbl values('Bucuresti'),('Pitesti') exec s12_11 @tbl --12 . S se realizeze o functie tabelara care s afieze tipurile de plati pentru care s-au realizat mai mult de 8 plati. Sa se apeleze aceasta functie in cadrul unei proceduri stocate. create function S12_12() returns @tabel table (TipPlata nvarchar (100)) as begin insert into @tabel select tipplata from plati group by tipplata having count(idplata)>=8 return end

--apelare select * from dbo.S12_12() --apelare prin procedura create procedure s12_12pr as select * from dbo.S12_12() --executie procedura exec s12_12pr --13 Sa se realizeze o functie scalara care sa returneze un sir de caractere ce contine denumirile concatenate ale produselor vandute in anul 2012. Sa se apeleze aceasta functie in cadrul unei proceduri stocate. create function S12_13() returns nvarchar (max) as begin declare @Denumire nvarchar(100) declare @rezultat nvarchar(max) declare S12_13_c cursor for select distinct denumire from produse inner join produsevandute on produsevandute.idprodus=produse.idprodus inner join bonuridecasa on bonuridecasa.nrboncasa=produsevandute.nrboncasa where year(dataoraboncasa)=2012 open S12_13_c fetch next from s12_13_c into @denumire set @rezultat=@denumire while @@fetch_status =0 begin fetch next from S12_13_c into @denumire set @rezultat=@rezultat +', '+@denumire end close S12_13_c deallocate S12_13_c return (@rezultat) end select dbo.S12_13()

--tema recapitulare

--2 S se adauge restricia ca procentul reducerii promotiei sa fie cuprins intre 0.10 si 0.45. alter table promotie add constraint chk_ProcentReducere check (procentReducere between 0.10 and 0.45 )

--3 Sa se realizeze un declansator (trigger) care sa nu permita modificarea procentului reducerii unei promotii cu o valoare mai mare. create trigger T12_3 on promotie for update as if exists ( select * from inserted inner join deleted on inserted.idpromotie=deleted.idpromotie where inserted.ProcentReducere>deleted.ProcentReducere) begin raiserror ('NU!', 1,1) rollback transaction end --4 S se realizeze un obiect de tip view care sa afiseze colaboratorii ordonati in functie de varsta. create view T12_4 as select top (100) percent Cod, nume, datediff(year, datainceput,datasfarsit) as Vechime from colaborator order by datediff(year, datainceput,datasfarsit) asc select * from T12_4 order by vechime asc --5 Sa se realizeze o functie scalara care sa retuneze valoarea deducerii personale de baza astfel:

create function T12_5 (@nrPersIntr as int) returns int as begin return (select case when @nrPersIntr=0 then 250 when @nrPersIntr=1 then 350 when @nrPersIntr=2 then 450 else 550 end) end

--6 Sa se apleze functia scalara in cadrul unei proceduri stocate ce va afisa salariul si deducerea personala pentru fiecare colaborator. create procedure T12_6 as select salariu, dbo.T12_5(NrPersIntr) from colaborator exec t12_6 --7 Sa se realizeze o functie tabelara care returneaza categoriile de produse pentru care numarul de produse perisabile este mai mare decat o valore introdusa ca parametru. create function T12_7 ( @Perisabil as int) returns table as return (select DenumireCategorie, count(perisabil) as NrPerisabile

from categoriiproduse inner join produse on categoriiproduse.codcategorie=Produse.codcategorie where perisabil=1 group by DenumireCategorie having count(perisabil)>=@perisabil)

--8 Sa se apleze functia tabelara definita anterior in cadrul unei proceduri stocate. create procedure T12_8 as select * from T12_7(5) exec t12_8 --9 S se realizeze o procedura stocat ce afiez colaboratorii care nu au prime. create procedure T12_9 as select cod, nume from colaborator inner join primecolaborator on primecolaborator.codcolaborator=colaborator.cod where procentprima=0 exec t12_9

--recapitulare alta --7 S se realizeze o funcie tabelar, cu paramatru, ce afieaz numrul de bonuri de cas pentru fiecare lun a unui an ce se introduce ca parametru. Se va utiliza funcia n cadrul unei proceduri stocate. create function R_7(@an int) returns @tabel table(luna nvarchar(20), numarul int) as begin insert into @tabel select month(dataoraboncasa), Count(*) from bonuridecasa where year(dataoraboncasa)=@an group by month(dataoraboncasa) return end --apelare functie select * from dbo.R_7(2013) --apelare procedura create procedure R_7_pr as select * from dbo.R_7(2012) --executare procedura exec r_7_pr --SAU Create procedure R_7_pr2 @an int as

select * from dbo.R_7(@an) exec dbo.R_7_pr2 2012

--6 S se realizeze o procedur stocat ce afieaz clasamentul (n funcie de valoarea total) produselor vndute pentru care media preturilor este mai mica de 12. create procedure R_6 as select idprodus, Sum(cantitate * pretvanzare) as valoare, rank() over (order by Sum(cantitate*pretvanzare) desc) as Rang from ProduseVandute group by idprodus having avg(pretvanzare)<12 exec R_6

--5 S se realizeze un obiect de tip view care s afieze primele trei produse perisabile cu cea mai mare valoare total. create view R_5 as select top 3 produse.idprodus, sum(cantitate*pretvanzare) as ValoareTotala from produse inner join produsevandute on produse.idprodus=produsevandute.idprodus where perisabil=1 group by produse.idprodus order by sum(cantitate*pretvanzare) desc

--afisare view select * from R_5

--cerinta 1 S se realizeze tabelele urmtoare: FURNIZOR (CodFurnizor, DenumireFurnizor) FACTURA (IdFactura,NrSerieFactura, DataFactura,DataLivrare, CodFurnizor) create table Furnizor (CodFurnizor int primary key, denumireFurnizor nvarchar(100)) create table Factura(IdFactura int primary key, NrSerieFactura int, DataFactura Date, DataLivrare date, CodFurnizor int) alter table Factura add constraint fk_codfurnizor foreign key references Furnizor(codFurnizor)

--4 S se realizeze un declansator (trigger) care s nu permit adugarea unei facturi anterioare anului 2010. create trigger VerificareFactura on factura for insert as if exists(select * from inserted where year(datafactura)<2010) begin raiserror ('NU!', 11,1) rollback end

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