Advertisement
thisissoeasy

sqlhack

Dec 3rd, 2021 (edited)
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 21.01 KB | None | 0 0
  1. --I1
  2. /*1. Napišite upit kojim ćete vratiti 2 stupca: naziv proizvoda
  3. i prodanu količinu proizvoda, kupcima iz Hrvatske koja telefon
  4. započinje znamenkama 1, 3 ili 5, sortirati padajuće po količini prodanih*/
  5.  
  6. select
  7.     p.Naziv as 'Naziv proizvoda',
  8.     sum(s.Kolicina) as 'Prodana količina'
  9. from Proizvod as p
  10. inner join Stavka as s on s.ProizvodID = p.IDProizvod
  11. inner join Racun as r on s.RacunID = r.IDRacun
  12. inner join Kupac as k on r.KupacID = k.IDKupac
  13. inner join Grad as g on k.GradID = g.IDGrad
  14. inner join Drzava as d on g.DrzavaID = d.IDDrzava
  15. where d.Naziv LIKE 'Hrvatska'
  16.     and k.Telefon LIKE '[135]%'
  17. group by p.Naziv
  18. order by [Prodana količina] desc
  19.  
  20. /*2.Napišite upite kojima ćete umetnuti kupca Đuru Đurića iz Yokohame (Japan)*/
  21.  
  22. declare @idDrzave int
  23. declare @idGrada int
  24.  
  25. insert into Drzava (Naziv)
  26. values('Japan')
  27. set @idDrzave = SCOPE_IDENTITY()
  28.  
  29. insert into Grad (Naziv, DrzavaID)
  30. values ('Yokohama', @idDrzave)
  31. set @idGrada = SCOPE_IDENTITY()
  32.  
  33. insert into Kupac (Ime, Prezime, GradID)
  34. values('Đuro', 'Đurić', @idGrada)
  35.  
  36. /*3.Napiši naredbu za izradu nove tablice NajmanjeProdavaniProizvodi s obaveznim stupcima IDProizvod, Naziv,  
  37. ProdanihKomada (bez primarnog ključa). Napišite upit koji uzima proizvode koji su prodani u količini manji od 10 (sum(stavka.Kolicina))
  38. i njihove ID-eve, Naziv i ProdanihKomada upisuje u NajmanjeProdavaniProizvodi.*/
  39.  
  40. create Table NajmanjeProdavaniProizvodi (
  41.     IDProizvod int not null,
  42.     Naziv nvarchar(50) not null,
  43.     ProdanihKomada tinyint not null
  44. )
  45.  
  46. insert into NajmanjeProdavaniProizvodi (IDProizvod, Naziv, ProdanihKomada)
  47. select  p.IDProizvod,
  48.         p.Naziv,
  49.         isnull((select sum(Kolicina) from Stavka where ProizvodID = p.IDProizvod),0)
  50. from Proizvod as p
  51. where (select sum(Kolicina) from Stavka where ProizvodID = p.IDProizvod) < 10
  52. or (select sum(Kolicina) from Stavka where ProizvodID = p.IDProizvod) IS NULL
  53.  
  54. /*4. DDL naredbe za kreiranje tablica, stupaca i ograničenja*/
  55.  
  56. create table Student (
  57.     IDStudent int identity,
  58.     Ime nvarchar(50) not null,
  59.     Prezime nvarchar(50) not null,
  60.     DatumRodjenja date not null,
  61.     JMBAG nvarchar(15) not null,
  62.     CijenaSkolarine money not null,
  63.     RedovniStudent bit not null,
  64.     constraint PK_Student primary key(IDStudent),
  65.     constraint UQ_Student unique(JMBAG)
  66. )
  67.  
  68. create table Kolegij (
  69.     IDKolegij int identity,
  70.     Naziv nvarchar(50) not null,
  71.     Ects tinyint not null,
  72.     constraint PK_Kolegij primary key(IDKolegij),
  73.     constraint CH_Kolegij check(Ects between 1 and 7)
  74. )
  75.  
  76. create table Upis (
  77.     IDUpis int identity,
  78.     StudentID int not null,
  79.     KolegijID int not null,
  80.     DatumUpisa date not null default getdate(),
  81.     constraint PK_Upis primary key(IDUpis),
  82.     constraint FK_UpisStudent foreign key(StudentID) references Student(IDStudent),
  83.     constraint FK_UpisKolegij foreign key(KolegijID) references Kolegij(IDKolegij)
  84. )
  85.  
  86. /*Napišite upit kojim ćete ispisati ID-eve
  87. kreditnih kartica i koliko puta je korištena, ali
  88. samo račune iz 2001. godine. Sortirati rastuće
  89. prema tome koliko puta je korištena. N
  90. korištenja kreditne kartice znači da je za nju
  91. izdano N računa. */
  92.  
  93. select kk.IDKreditnaKartica, COUNT(r.KreditnaKarticaID) as PutaKoristena from KreditnaKartica as kk
  94. inner join Racun as r on r.KreditnaKarticaID = kk.IDKreditnaKartica
  95. where r.DatumIzdavanja like '%2001%'
  96. group by kk.IDKreditnaKartica
  97. order by 2 asc
  98.  
  99. /*Predložite relacijski model koji rješava
  100. sljedeći problem te ga implementirajte: treba
  101. omogućiti čuvanje podataka o proizvođačima
  102. automobila (BMW, Hyundai, Audi, …) te o
  103. njihovim modelima (BMW 3, BMW i8,
  104. Hyundai i40, Audi Q3, Audi Q5, …). Dodatno,
  105. svaki model automobila se može proizvoditi s
  106. više različitih (unaprijed definiranih)
  107. obujmova motora: 1.1, 1.3, 1.5, 2.0, … */
  108.  
  109. create table Automobil
  110. (
  111.     IDAtuo int primary key identity,
  112.     ProizvodacID int foreign key references Proizvodac(IDProizvodac),
  113.     ModelID int foreign key references Model(IDModel),
  114. )
  115.  
  116. create table Proizvodac
  117. (
  118.     IDProizvodac int primary key identity,
  119.     Naziv nvarchar(255)
  120. )
  121.  
  122. create table Model
  123. (
  124.     IDModel int primary key identity,
  125.     Naziv nvarchar(255),
  126.     ObujamMotoraID int foreign key references ObujamMotora(IDObujamMotora),
  127. )
  128.  
  129. create table ObujamMotora
  130. (
  131.     IDObujamMotora int primary key identity,
  132.     Naziv nvarchar(255)
  133. )
  134.  
  135. --Drop postojećeg retka u tablici
  136. alter table Film
  137. drop COLUMN TrajanjeMinuta
  138.  
  139. --Dohvatite imena i prezimena 5 najboljih komercijalista, te uz svakog dohvatite i iznos prodane robe.
  140.  
  141. select top 5 k.Ime, k.Prezime,
  142. (
  143.     select SUM(s.UkupnaCijena) from Stavka as s
  144.     where s.RacunID in
  145.     (
  146.     select r.IDRacun from Racun as r
  147.     where r.KomercijalistID = k.IDKomercijalist
  148.     )
  149. ) as  IznosProdaneRobe
  150. from Komercijalist as k
  151. order by 3 desc
  152.  
  153. --I2
  154. /*5. Pogled koji vraća sve komercijaliste sa bar jednom prodajom.
  155. Iskoristit pogled za stupce: ime, prezime, godinu izdavanja te koliko računa te godine pojedini komercijalist realizirao po godinama*/
  156.  
  157. create view vwKomercijalist
  158. as
  159. select * from Komercijalist as k
  160. inner join Racun as r on r.KomercijalistID = k.IDKomercijalist
  161.  
  162. drop view vwKomercijalist
  163.  
  164. select * from vwKomercijalist
  165.  
  166. select Prezime + ' ' + Ime as Komercijalist, year(DatumIzdavanja) as GodinaIzdavanja, count(*) as UkupnoRacuna
  167. from vwKomercijalist
  168. group by Prezime + ' ' + Ime, year(DatumIzdavanja)
  169.  
  170. drop view vwKomercijalist
  171.  
  172. /*6. Pogled koji vraća države sa najmanje 3 grada.
  173. Promijeniti pogled tako da vraća i točan broj gradova.*/
  174.  
  175. create view vwDrzava
  176. as
  177. select * from Drzava
  178. where (select count(*) from Grad where DrzavaID = IDDrzava) >= 3
  179.  
  180. alter view vwDrzava
  181. as
  182. select *, (select count(*) from Grad where DrzavaID = IDDrzava) as BrojGradova from Drzava
  183. where (select count(*) from Grad where DrzavaID = IDDrzava) >= 3
  184.  
  185. /*7.Pogled vraća sve proizvode koji imaju definiranu boju
  186. Sprječiti da se ubaci nešto što kroz pogled neće biti dohvatljivo*/
  187.  
  188. create view vwProizvod
  189. as
  190. select * from Proizvod
  191. where Boja IS NOT NULL
  192.  
  193. select * from vwProizvod
  194.  
  195. alter view vwProizvod
  196. as
  197. select * from Proizvod
  198. where Boja IS NOT NULL
  199. with check option
  200.  
  201. /*8. Pogled koji dohvaća godinu i mjesec te koliko MasterCard kartica istječe tad
  202. Iskoristiti pogled za 10 mjeseci sa najviše kartica koje istječu
  203. Sprječiti da netko može potrgat pogled brisanjem tablice KreditnaKartica*/
  204.  
  205. create view vwKreditnaKartica
  206. as
  207. select
  208.     cast(IstekGodina as nvarchar(4)) + '-' + cast(IstekMjesec as nvarchar(2)) as DatumIsteka,
  209.     count(*) as KolicinaKartica
  210. from KreditnaKartica
  211. where Tip = 'MasterCard'
  212. group by cast(IstekGodina as nvarchar(4)) + '-' + cast(IstekMjesec as nvarchar(2))
  213.  
  214. select top 10 *
  215. from vwKreditnaKartica
  216. order by KolicinaKartica desc
  217.  
  218. alter view vwKreditnaKartica
  219. with schemabinding
  220. as
  221. select
  222.     cast(IstekGodina as nvarchar(4)) + '-' + cast(IstekMjesec as nvarchar(2)) as DatumIsteka,
  223.     count(*) as KolicinaKartica
  224. from dbo.KreditnaKartica
  225. where Tip = 'MasterCard'
  226. group by cast(IstekGodina as nvarchar(4)) + '-' + cast(IstekMjesec as nvarchar(2))
  227.  
  228. /*Napravite pogled koji će se koristiti za dohvat
  229. svih računa kojima su kupci iz Njemačke.
  230. Prikažite koliko je računa izdano po kojem
  231. nazivu grada korištenjem tog pogleda. */
  232.  
  233. create view vwRacun
  234. as
  235. select distinct g.Naziv, COUNT(r.IDRacun) as BrojRacuna from Racun as r
  236. inner join Kupac as k on k.IDKupac=r.KupacID
  237. inner join Grad as g on g.IDGrad=k.GradID
  238. where g.DrzavaID = 2
  239. group by g.Naziv
  240.  
  241. select * from vwRacun
  242. drop view vwRacun
  243.  
  244. /*Napravite pogled koji vraća ID-eve svih
  245. komercijalista te ID-eve svih izdanih računa.
  246. Pri tome omogućite da pogled ostane
  247. zaštićen od svih naknadnih promjena tablica
  248. o kojima ovisi.*/
  249.  
  250. create view vwKomercijalist
  251. WITH SCHEMABINDING
  252. as
  253. select Komercijalist.IDKomercijalist,Racun.IDRacun from dbo.Komercijalist
  254. inner join dbo.Racun on Racun.KomercijalistID=Komercijalist.IDKomercijalist
  255.  
  256. select * from vwKomercijalist
  257.  
  258. /*Napravite pogled koji dohvaća 10 proizvoda koji su najviše prodavani. Stupci koje pogled vraća neka budu ID i
  259. naziv te ukupna količina prodanih proizvoda.*/
  260.  
  261. create view vwProizvodi
  262. as
  263. select top 10 p.IDProizvod, p.Naziv, COUNT(s.ProizvodID) as UkupnoProdanih from Proizvod as p
  264. inner join Stavka as s on s.ProizvodID=p.IDProizvod
  265. group by p.Naziv,p.IDProizvod
  266. order by 3 desc
  267.  
  268. /*Promijenite pogled tako da bude zaštićen, čvrsto vezan uz tablice i da ne dopušta izmjene koje neće biti
  269. vidljive kroz pogled*/
  270.  
  271. alter view vwProizvodi
  272. with encryption, SCHEMABINDING
  273. as
  274. select top 10 p.IDProizvod, p.Naziv, COUNT(s.ProizvodID) as UkupnoProdanih from dbo.Proizvod as p
  275. inner join dbo.Stavka as s on s.ProizvodID=p.IDProizvod
  276. group by p.Naziv,p.IDProizvod
  277. order by 3 desc
  278. WITH CHECK OPTION
  279.  
  280.  
  281. --I3
  282.  
  283. /*9. Maknite sve nk indekse sa dbo.Proizvod, pa pitanja.*/
  284. --P: na koliko stranica su smješteni podaci iz tablice Proizvod?
  285. --O: na 6 podatkovnih stranica (i ima jedna indeks stranica)
  286. dbcc traceon(3604)
  287. dbcc ind([AdventureWorksOBP], [Proizvod], -1)
  288. --P: na prvoj podatkovnoj stranici, koji je IDProizvod za 1 i zadnji proizvod na 1. stranici?
  289. --O: 1. je 1, zadnji je 425
  290. dbcc page(AdventureWorksOBP, 1, 560, 3) with tableresults
  291. -- P: na kojoj stranici se nalazi proizvod s ID-jem 777?
  292. -- O: nalazi se na stranici 563(slot 70)
  293. dbcc page(AdventureWorksOBP, 1, 563, 3) with tableresults
  294. -- P: umetnite novi proizvod, na koju je stranicu dodan?
  295. -- O: budući da se sve sprema prema primarnom ključu koji se sam generira inkrementom, proizvod
  296. -- je dodan na zadnju stranicu (566) u slot 62
  297. insert into Proizvod (Naziv, BrojProizvoda, Boja, MinimalnaKolicinaNaSkladistu, CijenaBezPDV)
  298. values ('Mačje Oko', 'PR0907','Roza', 2, 12)
  299. dbcc page(AdventureWorksOBP, 1, 566, 3) with tableresults
  300.  
  301. /*10. Optimizirati upit*/
  302.  
  303. set statistics io on
  304.  
  305. select
  306.     IDKreditnaKartica,
  307.     Broj,
  308.     Tip
  309. from KreditnaKartica
  310. where Tip like 'Master%'
  311.     and IstekGodina = 2007
  312. -- Scan count 1, logical reads 164
  313.  
  314. create nonclustered index iKreditnaKartica on KreditnaKartica(IstekGodina)
  315. include(Tip, Broj)
  316. -- Scan count 1, logical reads 42
  317. --drop index iKreditnaKartica on KreditnaKartica
  318.  
  319. /*Na koliko stranica su smješteni podaci iz
  320. tablice Potkategorija? Na koliko stranica su
  321. smješteni indeksi iz tablice
  322. Potkategorija? Koji je IDPotkategorija prve
  323. stavke na prvoj stranici?*/
  324. --DBCC IND('naziv_baze', 'naziv_tablice', -1)
  325. --DBCC PAGE('naziv_baze', FID, PID, 3) WITH TABLERESULTS
  326.  
  327. set statistics io on
  328.  
  329. DBCC TRACEON(3604)
  330. DBCC IND('AdventureWorksOBP', 'Kupac', -1)
  331. DBCC PAGE('AdventureWorksOBP', 1, 552, 3) WITH TABLERESULTS
  332. --Smješteni su na 1
  333. --IDPotkategorija 1
  334.  
  335. /*Optimizirajte upit što je bolje moguće:
  336. SELECT DISTINCT PotkategorijaID FROM
  337. Proizvod WHERE Naziv LIKE 'P%' */
  338.  
  339. SELECT DISTINCT PotkategorijaID FROM
  340. Proizvod WHERE Naziv LIKE 'P%'
  341. --logical reads 8
  342. CREATE NONCLUSTERED INDEX iProizvod ON Proizvod(naziv) include (PotkategorijaID)
  343. drop index Proizvod.iPorizvod
  344. --logical reads 2
  345.  
  346.  
  347. --I4
  348. /*11. Procedura koja prima ime i prezime komercijalista i ubacuje novoga, kroz izlazni parametar
  349. vraća novonastali id, odnosno -1 ukoliko isti već postoji (pa ga se ni ne mora ubacivat)*/
  350.  
  351. create proc UbaciKomarcijalista
  352.     @ime nvarchar(50),
  353.     @prezime nvarchar(50),
  354.     @idKomercijalista int output
  355. as
  356. if exists (select IDKomercijalist from Komercijalist where Ime = @ime and Prezime = @prezime) begin
  357.     set @idKomercijalista = -1
  358. end
  359. else begin
  360.     insert into Komercijalist (Ime, Prezime)
  361.     values (@ime, @prezime)
  362.     set @idKomercijalista = SCOPE_IDENTITY()
  363. end
  364. go
  365.  
  366. declare @idKomercijalista int
  367. execute UbaciKomarcijalista 'Isus', 'Krist', @idKomercijalista output
  368. print @idKomercijalista
  369. execute UbaciKomarcijalista 'Isus', 'Krist', @idKomercijalista output
  370. print @idKomercijalista
  371. go
  372.  
  373. /*12.Procedura prima ID proizvoda, provjerava postoji li i je li kad prodan, preko return mora vratit
  374. sljedeće vrijednosti -1 (ne postoji), 0 (postoji, nikad prodan) 1 (postoji i prodavan n puta)*/
  375.  
  376. create proc ProvjeriProizvod
  377.     @idProizvod int
  378. as
  379. if not exists (select Naziv from Proizvod where IDProizvod = @idProizvod)
  380. begin
  381.     return -1
  382. end
  383. if @idProizvod IN (select p.IDProizvod from Proizvod as p
  384. where (select sum(Kolicina) from Stavka where ProizvodID = p.IDProizvod) IS NULL)
  385. begin
  386.     return 0
  387. end
  388.     return 1
  389.  
  390.  
  391. declare @ajdi int = 1001
  392. declare @rezultat int
  393. -- postojeći, nikad prodani proizvod
  394. exec @rezultat = ProvjeriProizvod @ajdi
  395. print @rezultat
  396. -- postojeći prodavani proizvod
  397. set @ajdi = 707
  398. exec @rezultat = ProvjeriProizvod @ajdi
  399. print @rezultat
  400. -- nepostojeći proizvod
  401. set @ajdi = 20000
  402. exec @rezultat = ProvjeriProizvod @ajdi
  403. print @rezultat
  404.  
  405. select * from proizvod
  406. where (select sum(Kolicina) from Stavka where ProizvodID = IDProizvod) IS NOT NULL
  407.  
  408. /*13. Implementirajte CRUD na Potkategorija s 2 procedure (C,U) i (R,D)
  409. Napravite umetanje, izmjenu, dohvaćanje i brisanje jedne potkategorije*/
  410.  
  411. create proc CU_Potkategorija
  412.     @idPotkategorije int output,
  413.     @naziv nvarchar(50),
  414.     @idKategorija int
  415. as
  416. if exists (select * from Potkategorija where IDPotkategorija = @idPotkategorije) begin
  417.     update Potkategorija
  418.     set Naziv = @naziv, KategorijaID = @idKategorija
  419.     where IDPotkategorija = @idPotkategorije
  420. end
  421. else begin
  422.     insert into Potkategorija (Naziv, KategorijaID)
  423.     values (@naziv, @idKategorija)
  424.     set @idPotkategorije = SCOPE_IDENTITY()
  425. end
  426.  
  427. declare @noviAjdi int
  428. exec CU_Potkategorija @noviAjdi output, 'ZaPuknutLanac',4
  429. print @noviAjdi
  430. select * from Potkategorija where IDPotkategorija = @noviAjdi
  431.  
  432. declare @noviAjdi int
  433. exec CU_Potkategorija @noviAjdi output, 'KljucZaLanac', 4
  434. select * from Potkategorija where IDPotkategorija = @noviAjdi
  435.  
  436.  
  437.  
  438. create proc RD_Potkategorija
  439.     @ajdiPostojeci int,
  440.     @operacija char = 'R'
  441. as
  442. if @operacija = 'R' begin
  443.     select
  444.         *
  445.     from Potkategorija
  446.     where IDPotkategorija = @ajdiPostojeci
  447. end
  448. else if @operacija = 'D' begin
  449.     print 'Brise se potkategorija: ' + (select Naziv from Potkategorija where IDPotkategorija = @ajdiPostojeci)
  450.     delete from Potkategorija
  451.     where IDPotkategorija = @ajdiPostojeci
  452. end
  453.  
  454. declare @ajdiPostojeci int
  455. set @ajdiPostojeci = (select IDPotkategorija from Potkategorija where Naziv = 'KljucZaLanac')
  456. select * from Potkategorija where IDPotkategorija = @ajdiPostojeci
  457. exec RD_Potkategorija @ajdiPostojeci
  458. exec RD_Potkategorija @ajdiPostojeci, 'R'
  459. exec RD_Potkategorija @ajdiPostojeci, 'D'
  460. select * from Potkategorija where IDPotkategorija = @ajdiPostojeci
  461.  
  462. -----------------
  463. create proc spZad1
  464.     @idkupac int output,
  465.     @ime nvarchar(50),
  466.     @prezime nvarchar(50),
  467.     @email nvarchar(50),
  468.     @telefon nvarchar(50)
  469. as
  470. if not exists(select * from Kupac where @ime = Ime and @prezime = Prezime)
  471.     begin
  472.         insert into Kupac(Ime, Prezime, Email, Telefon) values(@ime, @prezime, @email, @telefon)
  473.         set @idkupac = SCOPE_IDENTITY()
  474.         return 1
  475.     end
  476. else
  477.     begin
  478.     select @idkupac= IDKupac from Kupac where @ime = Ime and @prezime = Prezime
  479.     return 0
  480.     end
  481.  
  482. declare @id int
  483. declare @vratila int
  484. exec @vratila = pZad1 @id output,'Petar', 'Hara', 'petarhara@com','05215125'
  485. print @id
  486. print @vratila
  487.  
  488. /*Napišite proceduru koja prima naziv
  489. potkategorije i ID kategorije, umeće novu
  490. potkategoriju za tu kategoriju u tablicu
  491. Potkategorija i kroz izlazni parametar vraća
  492. vrijednost primarnog ključa umetnutog
  493. retka. Ako već postoji potkategorija zadanog
  494. imena za tu kategoriju, ne treba je upisivati
  495. ponovno i u tom slučaju kroz izlazni
  496. parametar vratite vrijednost -1. Pozovite
  497. proceduru dva puta s istim nazivom
  498. potkategorije i ID-om kategorije te ispišite
  499. vraćenu vrijednost. */
  500.  
  501. create proc spKategorija
  502.     @nazivPodkategorije nvarchar(255),
  503.     @IDkategorija int,
  504.     @ID int output
  505. as
  506. if exists (select * from Potkategorija where @nazivPodkategorije = Naziv)
  507.     begin
  508.     SET @ID = -1
  509.     end
  510. else
  511.     begin
  512.     insert into Potkategorija(KategorijaID, Naziv) values(@IDkategorija,@nazivPodkategorije)
  513.     SET @ID = SCOPE_IDENTITY()
  514.     end
  515.  
  516. declare @ID int
  517. exec procKategorija @nazivPodkategorije='ba',@IDkategorija= 1, @ID= @ID output
  518. print @ID
  519.  
  520. drop proc spKategorija
  521.  
  522. /*Implementirajte CRUD operacije na tablici
  523. Kategorija, ako znate da će se baza podataka
  524. koristiti i iz programskog jezika koji ne
  525. podržava rad s funkcijama na bazi podataka.
  526. Demonstrirajte korištenje napravljenih
  527. objekata.*/
  528.  
  529. create proc spSelectKategorija
  530. as
  531. select * from Kategorija
  532.  
  533. exec spSelectKategorija
  534.  
  535. create proc spInsertKategorija
  536.     @Naziv nvarchar(255)
  537. as
  538. insert into Kategorija(Naziv) values(@Naziv)
  539.  
  540. exec spInsertKategorija 'Mobiteli'
  541.  
  542. create proc spUpdateKategorija
  543.     @IDKategorija int,
  544.     @Naziv nvarchar(255)
  545. as
  546. update Kategorija
  547. set Kategorija.Naziv = @Naziv
  548. where Kategorija.IDKategorija = @IDKategorija
  549.  
  550. exec spUpdateKategorija 7, 'IPhone'
  551.  
  552. create proc spDeleteKategorija
  553.     @IDKategorija int
  554. as
  555. delete from Kategorija
  556. where Kategorija.IDKategorija = @IDKategorija
  557.  
  558. exec spDeleteKategorija 7
  559.  
  560. /*Napišite proceduru koja prima kriterij po kojemu ćete filtrirati prezimena iz tablice Kupac.
  561. Neka procedura pomoću izlaznog parametra vrati broj zapisa koji zadovoljavaju zadani kriterij.
  562. Neka procedura vrati i sve zapise koji zadovoljavaju kriterij.
  563. Pozovite proceduru i ispišite vraćenu vrijednost.
  564. Uklonite proceduru.*/
  565.  
  566. CREATE PROC p13
  567.     @Filter nvarchar(50),
  568.     @BrojZapisa int OUTPUT
  569. AS
  570. SELECT @BrojZapisa = COUNT(*) FROM Kupac WHERE Prezime LIKE @Filter
  571. SELECT * FROM Kupac WHERE Prezime LIKE @Filter
  572. GO
  573.  
  574. DECLARE @Cnt int
  575. EXEC p13 '%hu%', @Cnt OUTPUT
  576. PRINT @Cnt
  577.  
  578. /*Napišite proceduru koja za zadanog komercijalistu pomoću izlaznih parametara vraća njegovo ime
  579. i prezime te ukupnu zarađenu količinu novaca.*/
  580. CREATE PROC p14
  581.     @KomercijalistID int,
  582.     @Ime nvarchar(50) OUTPUT,
  583.     @Prezime nvarchar(50) OUTPUT,
  584.     @Zaradio money OUTPUT
  585. AS
  586. SELECT @Ime = Ime, @Prezime = Prezime
  587. FROM Komercijalist
  588. WHERE IDKomercijalist = @KomercijalistID
  589.  
  590. SELECT @Zaradio = SUM(s.UkupnaCijena)
  591. FROM Racun AS r
  592. INNER JOIN Stavka AS s ON r.IDRacun = s.RacunID
  593. WHERE r.KomercijalistID = @KomercijalistID
  594. GO
  595.  
  596. DECLARE @Ime nvarchar(50), @Prezime nvarchar(50), @Zaradio money
  597. EXEC p14 276, @Ime OUTPUT, @Prezime OUTPUT, @Zaradio OUTPUT
  598. PRINT @Ime
  599. PRINT @Prezime
  600. PRINT @Zaradio
  601.  
  602. /*Napišite funkciju koja prima ID proizvoda i dohvaća broj prodanih primjeraka.
  603. Pozovite funkciju samostalno.
  604. Dohvatite nazive i boje svih proizvoda i uz svaki proizvoda
  605. ispišite koliko primjeraka je prodano. Promijenite funkciju tako da vrati 0 za one proizvode koji nisu prodani
  606. niti u jednom primjerku.*/
  607.  
  608. create FUNCTION UkupnaKolicina
  609. (
  610.     @ID int
  611. )
  612. RETURNS int
  613. AS
  614. BEGIN
  615.     DECLARE @Ukupno int
  616.     SELECT @Ukupno = Sum(Kolicina) FROM Stavka WHERE ProizvodID = @ID
  617.     RETURN @Ukupno
  618. END
  619. GO
  620.  
  621. DECLARE @Rez int
  622. SET @Rez = dbo.UkupnaKolicina(776)
  623. PRINT @Rez
  624.  
  625. SELECT
  626.     Naziv,
  627.     Boja,
  628.     dbo.UkupnaKolicina(IDProizvod) AS Prodano
  629. FROM Proizvod
  630. GO
  631.  
  632. ALTER FUNCTION UkupnaKolicina
  633. (
  634.     @ID int
  635. )
  636. RETURNS int
  637. AS
  638. BEGIN
  639.     DECLARE @Ukupno int
  640.  
  641.     SELECT @Ukupno = Sum(Kolicina) FROM Stavka WHERE ProizvodID = @ID
  642.  
  643.     RETURN CASE
  644.                 WHEN @Ukupno IS NOT NULL THEN @Ukupno
  645.                 ELSE 0
  646.             END
  647. END
  648.  
  649. /*Napišite jednostavnu tabličnu funkciju koja prima dva datuma.
  650. Neka funkcija vrati broj računa, datum izdavanja i ime i prezime kupca za sve račune izdane između zadanih datuma.
  651. Iskoristite funkciju za dohvat računa između 01.06.2004. i 03.06.2004.
  652. Promijenite funkciju da datum vrati u hrvatskom formatu.*/
  653.  
  654. CREATE FUNCTION DohvatiRacune
  655. (
  656.     @D1 datetime,
  657.     @D2 datetime
  658. )
  659. RETURNS TABLE
  660. AS
  661. RETURN
  662.     SELECT r.BrojRacuna, r.DatumIzdavanja, k.Ime, k.Prezime
  663.     FROM Racun AS r
  664.     LEFT JOIN dbo.Kupac AS k ON r.KupacID = k.IDKupac
  665.     WHERE r.DatumIzdavanja BETWEEN @D1 AND @D2
  666. GO
  667.  
  668. SELECT * FROM DohvatiRacune('20040601', '20040603')
  669. GO
  670.  
  671. ALTER FUNCTION DohvatiRacune
  672. (
  673.     @D1 datetime,
  674.     @D2 datetime
  675. )
  676. RETURNS TABLE
  677. AS
  678. RETURN
  679.     SELECT r.BrojRacuna, CONVERT(char(10), r.DatumIzdavanja, 104) AS DatumIzdavanja, k.Ime, k.Prezime
  680.     FROM Racun AS r
  681.     LEFT JOIN dbo.Kupac AS k ON r.KupacID = k.IDKupac
  682.     WHERE r.DatumIzdavanja BETWEEN @D1 AND @D2
  683. GO
  684.  
  685. SELECT * FROM DohvatiRacune('20040601', '20040603')
  686.  
  687.  
  688. /*Napišite složenu tabličnu funkciju koja prima cijenu.
  689. Ako je cijena NULL, vratite nazive i cijene svih proizvoda iz tablice Proizvod.
  690. Ako nije, vratite nazive i cijene samo onih proizvoda čija cijena je veća od zadane cijene.
  691. Iskoristite funkciju s NULL i s cijenom od 3000*/
  692.  
  693. CREATE FUNCTION F4
  694. (
  695.     @Cijena money
  696. )
  697. RETURNS @rez TABLE ( Naziv nvarchar(50), Cijena money )
  698. AS
  699. BEGIN
  700.     IF @Cijena IS NULL BEGIN
  701.         INSERT INTO @rez (Naziv, Cijena)
  702.         SELECT Naziv, CijenaBezPDV FROM Proizvod
  703.     END
  704.     ELSE BEGIN
  705.         INSERT INTO @rez (Naziv, Cijena)
  706.         SELECT Naziv, CijenaBezPDV FROM Proizvod WHERE CijenaBezPDV > @Cijena
  707.     END
  708.    
  709.     RETURN
  710. END
  711. GO
  712.  
  713. SELECT * FROM F4(NULL)
  714. SELECT * FROM F4(3000)
  715.  
  716. drop function f4
  717.  
  718. /* Dohvatite naziv i cijene svih proizvoda.
  719. Za cijene koje su ispod 1000, napišite “Jeftino”, između 1000 i 2000
  720. napišite “Prihvatljivo”, za sve ostale napišite “Skupo”. */
  721.  
  722. SELECT
  723.     Naziv,
  724.     CASE
  725.         WHEN CijenaBezPDV < 1000 THEN 'Jeftino'
  726.         WHEN CijenaBezPDV BETWEEN 1000 AND 2000 THEN 'Prihvatljivo'
  727.         ELSE 'Skupo'
  728.     END AS Procjena
  729. FROM Proizvod
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement