Advertisement
thisissoeasy

sqlhack#4

Feb 2nd, 2023 (edited)
738
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 86.81 KB | None | 0 0
  1. -- Napravite pogled koji æe dohvaæati sve iz tablice Kupac
  2. CREATE VIEW p1
  3. AS
  4. SELECT * FROM Kupac
  5. GO
  6. -- Vježba 1.1.a)
  7. -- Iskoristite pogled za dohvaæanje svih zapisa
  8. SELECT * FROM p1
  9. GO
  10. -- Vježba 1.1.b)
  11. -- Iskoristite pogled za dohvaæanje onih osoba èije ime zapoèinje sa “L” i prezime završava na “a”
  12. SELECT * FROM p1
  13. WHERE Ime LIKE 'L%' AND Prezime LIKE '%a'
  14. GO
  15. -- Vježba 1.1.c)
  16. -- Iskoristite pogled za ispis svih ID-eva gradova i broja osoba koje žive u tom gradu,
  17. -- padajuæe prema broju osoba
  18. -- (pomoæu grupiranja i pomoæu podupita)
  19. -- pomoæu grupiranja
  20. SELECT GradID, COUNT(*) AS BrojOsoba
  21. FROM p1
  22. GROUP BY GradID
  23. ORDER BY BrojOsoba DESC
  24. GO
  25. -- pomoæu podupita
  26. SELECT DISTINCT
  27.     GradID,
  28.     (SELECT COUNT(*)
  29.      FROM p1 AS sq
  30.      WHERE ISNULL(sq.GradID, '') = ISNULL(mq.GradID, '')) AS BrojOsoba
  31. FROM p1 AS mq
  32. ORDER BY BrojOsoba DESC
  33. GO
  34.  
  35. -- Vježba 1.1.d)
  36. -- Iskoristite pogled tako da ispišete ime i prezime te pokraj svakoga
  37. -- ispišite njegov naziv grada i naziv države
  38. SELECT
  39.     p1.Ime,
  40.     p1.Prezime,
  41.     g.Naziv as 'Grad',
  42.     d.Naziv as 'Država'
  43. FROM p1
  44. LEFT JOIN Grad AS g ON p1.GradID = g.IDGrad
  45. LEFT JOIN Drzava AS d ON g.DrzavaID= d.IDDrzava
  46. GO
  47.  
  48. -- Vježba 1.2)
  49. -- Promijenite pogled tako da ne ukljuèuje stupce Email, Telefon i GradID
  50. ALTER VIEW p1
  51. AS
  52. SELECT IDKupac, Ime, Prezime FROM Kupac
  53. GO
  54.  
  55. -- provjera
  56. SELECT * FROM p1
  57. GO
  58.  
  59. -- Vježba 1.2)
  60. -- Uklonite pogled
  61. DROP VIEW p1
  62. GO
  63.  
  64.  
  65. -- Vježbe 2.
  66.  
  67. -- Vježba 2.1)
  68. -- Pripremite sljedeæe izvještaje u obliku pogleda:
  69.  
  70. -- Vježba 2.1.a)
  71. -- Ispišite nazive svih kupaca, te za svakoga ispišite email, grad i naziv države u kojoj je smješten
  72. -- Tablice: Kupac, Grad, Drzava
  73.  
  74. CREATE VIEW p2 AS
  75. SELECT
  76.     k.Ime,
  77.     k.Prezime,
  78.     k.Email,
  79.     g.Naziv AS Grad,
  80.     d.Naziv AS Drzava
  81. FROM Kupac AS k
  82. LEFT JOIN Grad AS g ON k.GradID = g.IDGrad
  83. LEFT JOIN Drzava AS d ON g.DrzavaID = d.IDDrzava
  84. GO
  85. -- provjera
  86. SELECT * FROM p2
  87. GO
  88.  
  89. -- Vježba 2.1.b)
  90. -- Ispišite sve države i za svaku od njih ispišite koliko kupaca iz nje postoji
  91. -- Tablice: Kupac, Grad, Drzava
  92.  
  93. CREATE VIEW p3 AS
  94. SELECT
  95.     d.Naziv AS Drzava,
  96.     COUNT(k.IDKupac) AS BrojKupaca
  97. FROM Kupac AS k
  98. LEFT JOIN Grad AS g ON k.GradID = g.IDGrad
  99. LEFT JOIN Drzava AS d ON g.DrzavaID = d.IDDrzava
  100. GROUP BY d.Naziv
  101. GO
  102. -- provjera
  103. SELECT * FROM p3
  104. GO
  105.  
  106. -- Vježba 2.1.c)
  107. -- Ispišite nazive svih proizvoda koje je kupilo >300 kupaca
  108. -- Tablice: Kupac, Racun, Stavka i Proizvod
  109.  
  110. CREATE VIEW p4 AS
  111. SELECT
  112.     p.Naziv,
  113.     COUNT(k.IDKupac) AS BrojKupaca
  114. FROM Proizvod AS p
  115. INNER JOIN Stavka AS s ON s.ProizvodID = p.IDProizvod
  116. INNER JOIN Racun AS r ON s.RacunID = r.IDRacun
  117. INNER JOIN Kupac AS k ON r.KupacID = k.IDKupac
  118. GROUP BY p.Naziv
  119. HAVING COUNT(k.IDKupac) > 300
  120. GO
  121. -- provjera
  122. SELECT * FROM p4
  123. GO
  124.  
  125. -- Vježba 2.1.d)
  126. -- Ispišite nazive i zaradu 5 proizvoda koji se najbolje prodaju
  127. -- Tablice: Stavka i Proizvod
  128.  
  129. CREATE VIEW p5 AS
  130. SELECT TOP 5
  131.     p.Naziv,
  132.     SUM(s.UkupnaCijena) AS Zarada
  133. FROM Proizvod AS p
  134. INNER JOIN Stavka AS s ON s.ProizvodID = p.IDProizvod
  135. GROUP BY p.Naziv
  136. ORDER BY Zarada DESC
  137. GO
  138. -- provjera
  139. SELECT * FROM p5
  140. GO
  141.  
  142. -- Vježba 2.1.e)
  143. -- Uklonite sve poglede
  144. DROP VIEW p2
  145. DROP VIEW p3
  146. DROP VIEW p4
  147. DROP VIEW p5
  148. GO
  149.  
  150.  
  151.  
  152. -- Vježbe 3.
  153.  
  154. -- Vježba 3.1)
  155. -- Napravite pogled koji vraæa imena i prezimena te e-mailove svih kupaca iz Zagreba.
  156.  
  157. CREATE VIEW p6 AS
  158. SELECT
  159.     k.Ime,
  160.     k.Prezime,
  161.     k.Email,
  162.     g.Naziv AS Grad
  163. FROM Kupac AS k
  164. INNER JOIN Grad AS g ON k.GradID = g.IDGrad
  165. WHERE g.Naziv = 'Zagreb'
  166. GO
  167. -- provjera
  168. SELECT * FROM p6
  169. GO
  170.  
  171. -- Vježba 3.2)
  172. -- Promijenite pogled tako da dohvaæa i sve kupce iz Splita.
  173.  
  174. ALTER VIEW p6 AS
  175. SELECT
  176.     k.Ime,
  177.     k.Prezime,
  178.     k.Email,
  179.     g.Naziv AS Grad
  180. FROM Kupac AS k
  181. INNER JOIN Grad AS g ON k.GradID = g.IDGrad
  182. WHERE g.Naziv = 'Zagreb' OR g.Naziv = 'Split'
  183. GO
  184. -- provjera
  185. SELECT * F
  186.  
  187. -- Vježba 3.3)
  188. -- Koristeæi pogled ispišite broj kupaca iz Zagreba i broj kupaca iz Splita.
  189.  
  190. SELECT
  191.     Grad,
  192.     COUNT(*) AS Broj
  193. FROM p6
  194. GROUP BY Grad
  195. GO
  196.  
  197. -- Vježba 3.4)
  198. -- Uklonite pogled.
  199.  
  200. DROP VIEW p6
  201. GO
  202.  
  203.  
  204.  
  205. --VJ 2
  206. -- Napravite pogled koji æe dohvaæati sve stupce i retke iz tablice Kategorija
  207. CREATE VIEW v1 AS
  208. SELECT * FROM Kategorija
  209. GO
  210.  
  211. -- Ispišite nazive kategorija, potkategorija i proizvoda (koristite kreirani pogled)
  212. SELECT
  213.     v1.Naziv as 'Kategorija',
  214.     Potkategorija.Naziv as 'Potkategorija',
  215.     Proizvod.Naziv as 'Proizvod'
  216. FROM v1
  217. RIGHT JOIN Potkategorija ON Potkategorija.KategorijaID = v1.IDKategorija
  218. RIGHT JOIN Proizvod ON Proizvod.PotkategorijaID = Potkategorija.IDPotkategorija
  219. GO
  220.  
  221. -- Pomoæu pogleda umetnite kategoriju naziva “Alarmi”
  222. INSERT INTO v1 (Naziv) VALUES ('Alarmi')
  223. GO
  224.  
  225. -- Pomoæu pogleda promijenite kategoriji “Alarmi” naziv u “Aktivna zaštita”
  226. UPDATE v1 SET Naziv = 'Aktivna zaštita' WHERE Naziv = 'Alarmi'
  227. GO
  228.  
  229. -- Pomoæu pogleda obrišite kategoriju “Aktivna zaštita”
  230. DELETE FROM v1 WHERE Naziv = 'Aktivna zaštita'
  231. GO
  232.  
  233. -- Uklonite pogled
  234. DROP VIEW v1
  235. GO
  236.  
  237.  
  238. -- Napravite pogled koji æe dohvaæati naziv grada, naziv države u kojoj se nalazi te sve
  239. -- podatke o kupcima koji im pripadaju (tablice Grad, Drzava, Kupac).
  240. CREATE VIEW v2 AS
  241. SELECT
  242.     Drzava.Naziv as 'Država',
  243.     Grad.Naziv as 'Grad',
  244.     Kupac.*
  245. FROM Kupac
  246. LEFT JOIN Grad ON Kupac.GradID = Grad.IDGrad
  247. LEFT JOIN Drzava ON Grad.DrzavaID = Drzava.IDDrzava
  248. GO
  249. -- provjera
  250. SELECT * FROM v2
  251. GO
  252.  
  253. -- Probajte pomoæu pogleda umetnuti novi grad. Što se dogodilo?
  254. INSERT INTO v2 (Grad) VALUES ('Bedekovèina')
  255. GO
  256. SELECT * FROM Grad
  257. GO
  258.  
  259. -- Probajte pomoæu pogleda umetnuti novu državu. Što se dogodilo?
  260. INSERT INTO v2 (Država) VALUES ('Uzbekistan')
  261. GO
  262. SELECT * FROM Drzava
  263. GO
  264.  
  265. -- Probajte pomoæu pogleda umetnuti novog kupca. Što se dogodilo? Možete li vidjeti novododanog kupca kroz pogled? Postoji li on u tablici?
  266. INSERT INTO v2 (Ime, Prezime)
  267.     VALUES ('Pero','Periæ')
  268. GO
  269. SELECT * FROM Kupac
  270. GO
  271. SELECT * FROM v2
  272. GO
  273.  
  274. -- Uklonite pogled
  275. DROP VIEW v2
  276. GO
  277.  
  278.  
  279.  
  280.  
  281. -- Napravite pogled koji æe dohvaæati sve kreditne kartice koje su tipa Visa ili MasterCard (tablica KreditnaKastica)
  282. CREATE VIEW v3 AS
  283. SELECT * FROM KreditnaKartica WHERE Tip IN ('Visa', 'MasterCard')
  284. GO
  285.  
  286. -- Umetnite zapis o kreditnoj kartici tipa American Express.
  287. -- Dohvatiti umetnuti redak pomoæu pogleda. Što se dogodilo? Je li redak uspješno umetnut u tablicu?
  288. INSERT INTO v3 (Tip, Broj,IstekMjesec, IstekGodina)
  289. VALUES ('American Express', '111222333444', 12, 2012)
  290. GO
  291. SELECT * FROM v3 WHERE Tip = 'American Express'
  292. GO
  293.  
  294. -- Promijenite pogled tako da ne dopušta umetanje/izmjenu redaka koji neæe biti vidljivi kroz njega.
  295. ALTER VIEW v3 AS
  296. SELECT * FROM KreditnaKartica WHERE Tip IN ('Visa', 'MasterCard')
  297. WITH CHECK OPTION
  298. GO
  299. INSERT INTO v3 (Tip, Broj,IstekMjesec, IstekGodina)
  300. VALUES ('American Express', '111222333444', 12, 2012)
  301. GO
  302.  
  303. -- Umetnite zapis o kreditnoj kartici tipa MasterCard. Što se dogodilo? Je li redak uspješno umetnut u tablicu?
  304. INSERT INTO v3 (Tip, Broj,IstekMjesec, IstekGodina)
  305. VALUES ('MasterCard', '111222333444', 12, 2012)
  306. GO
  307.  
  308. -- Promijenite pogled tako da dopušta umetanje/izmjenu redaka koji neæe biti vidljivi kroz njega.
  309. ALTER VIEW v3 AS
  310. SELECT * FROM KreditnaKartica WHERE Tip IN ('Visa', 'MasterCard')
  311. GO
  312.  
  313. -- Uklonite pogled
  314. DROP VIEW v3
  315. GO
  316.  
  317.  
  318.  
  319.  
  320. -- Vježbe 4.
  321. /*
  322. Napravite tablicu Film sa stupcima IDFilm, Naziv, GodinaProizvodnje, TrajanjeMinuta i KratkiOpis. Umetnite koji redak.
  323. Napravite pogled koji dohvaæa sve iz tablice Film
  324. Iskoristite pogled za dohvaæanje podataka
  325. Uklonite stupac TrajanjeMinuta iz tablice
  326. Iskoristite pogled za dohvaæanje podataka
  327. Promijenite pogled tako da bude èvrsto vezan uz objekte koje koristi
  328. Iskoristite pogled za dohvaæanje podataka
  329. Uklonite stupac GodinaProizvodnje iz tablice. Je li uklanjanje uspjelo? Zašto?
  330. Uklonite pogled i tablicu
  331. */
  332. CREATE TABLE Film
  333. (
  334.     IDFilm int CONSTRAINT PK_Film PRIMARY KEY IDENTITY,
  335.     Naziv nvarchar(200) NOT NULL,
  336.     GodinaProizvodnje int NOT NULL,
  337.     TrajanjeMinuta int NOT NULL,
  338.     KratkiOpis nvarchar(max) NOT NULL
  339. )
  340. GO
  341. INSERT INTO Film (Naziv, GodinaProizvodnje, TrajanjeMinuta, KratkiOpis)
  342.     VALUES (N'O maèkama i psima 2: Osveta Kitty Galore', 2010, 85, N'U vjeènoj bitci maèaka i pasa, jedna poludjela maèka odvest æe stvari jednu šapu predaleko. Kitty Galore, bivša agentica špijunske organizacije MIJAU, pobjegla je i skovala ðavolji plan u kojem ne samo da æe pokušati pripitomiti svoje vjeène neprijatelje, veæ i svoje bivše kolege maèke, ali i cjelokupno èovjeèanstvo. Suoèeni s ovom prijetnjom bez presedana, maèke i psi biti æe prisiljeni prvi put u povijesti udružiti snage kako bi spasili sebe – ali i svoje vlasnike')
  343. INSERT INTO Film (Naziv, GodinaProizvodnje, TrajanjeMinuta, KratkiOpis)
  344.     VALUES (N'Shrek uvijek i zauvijek', 2010, 95, N'Nakon što se borio s opakim zmajem, spasio prekrasnu princezu i oslobodio èitavo kraljevstvo – kakav bi zadatak još mogao postojati u životu slavnog Shreka? Odgovor je jasan: obitelj, odnosno svakodnevna bitka s malim nestašnim Shrekiæima. Meðutim, sve æe to biti kratka vijeka, jer æe Shrek ubrzo upoznati lukavog Rumpelstiltskina i iznenada se naæi u potpuno drugoj dimenziji, alternativnoj buduænosti u kojoj se on i Fiona nikad nisu susreli, u kojoj je baš on ugrožena vrsta, a Rumpelstiltskin kralj! Naravno, jedino je Shrek taj koji æe moæi ispraviti novonastalu situaciju, spasiti prijatelje, obnoviti kraljevstvo i ponovno pronaæi svoju pravu, jedinu ljubav.')
  345. INSERT INTO Film (Naziv, GodinaProizvodnje, TrajanjeMinuta, KratkiOpis)
  346.     VALUES (N'Resident Evil: Drugi svijet', 2010, 90, N'Svijet je poharan virusnom infekcijom od koje oboljeli postaju zombiji. Alice (Milla Jovovich) pronalazi preživjele i spašava ih. Njezina bitka s Umbrella Corporation dostiže smrtonosne razine, no u pomoæ joj priskaèe stari prijatelj. U nadi da æe pronaæi sigurno mjesto odlaze prema Los Angelesu. No, grad je preplavljen tisuæama zombija i oni æe naletjeti u zamku')
  347. GO
  348.  
  349. CREATE VIEW v4 AS
  350. SELECT * FROM Film
  351. GO
  352.  
  353. SELECT * FROM v4
  354. GO
  355.  
  356. ALTER TABLE Film DROP COLUMN TrajanjeMinuta
  357. GO
  358.  
  359. ALTER VIEW v4
  360. WITH SCHEMABINDING
  361. AS
  362. SELECT IDFilm, Naziv, GodinaProizvodnje, KratkiOpis FROM dbo.Film
  363. GO
  364.  
  365. SELECT * FROM v4
  366. GO
  367.  
  368. ALTER TABLE Film DROP COLUMN GodinaProizvodnje
  369. GO
  370.  
  371. DROP VIEW v4
  372. DROP TABLE Film
  373. GO
  374.  
  375.  
  376.  
  377.  
  378. -- Vježbe 5.
  379. /*
  380. Napravite pogled koji dohvaæa 10 proizvoda koji su najviše prodavani. Stupci koje pogled vraæa neka budu ID i naziv te ukupna kolièina prodanih proizvoda.
  381. Pogledajte SELECT upit pogleda kroz suèelje i pomoæu sistemske procedure sp_helptext
  382. Zaštitite pogled
  383. Pogledajte SELECT upit pogleda kroz suèelje i pomoæu sistemske procedure sp_helptext
  384. Promijenite pogled tako da bude zaštiæen i èvrsto vezan uz tablice
  385. Promijenite pogled tako da bude zaštiæen, èvrsto vezan uz tablice i da ne dopušta izmjene koje neæe biti vidljive kroz pogled
  386. Uklonite pogled
  387. */
  388. CREATE VIEW v5 AS
  389. SELECT TOP 10
  390.     Proizvod.IDProizvod AS 'ID',
  391.     Proizvod.Naziv,
  392.     SUM(Stavka.Kolicina) AS 'UkupnaKolicina'
  393. FROM Proizvod
  394. INNER JOIN Stavka ON Stavka.ProizvodID = Proizvod.IDProizvod
  395. GROUP BY Proizvod.IDProizvod, Proizvod.Naziv
  396. ORDER BY 3 DESC
  397. GO
  398.  
  399. SELECT * FROM v5
  400. GO
  401.  
  402. EXECUTE sp_helptext v5
  403. GO
  404.  
  405. ALTER VIEW v5
  406. WITH ENCRYPTION
  407. AS
  408. SELECT TOP 10
  409.     Proizvod.IDProizvod AS 'ID',
  410.     Proizvod.Naziv,
  411.     SUM(Stavka.Kolicina) AS 'UkupnaKolicina'
  412. FROM Proizvod
  413. INNER JOIN Stavka ON Stavka.ProizvodID = Proizvod.IDProizvod
  414. GROUP BY Proizvod.IDProizvod, Proizvod.Naziv
  415. ORDER BY 3 DESC
  416. GO
  417.  
  418. EXECUTE sp_helptext v5
  419. GO
  420.  
  421. ALTER VIEW v5
  422. WITH ENCRYPTION, SCHEMABINDING
  423. AS
  424. SELECT TOP 10
  425.     dbo.Proizvod.IDProizvod AS 'ID',
  426.     dbo.Proizvod.Naziv,
  427.     SUM(dbo.Stavka.Kolicina) AS 'UkupnaKolicina'
  428. FROM dbo.Proizvod
  429. INNER JOIN dbo.Stavka ON dbo.Stavka.ProizvodID = dbo.Proizvod.IDProizvod
  430. GROUP BY dbo.Proizvod.IDProizvod, dbo.Proizvod.Naziv
  431. ORDER BY 3 DESC
  432. GO
  433.  
  434. ALTER VIEW v5
  435. WITH ENCRYPTION, SCHEMABINDING
  436. AS
  437. SELECT TOP 10
  438.     dbo.Proizvod.IDProizvod AS 'ID',
  439.     dbo.Proizvod.Naziv,
  440.     SUM(dbo.Stavka.Kolicina) AS 'UkupnaKolicina'
  441. FROM dbo.Proizvod
  442. INNER JOIN dbo.Stavka ON dbo.Stavka.ProizvodID = dbo.Proizvod.IDProizvod
  443. GROUP BY dbo.Proizvod.IDProizvod, dbo.Proizvod.Naziv
  444. ORDER BY 3 DESC
  445. WITH CHECK OPTION
  446. GO
  447.  
  448. DROP VIEW v5
  449. GO
  450.  
  451.  
  452.  
  453. --VJ_3
  454. -- Zadatak 1.
  455. /*
  456. VARIJABLE
  457. Deklarirajte varijable @Ime i @Prezime i dodijelite im neke vrijednosti.
  458. Ispišite dodijeljene vrijednosti.
  459. */
  460. DECLARE @Ime nvarchar(50)
  461. DECLARE @Prezime nvarchar(50)
  462.  
  463. SET @Ime = 'Miro'
  464. SET @Prezime = 'Miriæ'
  465.  
  466. PRINT @Ime
  467. PRINT @Prezime
  468. PRINT 'Korisnik: ' + @Ime + ' ' + @Prezime
  469. GO
  470.  
  471.  
  472. -- Zadatak 2.
  473. /*
  474. VARIJABLE
  475. Deklarirajte varijable @Ime i @Prezime i dodijelite im vrijednosti iz tablice Kupac za IDKupac jednak 8812.
  476. Ispišite dodijeljene vrijednosti.
  477. */
  478. DECLARE @Ime nvarchar(50)
  479. DECLARE @Prezime nvarchar(50)
  480.  
  481. SELECT @Ime = Ime, @Prezime = Prezime FROM Kupac WHERE IDKupac = 8812
  482.  
  483. PRINT 'Korisnik: ' + @Ime + ' ' + @Prezime
  484. GO
  485.  
  486.  
  487. -- Zadatak 3.
  488. /*
  489. VARIJABLE
  490. Deklarirajte varijable @Ime i @Prezime i dodijelite im vrijednosti iz tablice Kupac tako da odaberete sve retke iz tablice.
  491. Ispišite dodijeljene vrijednosti.
  492. */
  493. DECLARE @Ime nvarchar(50)
  494. DECLARE @Prezime nvarchar(50)
  495.  
  496. SELECT @Ime = Ime, @Prezime = Prezime FROM Kupac
  497.  
  498. PRINT 'Korisnik: ' + @Ime + ' ' + @Prezime
  499. GO
  500.  
  501.  
  502. -- Zadatak 4.
  503. /*
  504. IF-ELSE IF-ELSE i SCOPE_IDENTITY()
  505. Provjerite broj zapisa u tablici Kupac.
  506. Ako ih ima više ili jednako 20000, ispišite “Postoji više od 20000 kupaca :)”.
  507. Ako ih ima manje, ispišite “Još nismo dostigli 20000 kupaca :(”
  508. */
  509. DECLARE @Broj int
  510. SELECT @Broj = COUNT(*) FROM dbo.Kupac
  511. IF @Broj >= 20000
  512.     PRINT 'Postoji više od 20000 kupaca :)'
  513. ELSE
  514.     PRINT 'Još nismo dostigli 20000 kupaca :('
  515. GO
  516.  
  517.  
  518. -- Zadatak 5.
  519. /*
  520. IF-ELSE IF-ELSE i SCOPE_IDENTITY()
  521. Umetnite zapis u tablicu Drzava, generiranu IDENTITY vrijednost dodijelite nekoj varijabli pa je ispišite.
  522. */
  523. DECLARE @NoviID int
  524. INSERT INTO Drzava VALUES ('Gruzija')
  525. SET @NoviID = SCOPE_IDENTITY()
  526. PRINT @NoviID
  527. GO
  528.  
  529.  
  530. -- Zadatak 6.
  531. /*
  532. IF-ELSE IF-ELSE i SCOPE_IDENTITY()
  533. Umetnite zapis u tablicu Drzava i u varijablu spremite generiranu IDENTITY vrijednost.
  534. Iskoristite tu vrijednost da biste za tu državu umetnuli dva grada.
  535. */
  536. DECLARE @IDDrzavaNovi int
  537. INSERT INTO Drzava VALUES ('Kina')
  538. select SCOPE_IDENTITY()
  539. SET @IDDrzavaNovi = SCOPE_IDENTITY()
  540.  
  541. INSERT INTO Grad VALUES ('Šangaj', @IDDrzavaNovi)
  542. INSERT INTO Grad VALUES ('Peking', @IDDrzavaNovi)
  543. GO
  544.  
  545.  
  546. -- Izrada log tablice.
  547. CREATE TABLE Zapisnik
  548. (
  549.     IDZapisnik int IDENTITY(1,1) PRIMARY KEY,
  550.     Poruka nvarchar(max),
  551.     Vrijeme datetime DEFAULT getdate()
  552. )
  553. GO
  554.  
  555.  
  556. --VJ_04
  557.  
  558. -- Zadatak 1.
  559. /*
  560. Napravite okidaè kojim æete svako umetanje retka u tablicu Grad zapisati u tablicu Zapisnik.
  561. Umetnite redak.
  562. */
  563. CREATE TRIGGER Okidac1 ON Grad AFTER INSERT
  564. AS
  565. INSERT INTO Zapisnik (Poruka) VALUES ('Umetnut redak u Grad!')
  566. GO
  567.  
  568. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 1', 1)
  569.  
  570. SELECT * FROM Zapisnik
  571. GO
  572.  
  573.  
  574. -- Zadatak 2.
  575. /*
  576. Promijenite okidaè tako da zapiše ID i naziv umetnutog grada u Zapisnik.
  577. Umetnite redak.
  578. */
  579. ALTER TRIGGER Okidac1 ON Grad AFTER INSERT
  580. AS
  581. DECLARE @ID int
  582. DECLARE @Naziv nvarchar(50)
  583. SELECT @ID = IDGrad, @Naziv = Naziv FROM inserted
  584.  
  585. INSERT INTO Zapisnik (Poruka) VALUES ('Umetnut redak u Grad. IDGrad: ' + CAST(@ID as nvarchar(50)) + ', Naziv: ' + @Naziv)
  586. GO
  587.  
  588. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 2', 1)
  589.  
  590. SELECT * FROM Zapisnik
  591. GO
  592.  
  593.  
  594. -- Zadatak 3.
  595. /*
  596. Promijenite okidaè tako da se veže uz sve dogaðaje i u Zapisnik zapisuje broj redaka u inserted i deleted tablicama.
  597. Umetnite dva nova grada, promijenite im države i na kraju ih obrišite.
  598. */
  599. ALTER TRIGGER Okidac1 ON Grad AFTER INSERT, UPDATE, DELETE
  600. AS
  601. DECLARE @i int
  602. DECLARE @d int
  603. SELECT @i = COUNT(*) FROM inserted
  604. SELECT @d = COUNT(*) FROM deleted
  605.  
  606. INSERT INTO Zapisnik (Poruka) VALUES ('inserted: ' + CAST(@i as nvarchar(20)) + ', deleted: ' + CAST(@d as nvarchar(20)))
  607. GO
  608.  
  609. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 3', 1)
  610. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 4', 1)
  611. SELECT * FROM Zapisnik
  612.  
  613. UPDATE Grad SET DrzavaID = 2 WHERE Naziv LIKE 'Grad%'
  614. SELECT * FROM Zapisnik
  615.  
  616. DELETE FROM Grad WHERE Naziv LIKE 'Grad%'
  617. SELECT * FROM Zapisnik
  618. GO
  619.  
  620.  
  621. -- Zadatak 4.
  622. /*
  623. Promijenite okidaè tako da upisuje staru i novu vrijednost promijenjenog naziva grada u Zapisnik.
  624. Promijenite naziv jednom gradu.
  625. */
  626. ALTER TRIGGER Okidac1 ON Grad AFTER UPDATE
  627. AS
  628. DECLARE @old nvarchar(50)
  629. DECLARE @new nvarchar(50)
  630. SELECT @old = Naziv FROM deleted
  631. SELECT @new = Naziv FROM inserted
  632.  
  633. INSERT INTO Zapisnik (Poruka) VALUES ('Stara: ' + @old + ', nova: ' + @new)
  634. GO
  635.  
  636. UPDATE Grad SET Naziv = 'Daruvar' WHERE IDGrad = 1
  637. SELECT * FROM Zapisnik
  638. GO
  639.  
  640.  
  641. -- Zadatak 5.
  642. /*
  643. Onemoguæite okidaè iz prethodnih primjera i promijenite neki redak u tablici.
  644. Ponovno ga omoguæite.
  645. Napravite opet promjenu.
  646. Uklonite okidaè.
  647. */
  648. DISABLE TRIGGER Okidac1 ON Grad
  649. GO
  650.  
  651. UPDATE Grad SET Naziv = 'Bjelovar' WHERE IDGrad = 1
  652. SELECT * FROM Zapisnik
  653. GO
  654.  
  655. ENABLE TRIGGER Okidac1 ON Grad
  656. GO
  657.  
  658. UPDATE Grad SET Naziv = 'Vukovar' WHERE IDGrad = 1
  659. SELECT * FROM Zapisnik
  660. GO
  661.  
  662. DROP TRIGGER Okidac1
  663. GO
  664.  
  665. -- Zadatak 6.
  666. /*
  667. Dodajte novi okidaè na tablicu Grad i vežite ga uz sva tri dogaðaja.
  668. U okidaèu saznajte koji dogaðaj ga je pozvao i tu informaciju upišite u Zapisnik.
  669. Napravite umetanje, izmjenu i brisanje nekog retka.
  670. Uklonite okidaè.
  671. */
  672. CREATE TRIGGER Okidac2 ON Grad AFTER INSERT, UPDATE, DELETE
  673. AS
  674. IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) BEGIN
  675.     -- INSERT. 
  676.     INSERT INTO Zapisnik (Poruka) VALUES ('Desio se INSERT.')
  677. END
  678. ELSE IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN
  679.     -- DELETE.
  680.     INSERT INTO Zapisnik (Poruka) VALUES ('Desio se DELETE.')
  681. END
  682. ELSE IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN
  683.     -- UPDATE.
  684.     INSERT INTO Zapisnik (Poruka) VALUES ('Desio se UPDATE.')
  685. END
  686. GO
  687.  
  688. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 5', 1)
  689. SELECT * FROM Zapisnik
  690.  
  691. UPDATE Grad SET Naziv = 'Ilok' WHERE IDGrad = 1
  692. SELECT * FROM Zapisnik
  693.  
  694. DELETE FROM Grad WHERE IDGrad = 76
  695. SELECT * FROM Zapisnik
  696. GO
  697.  
  698. DROP TRIGGER Okidac2
  699. GO
  700.  
  701.  
  702. -- Zadatak 7.
  703. /*
  704. Dodajte novi okidaè i vežite ga uz UPDATE dogaðaj na tablici Grad.
  705. Neka okidaè zapiše u Zapisnik da se desio dogaðaj samo ako je promijenjen stupac DrzavaID.
  706. Uklonite okidaè.
  707. */
  708. CREATE TRIGGER Okidac3 ON Grad AFTER UPDATE
  709. AS
  710. IF UPDATE(DrzavaID) BEGIN
  711.     INSERT INTO Zapisnik (Poruka) VALUES ('Promijenjen je stupac DrzavaID.')
  712. END
  713. GO
  714.  
  715. UPDATE Grad SET Naziv = 'Šibenik' WHERE IDGrad = 1
  716. SELECT * FROM Zapisnik
  717.  
  718. UPDATE Grad SET DrzavaID = 3 WHERE IDGrad = 1
  719. SELECT * FROM Zapisnik
  720. GO
  721.  
  722. DROP TRIGGER Okidac3
  723. GO
  724.  
  725.  
  726.  
  727. -- Zadatak 8.
  728. /*
  729. Dodajte 4 nova okidaèa koji u zapisnik ispisuju "Pozdrav iz broja n" nakon umetanja retka.
  730. Umetnite redak.
  731. Posložite redoslijed okidaèa tako da bude 4, 2, 3, 1.
  732. Umetnite redak.
  733. Vratite originalni redoslijed.
  734. Umetnite redak.
  735. Uklonite okidaèe.
  736. */
  737. CREATE TRIGGER Okidac1 ON Grad AFTER INSERT AS
  738. INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 1')
  739. GO
  740.  
  741. CREATE TRIGGER Okidac2 ON Grad AFTER INSERT AS
  742. INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 2')
  743. GO
  744.  
  745. CREATE TRIGGER Okidac3 ON Grad AFTER INSERT AS
  746. INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 3')
  747. GO
  748.  
  749. CREATE TRIGGER Okidac4 ON Grad AFTER INSERT AS
  750. INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 4')
  751. GO
  752.  
  753. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 6', 1)
  754. SELECT * FROM Zapisnik
  755. GO
  756.  
  757. EXEC sp_settriggerorder 'Okidac4', 'FIRST', 'INSERT'
  758. EXEC sp_settriggerorder 'Okidac1', 'LAST', 'INSERT'
  759. GO
  760.  
  761. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 7', 1)
  762. SELECT * FROM Zapisnik
  763. GO
  764.  
  765. EXEC sp_settriggerorder 'Okidac4', 'NONE', 'INSERT'
  766. EXEC sp_settriggerorder 'Okidac1', 'NONE', 'INSERT'
  767. GO
  768.  
  769. INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 8', 1)
  770. SELECT * FROM Zapisnik
  771. GO
  772.  
  773. DROP TRIGGER Okidac1
  774. DROP TRIGGER Okidac2
  775. DROP TRIGGER Okidac3
  776. DROP TRIGGER Okidac4
  777. GO
  778.  
  779.  
  780. -- Zadatak 9.
  781. /*
  782. Napravite tablice Tbl1 i Tbl2 s proizvoljnim stupcima.
  783. Na Tbl1 napravite okidaè vezan uz INSERT koji umeæe retke u Tbl2 i u Zapisnik.
  784. Na Tbl2 napravite okidaè vezan uz INSERT koji umeæe retke u Tbl1 i u Zapisnik.
  785. Umetnite jedan redak u Tbl1.
  786. Što piše u svakoj od tablica?
  787. */
  788. CREATE TABLE Tbl1
  789. (
  790.     Stupac1 int PRIMARY KEY IDENTITY,
  791.     Stupac2 nvarchar(50)
  792. )
  793. CREATE TABLE Tbl2
  794. (
  795.     Stupac1 int PRIMARY KEY IDENTITY,
  796.     Stupac2 nvarchar(50)
  797. )
  798. GO
  799.  
  800. CREATE TRIGGER Okidac1 ON Tbl1 AFTER INSERT
  801. AS
  802. INSERT INTO Zapisnik (Poruka) VALUES ('Okidaè 1 na tablici 1')
  803. INSERT INTO Tbl2 VALUES ('Upis u drugu tablicu')
  804. GO
  805.  
  806. CREATE TRIGGER Okidac2 ON Tbl2 AFTER INSERT
  807. AS
  808. INSERT INTO Zapisnik (Poruka) VALUES ('Okidaè 2 na tablici 2')
  809. INSERT INTO Tbl1 VALUES ('Upis u prvu tablicu')
  810. GO
  811.  
  812. INSERT INTO Tbl1 VALUES ('Upis u prvu tablicu')
  813. SELECT * FROM Zapisnik
  814. GO
  815.  
  816. SELECT * FROM Tbl1
  817. SELECT * FROM Tbl2
  818. SELECT * FROM Zapisnik
  819.  
  820.  
  821. --VJ_05
  822. -----------------------------------------------------------------------------------
  823. -- Zadatak 1.
  824. -----------------------------------------------------------------------------------
  825. create FUNCTION UkupnaKolicina
  826. (
  827.     @ID int
  828. )
  829. RETURNS int
  830. AS
  831. BEGIN
  832.     DECLARE @Ukupno int
  833.     SELECT @Ukupno = Sum(Kolicina) FROM Stavka WHERE ProizvodID = @ID
  834.     RETURN @Ukupno
  835. END
  836. GO
  837.  
  838. DECLARE @Rez int
  839. SET @Rez = dbo.UkupnaKolicina(776)
  840. PRINT @Rez
  841.  
  842. SELECT
  843.     Naziv,
  844.     Boja,
  845.     dbo.UkupnaKolicina(IDProizvod) AS Prodano
  846. FROM Proizvod
  847. GO
  848.  
  849. ALTER FUNCTION UkupnaKolicina
  850. (
  851.     @ID int
  852. )
  853. RETURNS int
  854. AS
  855. BEGIN
  856.     DECLARE @Ukupno int
  857.  
  858.     SELECT @Ukupno = Sum(Kolicina) FROM Stavka WHERE ProizvodID = @ID
  859.  
  860.     RETURN CASE
  861.                 WHEN @Ukupno IS NOT NULL THEN @Ukupno
  862.                 ELSE 0
  863.             END
  864. END
  865. GO
  866.  
  867. SELECT
  868.     Naziv,
  869.     Boja,
  870.     dbo.UkupnaKolicina(IDProizvod) AS Prodano
  871. FROM Proizvod
  872. GO
  873.  
  874.  
  875. -----------------------------------------------------------------------------------
  876. -- Zadatak 2.
  877. -----------------------------------------------------------------------------------
  878. CREATE FUNCTION Skrati
  879. (
  880.     @s nvarchar(max)
  881. )
  882. RETURNS nvarchar(10)
  883. AS
  884. BEGIN
  885.     RETURN CASE
  886.         WHEN LEN(@s) <= 10 THEN @s
  887.         ELSE SUBSTRING(@s, 1, 7) + '...'
  888.     END
  889. END
  890. GO
  891.  
  892. PRINT dbo.Skrati('Zvonko')
  893. PRINT dbo.Skrati('Zvonko Telefonko')
  894.  
  895. SELECT
  896.     Naziv,
  897.     dbo.Skrati(Naziv) AS NazivSkraceni
  898. FROM Proizvod
  899. GO
  900.  
  901.  
  902. -----------------------------------------------------------------------------------
  903. -- Zadatak 3.
  904. -----------------------------------------------------------------------------------
  905. CREATE FUNCTION GetNajnoviji
  906. (
  907.     @IDKupac int
  908. )
  909. RETURNS datetime
  910. AS
  911. BEGIN
  912.     DECLARE @Datum datetime
  913.    
  914.     SELECT TOP 1 @Datum = DatumIzdavanja FROM dbo.Racun
  915.     WHERE KupacID = @IDKupac
  916.     ORDER BY DatumIzdavanja DESC
  917.    
  918.     RETURN @Datum
  919. END
  920. GO
  921.  
  922. SELECT
  923.     *,
  924.     dbo.GetNajnoviji(IDKupac) AS NajnovijaKupnja
  925. FROM Kupac
  926.  
  927. CREATE NONCLUSTERED INDEX i1 ON dbo.Racun(KupacID) INCLUDE (DatumIzdavanja)
  928. GO
  929.  
  930. -----------------------------------------------------------------------------------
  931. -- Zadatak 4.
  932. -----------------------------------------------------------------------------------
  933. CREATE FUNCTION DohvatiOsobe
  934. (
  935.     @PrezimeLike nvarchar(50)
  936. )
  937. RETURNS TABLE
  938. AS
  939. RETURN
  940.     SELECT IDKupac, Ime, Prezime
  941.     FROM Kupac
  942.     WHERE Prezime LIKE @PrezimeLike + '%'
  943. GO
  944.  
  945. SELECT * FROM DohvatiOsobe('Zhu')
  946.  
  947. SELECT *
  948. FROM DohvatiOsobe('Zhu') AS os
  949. INNER JOIN Racun AS r ON os.IDKupac = r.KupacID
  950. GO
  951.  
  952.  
  953. -----------------------------------------------------------------------------------
  954. -- Zadatak 5.
  955. -----------------------------------------------------------------------------------
  956. CREATE FUNCTION DohvatiRacune
  957. (
  958.     @D1 datetime,
  959.     @D2 datetime
  960. )
  961. RETURNS TABLE
  962. AS
  963. RETURN
  964.     SELECT r.BrojRacuna, r.DatumIzdavanja, k.Ime, k.Prezime
  965.     FROM Racun AS r
  966.     LEFT JOIN dbo.Kupac AS k ON r.KupacID = k.IDKupac
  967.     WHERE r.DatumIzdavanja BETWEEN @D1 AND @D2
  968. GO
  969.  
  970. SELECT * FROM DohvatiRacune('20040601', '20040603')
  971. GO
  972.  
  973. ALTER FUNCTION DohvatiRacune
  974. (
  975.     @D1 datetime,
  976.     @D2 datetime
  977. )
  978. RETURNS TABLE
  979. AS
  980. RETURN
  981.     SELECT r.BrojRacuna, CONVERT(char(10), r.DatumIzdavanja, 104) AS DatumIzdavanja, k.Ime, k.Prezime
  982.     FROM Racun AS r
  983.     LEFT JOIN dbo.Kupac AS k ON r.KupacID = k.IDKupac
  984.     WHERE r.DatumIzdavanja BETWEEN @D1 AND @D2
  985. GO
  986.  
  987. SELECT * FROM DohvatiRacune('20040601', '20040603')
  988. GO
  989.  
  990.  
  991. -----------------------------------------------------------------------------------
  992. -- Zadatak 6.
  993. -----------------------------------------------------------------------------------
  994. CREATE FUNCTION DohvatiRacuneSloz
  995. (
  996.     @D1 datetime,
  997.     @D2 datetime
  998. )
  999. RETURNS @RetVal TABLE ( BrojRacuna nvarchar(25), DatumIzdavanja datetime, Ime nvarchar(50), Prezime nvarchar(50) )
  1000. AS
  1001. BEGIN
  1002.     INSERT INTO @RetVal (BrojRacuna, DatumIzdavanja, Ime, Prezime)
  1003.     SELECT r.BrojRacuna, r.DatumIzdavanja, k.Ime, k.Prezime
  1004.     FROM Racun AS r
  1005.     LEFT JOIN dbo.Kupac AS k ON r.KupacID = k.IDKupac
  1006.     WHERE r.DatumIzdavanja BETWEEN @D1 AND @D2
  1007.    
  1008.     RETURN
  1009. END
  1010. GO
  1011.  
  1012. SELECT * FROM DohvatiRacuneSloz('20040601', '20040603')
  1013. GO
  1014.  
  1015. -----------------------------------------------------------------------------------
  1016. -- Zadatak 7.
  1017. -----------------------------------------------------------------------------------
  1018. CREATE FUNCTION F4
  1019. (
  1020.     @Cijena money
  1021. )
  1022. RETURNS @rez TABLE ( Naziv nvarchar(50), Cijena money )
  1023. AS
  1024. BEGIN
  1025.     IF @Cijena IS NULL BEGIN
  1026.         INSERT INTO @rez (Naziv, Cijena)
  1027.         SELECT Naziv, CijenaBezPDV FROM Proizvod
  1028.     END
  1029.     ELSE BEGIN
  1030.         INSERT INTO @rez (Naziv, Cijena)
  1031.         SELECT Naziv, CijenaBezPDV FROM Proizvod WHERE CijenaBezPDV > @Cijena
  1032.     END
  1033.    
  1034.     RETURN
  1035. END
  1036. GO
  1037.  
  1038. SELECT * FROM F4(NULL)
  1039. SELECT * FROM F4(3000)
  1040. GO
  1041.  
  1042. -----------------------------------------------------------------------------------
  1043. -- Zadatak 8.
  1044. -----------------------------------------------------------------------------------
  1045. CREATE FUNCTION GetDatume
  1046. (
  1047.     @Datum datetime
  1048. )
  1049. RETURNS @RetVal TABLE ( Datum datetime )
  1050. AS
  1051. BEGIN
  1052.     DECLARE @i int = 1
  1053.     WHILE @i <= 5 BEGIN
  1054.         INSERT INTO @RetVal (Datum)
  1055.         VALUES (Dateadd(day, @i, @Datum))
  1056.        
  1057.         SET @i += 1
  1058.     END
  1059.    
  1060.     RETURN
  1061. END
  1062. GO
  1063.  
  1064. SELECT * FROM GetDatume(GETDATE())
  1065. SELECT * FROM GetDatume('20111229')
  1066. GO
  1067.  
  1068.  
  1069. --VJ 07
  1070. -- Zadatak 1.
  1071. -- Optimizirajte upit:
  1072. SELECT PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1073.  
  1074. -- a.) Koliko stranica pregled RDBMS?
  1075. SELECT PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1076. -- (28 row(s) affected)
  1077. -- Table 'Proizvod'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1078. -- logical reads 8
  1079.  
  1080. -- b.) Napravite indeks koji optimizira upit
  1081. CREATE NONCLUSTERED INDEX i1 ON Proizvod(PotkategorijaID)
  1082. GO
  1083.  
  1084. -- c.) Koliko sad stranica pregled RDBMS?
  1085. SELECT PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1086. -- (28 row(s) affected)
  1087. -- Table 'Proizvod'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1088. -- logical reads 2
  1089.  
  1090. -- d.) Uklonite indeks
  1091. DROP INDEX Proizvod.i1
  1092. GO
  1093.  
  1094.  
  1095.  
  1096. -- Zadatak 2.
  1097. -- Optimizirajte upit: SELECT IDProizvod, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1098.  
  1099. -- a.) Koliko stranica pregled RDBMS?
  1100. SELECT IDProizvod, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1101. -- (28 row(s) affected)
  1102. -- Table 'Proizvod'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1103. -- logical reads 8
  1104.  
  1105. -- b.) Napravite indeks koji optimizira upit
  1106. CREATE NONCLUSTERED INDEX i1 ON Proizvod(PotkategorijaID)
  1107. GO
  1108.  
  1109. -- c.) Koliko sad stranica pregled RDBMS?
  1110. SELECT IDProizvod, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1111. -- (28 row(s) affected)
  1112. -- Table 'Proizvod'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1113. -- logical reads 2
  1114.  
  1115. -- d.) Uklonite indeks
  1116. DROP INDEX Proizvod.i1
  1117. GO
  1118.  
  1119.  
  1120. -- Zadatak 3.
  1121. -- Optimizirajte upit:
  1122. -- SELECT ProductID, Name, ProductSubcategoryID FROM Production.Product WHERE ProductSubcategoryID = 12
  1123.  
  1124. SELECT IDProizvod, Naziv, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1125. -- (28 row(s) affected)
  1126. -- Table 'Proizvod'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1127. -- logical reads 8
  1128.  
  1129. CREATE NONCLUSTERED INDEX i1 ON Proizvod(PotkategorijaID)
  1130. GO
  1131.  
  1132. SELECT IDProizvod, Naziv, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1133. -- (28 row(s) affected)
  1134. -- Table 'Proizvod'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1135. -- logical reads 8
  1136.  
  1137. -- a) Pomaže li nam indeks iz prethodnog primjera? Što uèiniti sa stupcem Naziv?
  1138. -- logical reads 8 - mora iæi na klasterirani indeks jer mu nedostaje vrijednost za Naziv.
  1139. DROP INDEX Proizvod.i1
  1140. GO
  1141.  
  1142. CREATE NONCLUSTERED INDEX i1 ON Proizvod(PotkategorijaID) INCLUDE (naziv)
  1143. GO
  1144.  
  1145. SELECT IDProizvod, Naziv, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12
  1146. -- (28 row(s) affected)
  1147. -- Table 'Proizvod'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1148. -- logical reads 2 - sad ne mora iæi na klasterirani indeks.
  1149.  
  1150. DROP INDEX Proizvod.i1
  1151. GO
  1152.  
  1153.  
  1154.  
  1155. -- Zadatak 4.
  1156. -- Optimizirajte upit:
  1157. -- SELECT IDProizvod, Naziv, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12 AND Naziv LIKE 'ML%'
  1158.  
  1159. SELECT IDProizvod, Naziv, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12 AND Naziv LIKE 'ML%'
  1160. -- (8 row(s) affected)
  1161. -- Table 'Proizvod'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1162. -- logical reads 8 - mora iæi na klasterirani indeks jer mu nedostaje vrijednost za Naziv.
  1163. CREATE NONCLUSTERED INDEX i1 ON Proizvod(PotkategorijaID) INCLUDE (naziv)
  1164. GO
  1165.  
  1166. SELECT IDProizvod, Naziv, PotkategorijaID FROM Proizvod WHERE PotkategorijaID = 12 AND Naziv LIKE 'ML%'
  1167. -- (8 row(s) affected)
  1168. -- Table 'Proizvod'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1169. -- logical reads 2 - sad ne mora iæi na klasterirani indeks.
  1170.  
  1171. DROP INDEX Proizvod.i1
  1172. GO
  1173.  
  1174.  
  1175.  
  1176. -- Zadatak 5.
  1177. -- Optimizirajte upit:
  1178. -- SELECT Boja, COUNT(*) AS Cnt FROM Proizvod WHERE PotkategorijaID = 12 GROUP BY Boja ORDER BY Cnt DESC
  1179.  
  1180. SELECT Boja, COUNT(*) AS Cnt FROM Proizvod WHERE PotkategorijaID = 12 GROUP BY Boja ORDER BY Cnt DESC
  1181. -- (2 row(s) affected)
  1182. -- Table 'Proizvod'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1183. -- logical reads 8 - mora iæi na klasterirani indeks jer mu nedostaje vrijednost za Boja.
  1184. CREATE NONCLUSTERED INDEX i1 ON Proizvod(PotkategorijaID) INCLUDE (Boja)
  1185. GO
  1186.  
  1187. SELECT Boja, COUNT(*) AS Cnt FROM Proizvod WHERE PotkategorijaID = 12 GROUP BY Boja ORDER BY Cnt DESC
  1188. -- (2 row(s) affected)
  1189. -- Table 'Proizvod'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1190. -- logical reads 2 - sad ne mora iæi na klasterirani indeks.
  1191.  
  1192. DROP INDEX Proizvod.i1
  1193. GO
  1194.  
  1195.  
  1196.  
  1197.  
  1198. -- Zadatak 6.
  1199. -- Optimizirajte upit:
  1200. -- SELECT DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'  
  1201.  
  1202. -- a.) Koliko stranica pregled RDBMS?
  1203. SELECT DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1204. -- (4 row(s) affected)
  1205. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1206. -- logical reads 202
  1207.  
  1208. -- b.) Napravite indeks koji optimizira upit
  1209. CREATE NONCLUSTERED INDEX i1 ON Racun(DatumIzdavanja)
  1210. GO
  1211.  
  1212. -- c.) Koliko sad stranica pregled RDBMS?
  1213. SELECT DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1214. -- (4 row(s) affected)
  1215. -- Table 'Racun'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1216. -- logical reads 2
  1217.  
  1218. -- d.) Uklonite indeks
  1219. DROP INDEX Racun.i1
  1220. GO
  1221.  
  1222.  
  1223.  
  1224. -- Zadatak 7.
  1225. -- Optimizirajte upit:
  1226. -- SELECT IDRacun, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'  
  1227.  
  1228. -- a.) Koliko stranica pregled RDBMS?
  1229. SELECT IDRacun, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1230. -- (4 row(s) affected)
  1231. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1232. -- logical reads 202
  1233.  
  1234. -- b.) Napravite indeks koji optimizira upit
  1235. CREATE NONCLUSTERED INDEX i1 ON Racun(DatumIzdavanja)
  1236. GO
  1237. -- c.) Koliko sad stranica pregled RDBMS?
  1238. SELECT IDRacun, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1239. -- (4 row(s) affected)
  1240. -- Table 'Racun'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1241. -- logical reads 2
  1242.  
  1243. -- d.) Uklonite indeks
  1244. DROP INDEX Racun.i1
  1245. GO
  1246.  
  1247.  
  1248.  
  1249. -- Zadatak 8.
  1250. -- Optimizirajte upit:
  1251. -- SELECT IDRacun, BrojRacuna, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'  
  1252.  
  1253. SELECT IDRacun, BrojRacuna, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1254. -- (4 row(s) affected)
  1255. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1256. -- logical reads 202
  1257.  
  1258. CREATE NONCLUSTERED INDEX i1 ON Racun(DatumIzdavanja)
  1259. GO
  1260.  
  1261. SELECT IDRacun, BrojRacuna, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1262. -- (4 row(s) affected)
  1263. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1264. -- logical reads 202
  1265.  
  1266. -- a) Pomaže li nam indeks iz prethodnog primjera? Što uèiniti sa stupcem BrojRacuna?
  1267. -- logical reads 202 - mora iæi na klasterirani indeks jer mu nedostaje vrijednost za BrojRacuna.
  1268. DROP INDEX Racun.i1
  1269. GO
  1270.  
  1271. CREATE NONCLUSTERED INDEX i1 ON Racun(DatumIzdavanja) INCLUDE (BrojRacuna)
  1272. GO
  1273.  
  1274. SELECT IDRacun, BrojRacuna, DatumIzdavanja FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59'
  1275. -- (4 row(s) affected)
  1276. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1277. -- logical reads 2 - sad ne mora iæi na klasterirani indeks.
  1278.  
  1279. DROP INDEX Racun.i1
  1280. GO
  1281.  
  1282.  
  1283.  
  1284.  
  1285. -- Zadatak 9.
  1286. -- Optimizirajte upit:
  1287. -- SELECT IDRacun FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59' AND BrojRacuna LIKE 'S%'  
  1288.  
  1289. SELECT IDRacun FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59' AND BrojRacuna LIKE 'S%'
  1290. -- (4 row(s) affected)
  1291. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1292. -- logical reads 202
  1293.  
  1294. CREATE NONCLUSTERED INDEX i1 ON Racun(DatumIzdavanja) INCLUDE (BrojRacuna)
  1295. GO
  1296.  
  1297. SELECT IDRacun FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59' AND BrojRacuna LIKE 'S%'
  1298. -- (4 row(s) affected)
  1299. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1300. -- logical reads 2 - sad ne mora iæi na klasterirani indeks.
  1301.  
  1302. DROP INDEX Racun.i1
  1303. GO
  1304.  
  1305. -- Zadatak 10.
  1306. -- Optimizirajte upit:
  1307. -- SELECT KupacID, COUNT(*) AS Cnt  FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59' GROUP BY KupacID ORDER BY Cnt DESC
  1308.  
  1309. SELECT KupacID, COUNT(*) AS Cnt  FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59' GROUP BY KupacID ORDER BY Cnt DESC
  1310. -- (4 row(s) affected)
  1311. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1312. -- logical reads 202
  1313.  
  1314. CREATE NONCLUSTERED INDEX i1 ON Racun(DatumIzdavanja) INCLUDE (KupacID)
  1315. GO
  1316.  
  1317. SELECT KupacID, COUNT(*) AS Cnt  FROM Racun WHERE DatumIzdavanja BETWEEN '20010702' AND '20010702 23:59:59' GROUP BY KupacID ORDER BY Cnt DESC
  1318. -- (4 row(s) affected)
  1319. -- Table 'Racun'. Scan count 1, logical reads 202, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
  1320. -- logical reads 2 - sad ne mora iæi na klasterirani indeks.
  1321.  
  1322. DROP INDEX Racun.i1
  1323. GO
  1324.  
  1325.  
  1326. --VJ_08
  1327. -- Zadatak 1.
  1328. /*
  1329. PRETVARANJE TIPOVA PODATAKA
  1330. Dohvatite brojeve računa i datume izdavanja za kupca s ID-em 378.
  1331. Datume izdavanja formatirajte na hrvatski naèin.
  1332. */
  1333. SELECT 
  1334.     BrojRacuna,
  1335.     CONVERT(char(10), DatumIzdavanja, 104) AS DatumIzdavanja
  1336. FROM Racun WHERE KupacID = 378
  1337. GO
  1338.  
  1339.  
  1340. -- Zadatak 2.
  1341. /*
  1342. PRETVARANJE TIPOVA PODATAKA
  1343. Napišite proceduru za umetanje zapisa u tablicu Drzava.
  1344. Neka procedura kroz izlazni parametar vrati vrijednost primarnog kljuèa novog zapisa.
  1345. Pozovite proceduru i ispišite vraæenu vrijednost u formatu:
  1346. “Umetnuta je država s ID-em n”, gdje je n vrijednost primarnog kljuèa.
  1347. */
  1348. CREATE PROC p1
  1349.     @Naziv nvarchar(50),
  1350.     @ID int OUTPUT
  1351. AS
  1352. INSERT INTO Drzava (Naziv) VALUES (@Naziv)
  1353. SET @ID = SCOPE_IDENTITY()
  1354. GO
  1355.  
  1356. DECLARE @n int
  1357. EXEC p1 'Gruzija', @n OUTPUT
  1358. PRINT 'Umetnuta je država s ID-em ' + CAST(@n AS nvarchar(10))
  1359. GO
  1360.  
  1361. -- Zadatak 3.
  1362. /*
  1363. PRETVARANJE TIPOVA PODATAKA
  1364. Dohvatite nazive svih proizvoda i uz svaki naziv u zagradi
  1365. ispišite i njegov ID te cijenu,
  1366. npr. “HL Road Rear Wheel (ID = 828, Cijena = 357.06)”
  1367. */
  1368. SELECT
  1369.     Naziv + ' (ID = ' + CAST(IDProizvod AS nvarchar(50)) + ', Cijena = ' + CAST(CijenaBezPDV AS nvarchar(50)) + ')' AS Naziv
  1370. FROM dbo.Proizvod
  1371.  
  1372.  
  1373. -- Zadatak 4.
  1374. /*
  1375. NAREDBA CASE I WHILE
  1376. Dohvatite nazive svih proizvoda i uz svaki naziv ispišite i naziv potkategorije.
  1377. Ako neke potkategorije nema, napišite “Nije definirana”.
  1378. */
  1379. SELECT
  1380.     p.Naziv,
  1381.     CASE
  1382.         WHEN pk.Naziv IS NULL THEN 'Nije definirana'
  1383.         ELSE pk.Naziv
  1384.     END AS NazivPotkategorije
  1385. FROM Proizvod AS p
  1386. LEFT JOIN Potkategorija AS pk ON p.PotkategorijaID = pk.IDPotkategorija
  1387.  
  1388.  
  1389. -- Zadatak 5.
  1390. /*
  1391. NAREDBA CASE I WHILE
  1392. Dohvatite naziv i cijene svih proizvoda.
  1393. Za cijene koje su ispod 1000, napišite “Jeftino”, izmeðu 1000 i 2000
  1394. napišite “Prihvatljivo”, za sve ostale napišite “Skupo”.
  1395. */
  1396. SELECT
  1397.     Naziv,
  1398.     CASE
  1399.         WHEN CijenaBezPDV < 1000 THEN 'Jeftino'
  1400.         WHEN CijenaBezPDV BETWEEN 1000 AND 2000 THEN 'Prihvatljivo'
  1401.         ELSE 'Skupo'
  1402.     END AS Procjena
  1403. FROM Proizvod
  1404. GO
  1405.  
  1406.  
  1407. -- Zadatak 6.
  1408. /*
  1409. NAREDBA CASE I WHILE
  1410. Napravite tablicu Proba sa stupcima IDProba (primarni kljuè i IDENTITY) i Vrijednost (int).
  1411. U stupac Vrijednost unesite vrijednosti izmeðu 10.000.000 i 10.015.000.
  1412. */
  1413. CREATE TABLE Proba ( IDProba int PRIMARY KEY IDENTITY, Vrijednost int )
  1414. GO
  1415.  
  1416. DECLARE @i int = 10000000
  1417. WHILE @i <= 10015000 BEGIN
  1418.     INSERT INTO Proba VALUES (@i)
  1419.     SET @i += 1
  1420. END
  1421.  
  1422. SELECT * FROM Proba
  1423. GO
  1424.  
  1425.  
  1426. -- Zadatak 7.
  1427. /*
  1428. STRUKTURIRANO HVATANJE POGREŠAKA
  1429. Napravite proceduru koja prima dva broja i kroz izlazni parametar
  1430. vraæa prvi broj podijeljen drugim.
  1431. Ako se desi greška, neka procedura u izlazni parametar upiše 0
  1432. i neka ispiše tekst greške.
  1433. Pozovite proceduru i ispišite rezultat dijeljenja.
  1434. */
  1435. create PROC pp2
  1436.     @a int,
  1437.     @b int,
  1438.     @c int OUTPUT
  1439. AS
  1440. BEGIN TRY
  1441.     SET @c = @a / @b
  1442. END TRY
  1443. BEGIN CATCH
  1444.     SET @c = 0
  1445.     PRINT ERROR_MESSAGE()
  1446. END CATCH
  1447. GO
  1448.  
  1449. DECLARE @Rez int
  1450. EXEC pp2 32, 4, @Rez OUTPUT
  1451. PRINT @Rez
  1452.  
  1453. EXEC pp2 32, 0, @Rez OUTPUT
  1454. PRINT @Rez
  1455. GO
  1456.  
  1457.  
  1458. -- Zadatak 8.
  1459. /*
  1460. STRUKTURIRANO HVATANJE POGREŠAKA
  1461. Napravite tablicu Zivotinja koja ima stupce IDZivotinja
  1462. (primarni kljuè, ali nije IDENTITY) i Naziv.
  1463. Napravite proceduru koja prima IDZivotinja i Naziv i umeæe ih u tablicu.
  1464. Pozovite proceduru dva puta s vrijednostima 20 i "Čaplja".
  1465. Implementirajte TRY/CATCH izvan procedure i pozovite je.
  1466. Implementirajte TRY/CATCH unutar procedure i pozovite je.
  1467. */
  1468. CREATE TABLE Zivotinja
  1469. (
  1470.     IDZivotinja int PRIMARY KEY,
  1471.     Naziv nvarchar(50)
  1472. )
  1473. GO
  1474.  
  1475. CREATE PROC InsertZivotinja
  1476.     @IDZivotinja int,
  1477.     @Naziv nvarchar(50)
  1478. AS
  1479. INSERT INTO Zivotinja (IDZivotinja, Naziv) VALUES (@IDZivotinja, @Naziv)
  1480. GO
  1481.  
  1482. EXEC InsertZivotinja 20, 'Èaplja'
  1483. EXEC InsertZivotinja 20, 'Èaplja'
  1484. GO
  1485.  
  1486. BEGIN TRY
  1487.     EXEC InsertZivotinja 20, 'Èaplja'
  1488.     EXEC InsertZivotinja 20, 'Èaplja'
  1489. END TRY
  1490. BEGIN CATCH
  1491.     PRINT 'Error message: ' + cast(ERROR_MESSAGE() as nvarchar(100))
  1492.     PRINT 'Error number: ' + cast(ERROR_NUMBER() as nvarchar(100))
  1493.     PRINT 'Error severity: ' + cast(ERROR_SEVERITY() as nvarchar(100))
  1494.     PRINT 'Error line ' + cast(ERROR_LINE() as nvarchar(100))
  1495.     PRINT 'Error procedure: ' + cast(ERROR_PROCEDURE() as nvarchar(100))
  1496. END CATCH
  1497. GO
  1498.  
  1499. ALTER PROC InsertZivotinja
  1500.     @IDZivotinja int,
  1501.     @Naziv nvarchar(50)
  1502. AS
  1503. BEGIN TRY
  1504.     INSERT INTO Zivotinja (IDZivotinja, Naziv) VALUES (@IDZivotinja, @Naziv)
  1505. END TRY
  1506. BEGIN CATCH
  1507.     PRINT 'Desila se greška: ' + ERROR_MESSAGE()
  1508.     PRINT 'Životinja nije upisana.'
  1509. END CATCH
  1510. GO
  1511.  
  1512. EXEC InsertZivotinja 20, 'Čaplja'
  1513. GO
  1514.  
  1515.  
  1516.  
  1517. -- Zadatak 9.
  1518. /*
  1519. CRUD OPERACIJE
  1520. Svaka operacija posebno.
  1521. Napravite procedure koje rade CRUD operacije
  1522. na tablici Student tako da svakoj operaciji
  1523. dodijelite posebnu proceduru.
  1524. Iskoristite procedure za umetanje, izmjenu,
  1525. dohvaćanje i brisanje zapisa.
  1526. */
  1527.  
  1528. CREATE PROC InsertStudent
  1529.     @IDStudent int OUTPUT,
  1530.     @Ime nvarchar(50),
  1531.     @Prezime nvarchar(50),
  1532.     @JMBAG char(11)
  1533. AS
  1534. INSERT INTO Student (Ime, Prezime, JMBAG) VALUES (@Ime, @Prezime, @JMBAG)
  1535. SET @IDStudent = SCOPE_IDENTITY()
  1536. GO
  1537.  
  1538. CREATE PROC UpdateStudent
  1539.     @IDStudent int,
  1540.     @Ime nvarchar(50),
  1541.     @Prezime nvarchar(50),
  1542.     @JMBAG char(11)
  1543. AS
  1544. UPDATE Student
  1545. SET Ime = @Ime, Prezime = @Prezime, JMBAG = @JMBAG
  1546. WHERE IDStudent = @IDStudent
  1547. GO
  1548.  
  1549. CREATE PROC DeleteStudent
  1550.     @IDStudent int
  1551. AS
  1552. DELETE FROM Student WHERE IDStudent = @IDStudent
  1553. GO
  1554.  
  1555. CREATE PROC GetStudent
  1556.     @IDStudent int
  1557. AS
  1558. SELECT * FROM Student WHERE IDStudent = @IDStudent
  1559. GO
  1560.  
  1561. EXEC GetStudent 1
  1562.  
  1563. DECLARE @NoviIDStudenta int
  1564. EXEC InsertStudent @IDStudent = @NoviIDStudenta OUTPUT,
  1565.     @Ime = 'Ana', @Prezime = 'Aniæ', @JMBAG = '11224451253'
  1566. PRINT @NoviIDStudenta
  1567.  
  1568. EXEC GetStudent 1
  1569.  
  1570. EXEC UpdateStudent 1, 'Ana', 'Aniæ Miriæ', '11224451253'
  1571.  
  1572. EXEC GetStudent 1
  1573.  
  1574. EXEC DeleteStudent 1
  1575.  
  1576. EXEC GetStudent 1
  1577. GO
  1578.  
  1579.  
  1580.  
  1581. -- Zadatak 10.
  1582. /*
  1583. CRUD OPERACIJE
  1584. INSERT/UPDATE zajedno, ostalo posebno.
  1585. Napravite procedure koje rade CRUD operacije na tablici Student
  1586. tako da operacije umetanja i izmjene obavite u jednoj proceduri,
  1587. a druge dvije operacije obavite u posebnim procedurama.
  1588. Iskoristite procedure za umetanje, izmjenu, dohvaæanje i brisanje zapisa.
  1589. */
  1590. CREATE PROC MergeStudent
  1591.     @IDStudent int OUTPUT,
  1592.     @Ime nvarchar(50),
  1593.     @Prezime nvarchar(50),
  1594.     @JMBAG char(11)
  1595. AS
  1596. IF Exists(SELECT * FROM Student WHERE IDStudent = @IDStudent)
  1597.     UPDATE Student
  1598.     SET Ime = @Ime, Prezime = @Prezime, JMBAG = @JMBAG
  1599.     WHERE IDStudent = @IDStudent
  1600. ELSE
  1601.     INSERT INTO Student (Ime, Prezime, JMBAG) VALUES (@Ime, @Prezime, @JMBAG)
  1602.     SET @IDStudent = SCOPE_IDENTITY()
  1603. GO
  1604.  
  1605. CREATE PROC DeleteStudent
  1606.     @IDStudent int
  1607. AS
  1608. DELETE FROM Student WHERE IDStudent = @IDStudent
  1609. GO
  1610.  
  1611. CREATE PROC GetStudent
  1612.     @IDStudent int
  1613. AS
  1614. SELECT * FROM Student WHERE IDStudent = @IDStudent
  1615. GO
  1616.  
  1617. EXEC GetStudent 1
  1618.  
  1619. DECLARE @NoviIDStudenta int
  1620. EXEC MergeStudent @NoviIDStudenta OUTPUT, 'Ana', 'Anić', '11224451253'
  1621. PRINT @NoviIDStudenta
  1622.  
  1623. EXEC GetStudent 2
  1624.  
  1625. EXEC MergeStudent 2, 'Ana', 'Aniæ Mirić', '11224451253'
  1626.  
  1627. EXEC GetStudent 2
  1628.  
  1629. EXEC DeleteStudent 2
  1630.  
  1631. EXEC GetStudent 2
  1632. GO
  1633.  
  1634.  
  1635.  
  1636. -- Zadatak 11.
  1637. /*
  1638. CRUD OPERACIJE
  1639. UPDATE/INSERT/DELETE zajedno.
  1640. Napravite procedure koje rade CRUD operacije na tablici Student
  1641. tako da operacije umetanja, izmjene i brisanja obavite u jednoj proceduri,
  1642. a dohvaćanje u drugoj.
  1643. Iskoristite procedure za umetanje, izmjenu, dohvaæanje i brisanje zapisa.
  1644. */
  1645. CREATE PROC ChangeStudent
  1646.     @Operacija char(1),
  1647.     @IDStudent int OUTPUT,
  1648.     @Ime nvarchar(50),
  1649.     @Prezime nvarchar(50),
  1650.     @JMBAG char(11)
  1651. AS
  1652. IF @Operacija = 'U'
  1653.     UPDATE Student
  1654.     SET Ime = @Ime, Prezime = @Prezime, JMBAG = @JMBAG
  1655.     WHERE IDStudent = @IDStudent
  1656. ELSE IF @Operacija = 'I' BEGIN
  1657.     INSERT INTO Student (Ime, Prezime, JMBAG) VALUES (@Ime, @Prezime, @JMBAG)
  1658.     SET @IDStudent = SCOPE_IDENTITY()
  1659. END
  1660. ELSE IF @Operacija = 'D'
  1661.     DELETE FROM Student WHERE IDStudent = @IDStudent
  1662. GO
  1663.  
  1664. CREATE PROC GetStudent
  1665.     @IDStudent int
  1666. AS
  1667. SELECT * FROM Student WHERE IDStudent = @IDStudent
  1668. GO
  1669.  
  1670. EXEC GetStudent 3
  1671.  
  1672. DECLARE @NoviIDStudenta int
  1673. EXEC ChangeStudent 'I', @NoviIDStudenta OUTPUT, 'Ana', 'Aniæ', '11224451253'
  1674. PRINT @NoviIDStudenta
  1675.  
  1676. EXEC GetStudent 3
  1677.  
  1678. EXEC ChangeStudent 'U', 3, 'Ana', 'Aniæ Miriæ', '11224451253'
  1679.  
  1680. EXEC GetStudent 3
  1681.  
  1682. EXEC ChangeStudent 'D', 3, null, null, null
  1683.  
  1684. EXEC GetStudent 3
  1685. GO
  1686.  
  1687. -- Zadatak 12.
  1688. /*
  1689. CRUD OPERACIJE
  1690. Za tablicu Student koja se sastoji od IDStudent, Ime, Prezime i JMBAG
  1691. implementirajte tabličnom funkcijom operaciju SELECT.
  1692. Iskoristite funkciju za dohvaćanje zapisa.
  1693. */
  1694.  
  1695. create function fStudent
  1696. (
  1697.     @IDStudent int
  1698. )
  1699. returns table
  1700. as
  1701. return
  1702.     select *
  1703.     from Student
  1704.     where IDStudent=@IDStudent
  1705. go
  1706.  
  1707. select * from dbo.fStudent(5)
  1708. ------------------------------------
  1709. -----------------------------------------------------------------------------------
  1710.  
  1711. -----------------------------------------------------------------------------------
  1712. -- Zadatak 1.
  1713. /*
  1714. RAD SA STRINGOVIMA (1)
  1715. Napisati funkciju koja prima string i vraæa novi string sastavljen od:
  1716.     druga polovica stringa + prva polovica stringa.
  1717. Ako ulazni string ima neparan broj znakova,
  1718. neka u prvoj polovici bude manji broj znakova
  1719. (primjerice, za "Slon" treba vratiti "onSl", za "Mirko" treba "rkoMi").
  1720. */
  1721. CREATE FUNCTION dbo.Obrni
  1722. (
  1723.     @s nvarchar(max)
  1724. )
  1725. RETURNS nvarchar(max)
  1726. AS
  1727. BEGIN
  1728.     DECLARE @d1 nvarchar(max)
  1729.     DECLARE @d2 nvarchar(max)
  1730.     DECLARE @duljina1 int
  1731.     DECLARE @duljina2 int
  1732.  
  1733.     SET @duljina1 = LEN(@s) / 2
  1734.     SET @duljina2 = LEN(@s) - @duljina1
  1735.    
  1736.     SET @d1 = SUBSTRING(@s, 1, @duljina1)
  1737.     SET @d2 = SUBSTRING(@s, @duljina1 + 1, @duljina2)
  1738.  
  1739.     RETURN @d2 + @d1
  1740. END
  1741. GO
  1742. -- Pozvati funkciju s nekim parametrom i ispisati rezultat.
  1743. PRINT dbo.Obrni('Slon')
  1744. PRINT dbo.Obrni('Mirko')
  1745. -- Ispisati obrnuti naziv svakog proizvoda iz tablice Proizvod.
  1746. SELECT dbo.Obrni(Naziv) FROM Proizvod
  1747. GO
  1748. -----------------------------------------------------------------------------------
  1749.  
  1750. -----------------------------------------------------------------------------------
  1751. -- Zadatak 2.
  1752. /*
  1753. RAD SA STRINGOVIMA (2)
  1754. Napisati funkciju koja prima string i koja vraæa broj pojavljivanja slova 'a' u tom stringu.
  1755. */
  1756. CREATE FUNCTION dbo.BrojSlovaA
  1757. (
  1758.     @s nvarchar(max)
  1759. )
  1760. RETURNS int
  1761. AS
  1762. BEGIN
  1763.     DECLARE @curr int
  1764.     DECLARE @next int
  1765.     DECLARE @broj int
  1766.  
  1767.     SET @curr = 1
  1768.     SET @next = 1
  1769.     SET @broj = 0
  1770.     WHILE @next > 0 BEGIN
  1771.         SET @next = CHARINDEX('a', @s, @curr)
  1772.         IF @next > 0
  1773.             SET @broj = @broj + 1
  1774.  
  1775.         SET @curr = @next + 1
  1776.     END
  1777.     RETURN @broj
  1778. END
  1779. GO
  1780. -- Pozvati funkciju s nekim parametrom i ispisati rezultat.
  1781. PRINT dbo.BrojSlovaA('Juro')
  1782. PRINT dbo.BrojSlovaA('Ana')
  1783. PRINT dbo.BrojSlovaA('Ankica')
  1784. PRINT dbo.BrojSlovaA('Anakonda')
  1785. -- Dohvatiti sve proizvode iz i pokraj svakog ispisati broj pojavljivanja slova 'a' u nazivu.
  1786. SELECT *, dbo.BrojSlovaA(Naziv) AS BrojSlovaA FROM Proizvod
  1787. GO
  1788. -----------------------------------------------------------------------------------
  1789.  
  1790. -----------------------------------------------------------------------------------
  1791. -- Zadatak 3.
  1792. /*
  1793. RAD SA STRINGOVIMA (2)
  1794. Napisati funkciju koja prima string i koja vraæa broj samoglasnika u tom stringu.
  1795. */
  1796. CREATE FUNCTION dbo.BrojSamoglasnika
  1797. (
  1798.     @s nvarchar(max)
  1799. )
  1800. RETURNS int
  1801. AS
  1802. BEGIN
  1803.     DECLARE @i int
  1804.     DECLARE @broj int
  1805.     DECLARE @znak char(1)
  1806.  
  1807.     SET @i = 1
  1808.     SET @broj = 0
  1809.     WHILE @i <= LEN(@s) BEGIN
  1810.         SET @znak = SUBSTRING(@s, @i, 1)
  1811.         IF @znak IN ('a', 'e', 'i', 'o', 'u')
  1812.             SET @broj = @broj + 1
  1813.  
  1814.         SET @i = @i + 1
  1815.     END
  1816.     RETURN @broj
  1817. END
  1818. GO
  1819. -- Pozvati funkciju s nekim parametrom i ispisati rezultat.
  1820. PRINT dbo.BrojSamoglasnika('Juro')
  1821. PRINT dbo.BrojSamoglasnika('Ana')
  1822. PRINT dbo.BrojSamoglasnika('Ankica')
  1823. PRINT dbo.BrojSamoglasnika('Anakonda')
  1824. -- Dohvatiti sve proizvode iz i pokraj svakog ispisati broj samoglasnika u nazivu.
  1825. SELECT *, dbo.BrojSamoglasnika(Naziv) AS BrojSamoglasnika FROM Proizvod
  1826. GO
  1827. -----------------------------------------------------------------------------------
  1828.  
  1829. -----------------------------------------------------------------------------------
  1830. -- Zadatak 4.
  1831. /*
  1832. XML (1)
  1833. Napisati proceduru koja prima XML dokument oblika:
  1834. <Gradovi>
  1835.     <Grad>Karlovac</Grad>
  1836.     …
  1837. </Gradovi>
  1838. Neka procedura vrati tablicu s nazivima svih gradova.
  1839. */
  1840. CREATE PROC IspisiNazive
  1841.     @gradovi xml
  1842. AS
  1843. SELECT
  1844.     Tablica.Stupac.value('.', 'nvarchar(50)') AS Grad
  1845. FROM @gradovi.nodes('/Gradovi/Grad') AS Tablica(Stupac)
  1846. GO
  1847. -- Pozvati proceduru  s nekim parametrom.
  1848. EXEC IspisiNazive '<Gradovi><Grad>Karlovac</Grad><Grad>Sisak</Grad><Grad>Kutina</Grad></Gradovi>'
  1849. GO
  1850. -----------------------------------------------------------------------------------
  1851.  
  1852. -----------------------------------------------------------------------------------
  1853. -- Zadatak 5.
  1854. /*
  1855. XML (1)
  1856. Proširiti prethodni XML dokument tako da svaki grad sadržava atribut "PostanskiBroj".
  1857. Promijeniti proceduru tako da uz naziv grada ispisuje i poštanski broj.
  1858. */
  1859. ALTER PROC IspisiNazive
  1860.     @gradovi xml
  1861. AS
  1862. SELECT
  1863.     Tablica.Stupac.value('.', 'nvarchar(50)') AS Grad,
  1864.     Tablica.Stupac.value('@Pbr', 'nvarchar(5)') AS Pbr
  1865. FROM @gradovi.nodes('/Gradovi/Grad') AS Tablica(Stupac)
  1866. GO
  1867. -- Pozvati proceduru  s nekim parametrom.
  1868. EXEC IspisiNazive '<Gradovi><Grad Pbr="10000">Zagreb</Grad><Grad Pbr="31000">Osijek</Grad></Gradovi>'
  1869. GO
  1870. -----------------------------------------------------------------------------------
  1871.  
  1872. -----------------------------------------------------------------------------------
  1873. -- Zadatak 6.
  1874. /*
  1875. XML (2)
  1876. Napisati proceduru koja prima XML dokument oblika:
  1877. <Kupci>
  1878.     <Kupac>
  1879.         <Ime>Mirko</Ime>
  1880.         <Prezime>Mirkiæ</Prezime>
  1881.         <Grad>Osijek</Grad>
  1882.     </Kupac>
  1883.     …
  1884. </Kupci>
  1885. Neka procedura vrati dva skupa redaka:
  1886. - Prezimena svih kupaca poslagana abecednim redom
  1887. - Nazive gradova. Ako ima više kupaca iz istog grada, grad treba ispisati samo jednom.
  1888. */
  1889. CREATE PROC Zad6
  1890.     @dok xml
  1891. AS
  1892. SELECT
  1893.     Tablica.Stupac.value('.', 'nvarchar(50)') AS Prezime
  1894. FROM @dok.nodes('/Kupci/Kupac/Prezime') AS Tablica(Stupac)
  1895. ORDER BY Prezime
  1896.  
  1897. SELECT DISTINCT
  1898.     Tablica.Stupac.value('.', 'nvarchar(50)') AS Grad
  1899. FROM @dok.nodes('/Kupci/Kupac/Grad') AS Tablica(Stupac)
  1900. GO
  1901. -- Pozvati proceduru  s nekim parametrom. Provjera da li vraæa dva skupa redaka.
  1902. EXEC Zad6 '
  1903.     <Kupci>
  1904.         <Kupac>
  1905.             <Ime>Mirko</Ime>
  1906.             <Prezime>Mirkiæ</Prezime>
  1907.             <Grad>Osijek</Grad>
  1908.         </Kupac>
  1909.         <Kupac>
  1910.             <Ime>Ana</Ime>
  1911.             <Prezime>Aniæ</Prezime>
  1912.             <Grad>Osijek</Grad>
  1913.         </Kupac>
  1914.     </Kupci>'
  1915. GO
  1916. -----------------------------------------------------------------------------------
  1917. -----------------------------------------------------------------------------------
  1918. -- Zadatak 7.
  1919. /*
  1920. XML (3)
  1921. Napisati proceduru koja prima XML dokument oblika:
  1922. <Osobe>
  1923.     <Osoba ID="1">Ana Aniæ</Osoba>
  1924.     <Osoba ID="2">Mira Miriæ</Osoba>
  1925.     …
  1926. </Osobe>
  1927. Neka procedura vrati imena i prezimena te ID-eve svih osoba.
  1928. Svaki ID treba nadopuniti s nulama s lijeve strane na duljinu od 5 znakova
  1929. (Primjerice, za ID = 1 treba ispisati “00001”, za ID = “176” treba ispisati “00176”)
  1930. */
  1931. CREATE PROC Zad7
  1932.     @dok xml
  1933. AS
  1934. SELECT
  1935.     Tablica.Stupac.value('.', 'nvarchar(50)') AS ImePrezime,
  1936.     CASE  
  1937.         WHEN LEN(Tablica.Stupac.value('@ID', 'nvarchar(50)')) = 1 THEN '0000' + Tablica.Stupac.value('@ID', 'nvarchar(50)')
  1938.         WHEN LEN(Tablica.Stupac.value('@ID', 'nvarchar(50)')) = 2 THEN  '000' + Tablica.Stupac.value('@ID', 'nvarchar(50)')
  1939.         WHEN LEN(Tablica.Stupac.value('@ID', 'nvarchar(50)')) = 3 THEN   '00' + Tablica.Stupac.value('@ID', 'nvarchar(50)')
  1940.         WHEN LEN(Tablica.Stupac.value('@ID', 'nvarchar(50)')) = 4 THEN    '0' + Tablica.Stupac.value('@ID', 'nvarchar(50)')
  1941.         WHEN LEN(Tablica.Stupac.value('@ID', 'nvarchar(50)')) = 5 THEN          Tablica.Stupac.value('@ID', 'nvarchar(50)')
  1942.     END AS ID
  1943. FROM @dok.nodes('/Osobe/Osoba') AS Tablica(Stupac)
  1944. GO
  1945. -- Pozvati proceduru  s nekim parametrom.
  1946. EXEC zad7
  1947.     '<Osobe>
  1948.         <Osoba ID="1">Ana Aniæ</Osoba>
  1949.         <Osoba ID="35">Maja Majiæ</Osoba>
  1950.         <Osoba ID="158">Tanja Tanjiæ</Osoba>
  1951.         <Osoba ID="85002">Vera Veriæ</Osoba>
  1952.     </Osobe>'
  1953. GO
  1954. -----------------------------------------------------------------------------------
  1955. -----------------------------------------------------------------------------------
  1956.  
  1957. -----------------------------------------------------------------------------------
  1958. -----------------------------------------------------------------------------------
  1959. -- Zadatak 1.
  1960. /*
  1961. KORISNIÈKI DEFINIRANI TABLIÈNI TIPOVI
  1962. Napišite proceduru koja dohvaæa sve kupce èiji ID-evi su proslijeðeni
  1963. pomoæu korisnièki definiranog tabliènog tipa.
  1964. */
  1965. -- Kreiranje korisnièki definiranog tipa
  1966. CREATE TYPE MyKupac AS TABLE ( IDKupac int )
  1967. GO
  1968. -- Stvaranje procedure
  1969. CREATE PROC zad8
  1970.     @Kupci MyKupac READONLY
  1971. AS
  1972. SELECT * FROM dbo.Kupac WHERE IDKupac IN (SELECT * FROM @Kupci)
  1973. GO
  1974. -- Pozivanje procedure.
  1975. DECLARE @t MyKupac
  1976. INSERT INTO @t VALUES (1)
  1977. INSERT INTO @t VALUES (2)
  1978. INSERT INTO @t VALUES (3)
  1979. EXEC zad8 @t
  1980. GO
  1981. -----------------------------------------------------------------------------------
  1982.  
  1983. -----------------------------------------------------------------------------------
  1984. -- Zadatak 2.
  1985. /*
  1986. KORISNIÈKI DEFINIRANI TABLIÈNI TIPOVI
  1987. Napišite proceduru koja umeæe države proslijeðene
  1988. pomoæu korisnièki definiranog tabliènog tipa.
  1989. Pozovite proceduru.
  1990. */
  1991. -- Kreiranje korisnièki definiranog tipa
  1992. CREATE TYPE MyDrzava AS TABLE ( Naziv nvarchar(50) )
  1993. GO
  1994. -- Stvaranje procedure
  1995. CREATE PROC zad9
  1996.     @Drzave MyDrzava READONLY
  1997. AS
  1998. INSERT INTO Drzava
  1999. SELECT * FROM @Drzave
  2000. GO
  2001. -- Pozivanje procedure.
  2002. DECLARE @t MyDrzava
  2003. INSERT INTO @t VALUES ('Indija')
  2004. INSERT INTO @t VALUES ('Pakistan')
  2005. INSERT INTO @t VALUES ('Bangladeš')
  2006. EXEC zad9 @t
  2007. GO
  2008. select * from drzava
  2009. -----------------------------------------------------------------------------------
  2010. -----------------------------------------------------------------------------------
  2011. -- Zadatak 3.
  2012. /*
  2013. KORISNIÈKI DEFINIRANI TABLIÈNI TIPOVI
  2014. Napišite proceduru koja umeæe potkategorije proslijeðene
  2015. pomoæu korisnièki definiranog tabliènog tipa.
  2016. Umetnuti samo onu potkategoriju koja ne postoji u tablici
  2017. (ako postoji nemojte umetati ponovno).
  2018. Pozovite proceduru.
  2019. */
  2020. -- Kreiranje korisnièki definiranog tipa
  2021. CREATE TYPE MyPotkategorija AS TABLE ( KategorijaID int, Naziv nvarchar(50) )
  2022. GO
  2023. -- Stvaranje procedure
  2024. CREATE PROC zad10
  2025.     @Potk MyPotkategorija READONLY
  2026. AS
  2027. INSERT INTO Potkategorija
  2028. SELECT KategorijaID, Naziv FROM @Potk WHERE Naziv NOT IN (SELECT Naziv FROM Potkategorija)
  2029. GO
  2030. -- Pozivanje procedure.
  2031. DECLARE @t MyPotkategorija
  2032. INSERT INTO @t VALUES (1, 'Mountain Bikes')
  2033. INSERT INTO @t VALUES (1, 'Ninja Bikes')
  2034. EXEC zad10 @t
  2035. GO
  2036.  
  2037. select * from Potkategorija
  2038. -----------------------------------------------------------------------------------
  2039. -----------------------------------------------------------------------------------
  2040. -- Zadatak 4.
  2041. /*
  2042. Napisati proceduru koja prima JSON dokument oblika:
  2043.  
  2044. {"OSOBE":
  2045.     [
  2046.         {"OSOBA":
  2047.             {"ime": "Pero", "prezime": "Perić"}},
  2048.         {"OSOBA":
  2049.             {"ime": "Iva", "prezime": "Ivić"}}   ]
  2050. }
  2051.  
  2052. Neka procedura vrati tablicu s imenima i prezimenima osoba.
  2053. Pozvati proceduru s gornjim parametrom.
  2054. */
  2055.  
  2056. create proc p11
  2057.     @json nvarchar(max)
  2058. as
  2059. select ime, prezime
  2060. from openjson(@json, '$.OSOBE')    
  2061. with       
  2062. (
  2063.     Ime nvarchar(50) '$.OSOBA.ime',
  2064.     Prezime nvarchar(50) '$.OSOBA.prezime'
  2065. )
  2066.  
  2067.  
  2068. declare @json nvarchar(max)
  2069. set @json=
  2070. '{"OSOBE": 
  2071.         [
  2072.             {"OSOBA":
  2073.                     {
  2074.                         "ime": "Pero", 
  2075.                         "prezime": "Perić"
  2076.                     }
  2077.             },
  2078.             {"OSOBA":
  2079.                     {
  2080.                         "ime": "Iva",  
  2081.                         "prezime": "Ivić"
  2082.                     }
  2083.             }
  2084.         ]}'
  2085.  
  2086. exec p11 @json
  2087. -----------------------------------------------------------------------------------
  2088. -----------------------------------------------------------------------------------
  2089. -- Zadatak 5.
  2090. /*
  2091. Napisati proceduru koja prima JSON dokument oblika:
  2092.  
  2093. N‘ { "OSOBE":
  2094.     [ { "OSOBA":
  2095.         { "idosoba": 2,  "ime": "Iva",  "prezime": "Ivić",  "ostalo":
  2096.             {"email": "iva.ivic@algebra.hr", "telefon": "091 222 3333” } } } ] } '
  2097.  
  2098. Neka procedura vrati tablicu s imenima, prezimenima i telefonskim brojevima osoba.
  2099. Pozvati proceduru s gornjim parametrom.
  2100. */
  2101.  
  2102. create proc p12
  2103.     @json nvarchar(max)
  2104. as
  2105. select ime, prezime, telefon
  2106. from openjson(@json, '$.OSOBE')    
  2107. with       
  2108. (
  2109.     Ime nvarchar(50) '$.OSOBA.ime',
  2110.     Prezime nvarchar(50) '$.OSOBA.prezime',
  2111.     Telefon nvarchar(50) '$.OSOBA.ostalo.telefon'
  2112. )
  2113. go
  2114.  
  2115. declare @json nvarchar(max)
  2116. set @json=
  2117. N'{"OSOBE":
  2118.         [
  2119.             {"OSOBA":
  2120.                     {"idosoba": 2,
  2121.                      "ime": "Iva", 
  2122.                      "prezime": "Ivić",           
  2123.                      "ostalo":
  2124.                         {"email": "iva.ivic@algebra.hr",
  2125.                          "telefon": "091 222 3333"}}}]}'
  2126. exec p12 @json
  2127. -----------------------------------------------------------------------------------
  2128. -----------------------------------------------------------------------------------
  2129. -- Zadatak 6.
  2130. /*
  2131. Napišite upit kojim ćete s podacima IDKupac, Ime, Prezime, Email i Telefon iz tablice Kupac
  2132. kreirati JSON dokument oblika kako je prikazano niže, za sve kupce koji imaju IDKupac<11:
  2133. {"OSOBE":
  2134.     [
  2135.     {"OSOBA":
  2136.         {"idkupac":1,"ime":"Gustavo","prezime":"Achong",
  2137.             "ostalo":{"email":"gustavo0@adventure-works.com","telefon":"398-555-0132"}}}
  2138.     ]}
  2139. */
  2140. select k.IDKupac as [OSOBA.idkupac], k.Ime as [OSOBA.ime], k.prezime as [OSOBA.prezime],
  2141. email as [OSOBA.ostalo.email],
  2142. telefon as [OSOBA.ostalo.telefon]
  2143. from Kupac as k
  2144. where k.IDKupac<11
  2145. for json path, root('OSOBE')
  2146.  
  2147.  
  2148. ----------------------------------------------------------------------------------
  2149. -- Kreiranje pomoæne tablice
  2150. /*
  2151. Napravite tablicu Osoba s IDOsoba (PK i IDENTITY), Ime i Prezime.
  2152. */
  2153. CREATE TABLE Osoba
  2154. (
  2155.     IDOsoba int PRIMARY KEY IDENTITY,
  2156.     Ime nvarchar(50),
  2157.     Prezime nvarchar(50)
  2158. )
  2159. GO
  2160. -----------------------------------------------------------------------------------
  2161. -- Zadatak 1.
  2162. /*
  2163. TRANSAKCIJE (1)
  2164. U transakciji umetnite 3 zapisa u Osoba i na kraju odustanite od transakcije.
  2165. */
  2166. SELECT * FROM Osoba
  2167.  
  2168. BEGIN TRAN
  2169.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2170.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2171.     INSERT INTO Osoba VALUES ('Iva', 'Iviæ')
  2172.     SELECT * FROM Osoba
  2173. ROLLBACK TRAN
  2174.  
  2175. SELECT * FROM Osoba
  2176. GO
  2177.  
  2178. -----------------------------------------------------------------------------------
  2179. -- Zadatak 2.
  2180. /*
  2181. TRANSAKCIJE (1)
  2182. U transakciji umetnite 3 zapisa u Osoba i na kraju potvrdite transakciju.
  2183. */
  2184. SELECT * FROM Osoba
  2185.  
  2186. BEGIN TRAN
  2187.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2188.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2189.     INSERT INTO Osoba VALUES ('Iva', 'Iviæ')
  2190.     SELECT * FROM Osoba
  2191. COMMIT TRAN
  2192.  
  2193. SELECT * FROM Osoba
  2194. GO
  2195.  
  2196. -----------------------------------------------------------------------------------
  2197. -- Zadatak 3.
  2198. /*
  2199. TRANSAKCIJE (1)
  2200. U transakciji umetnite 1 zapis u Osoba i postavite kontrolnu toèku.
  2201. Umetnite još 1 zapis.
  2202. Na kraju odustanite od transakcije.
  2203. */
  2204.  
  2205. SELECT * FROM Osoba
  2206.  
  2207. DELETE Osoba
  2208.  
  2209. BEGIN TRAN
  2210.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2211.     SAVE TRAN cp1
  2212.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2213.     SELECT * FROM Osoba
  2214. ROLLBACK TRAN
  2215.  
  2216. SELECT * FROM Osoba
  2217. GO
  2218.  
  2219. -----------------------------------------------------------------------------------
  2220. -- Zadatak 4.
  2221. /*
  2222. TRANSAKCIJE (1)
  2223. U transakciji umetnite 1 zapis u Osoba i postavite kontrolnu toèku.
  2224. Umetnite još 1 zapis.
  2225. Na kraju potvrdite transakciju.
  2226. */
  2227.  
  2228. SELECT * FROM Osoba
  2229.  
  2230. DELETE Osoba
  2231.  
  2232. BEGIN TRAN
  2233.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2234.     SAVE TRAN cp1
  2235.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2236.     SELECT * FROM Osoba
  2237. COMMIT TRAN
  2238.  
  2239. SELECT * FROM Osoba
  2240. GO
  2241.  
  2242. -----------------------------------------------------------------------------------
  2243. -- Zadatak 5.
  2244. /*
  2245. TRANSAKCIJE (2)
  2246. U transakciji umetnite 1 zapis u Osoba i postavite kontrolnu toèku.
  2247. Umetnite još 1 zapis i postavite kontrolnu toèku.
  2248. Na kraju odustanite od transakcije.
  2249. */
  2250. SELECT * FROM Osoba
  2251.  
  2252. DELETE Osoba
  2253.  
  2254. BEGIN TRAN
  2255.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2256.     SAVE TRAN cp1
  2257.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2258.     SAVE TRAN cp2
  2259.     SELECT * FROM Osoba
  2260. ROLLBACK TRAN
  2261.  
  2262. SELECT * FROM Osoba
  2263. GO
  2264.  
  2265. -----------------------------------------------------------------------------------
  2266. -- Zadatak 6.
  2267. /*
  2268. TRANSAKCIJE (2)
  2269. U transakciji umetnite 1 zapis u Osoba i postavite kontrolnu toèku.
  2270. Umetnite još 1 zapis i postavite kontrolnu toèku.
  2271. Na kraju potvrdite transakciju.
  2272. */
  2273. SELECT * FROM Osoba
  2274.  
  2275. DELETE Osoba
  2276.  
  2277. BEGIN TRAN
  2278.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2279.     SAVE TRAN cp1
  2280.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2281.     SAVE TRAN cp2
  2282.     SELECT * FROM Osoba
  2283. COMMIT TRAN
  2284.  
  2285. SELECT * FROM Osoba
  2286. GO
  2287.  
  2288. -----------------------------------------------------------------------------------
  2289. -- Zadatak 7.
  2290. /*
  2291. TRANSAKCIJE (2)
  2292. U transakciji umetnite 1 zapis u Osoba i postavite kontrolnu toèku.
  2293. Umetnite još 1 zapis i vratite se na kontrolnu toèku.
  2294. Na kraju odustanite od transakcije.
  2295. */
  2296. SELECT * FROM Osoba
  2297.  
  2298. DELETE Osoba
  2299.  
  2300. BEGIN TRAN
  2301.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2302.     SAVE TRAN cp1
  2303.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2304.     SELECT * FROM Osoba
  2305.     ROLLBACK TRAN cp1
  2306.     SELECT * FROM Osoba
  2307. ROLLBACK TRAN
  2308.  
  2309. SELECT * FROM Osoba
  2310. GO
  2311.  
  2312. -----------------------------------------------------------------------------------
  2313. -- Zadatak 8.
  2314. /*
  2315. TRANSAKCIJE (2)
  2316. U transakciji umetnite 1 zapis u Osoba i postavite kontrolnu toèku.
  2317. Umetnite još 1 zapis i vratite se na kontrolnu toèku.
  2318. Na kraju potvrdite transakciju.
  2319. */
  2320.  
  2321. SELECT * FROM Osoba
  2322.  
  2323. BEGIN TRAN
  2324.     INSERT INTO Osoba VALUES ('Miro', 'Miriæ')
  2325.     SAVE TRAN cp1
  2326.     INSERT INTO Osoba VALUES ('Ana', 'Aniæ')
  2327.     SELECT * FROM Osoba
  2328.     ROLLBACK TRAN cp1
  2329.     SELECT * FROM Osoba
  2330. COMMIT TRAN
  2331.  
  2332. SELECT * FROM Osoba
  2333. GO
  2334.  
  2335. DELETE Osoba
  2336.  
  2337. -----------------------------------------------------------------------------------
  2338. -- Zadatak 9.
  2339. /*
  2340. TRANSAKCIJE (3)
  2341. Napišite proceduru za brisanje države. Neka procedura prima 1 parametar, IDDrzava.
  2342. Transakciju vodite izvan procedure.
  2343. Ispišite uspjeh ili neuspjeh.
  2344. - Pozovite 3 puta proceduru s vrijednostima parametara jednakim 50, 51 i 52.
  2345. - Pozovite 3 puta proceduru s vrijednostima parametara jednakim 50, 51 i 1.
  2346. */
  2347. -- Napišite proceduru za brisanje države. Neka procedura prima 1 parametar, IDDrzava.
  2348. CREATE PROC p9
  2349.     @IDDrzava int
  2350. AS
  2351. DELETE FROM Drzava WHERE IDDrzava = @IDDrzava
  2352. GO
  2353. -- Transakciju vodite izvan procedure.
  2354. -- Ispišite uspjeh ili neuspjeh.
  2355. -- Pozovite 3 puta proceduru s vrijednostima parametara jednakim 50, 51 i 52.
  2356. BEGIN TRY
  2357.     BEGIN TRAN
  2358.         EXEC p9 50
  2359.         EXEC p9 51
  2360.         EXEC p9 52
  2361.     COMMIT TRAN
  2362.     PRINT 'Brisanje uspješno'
  2363. END TRY
  2364. BEGIN CATCH
  2365.     ROLLBACK TRAN
  2366.     PRINT 'Greška pri brisanju'
  2367. END CATCH
  2368. GO
  2369. -- Transakciju vodite izvan procedure.
  2370. -- Ispišite uspjeh ili neuspjeh.
  2371. -- Pozovite 3 puta proceduru s vrijednostima parametara jednakim 50, 51 i 1.
  2372. BEGIN TRY
  2373.     BEGIN TRAN
  2374.         EXEC p9 50
  2375.         EXEC p9 51
  2376.         EXEC p9 1
  2377.     COMMIT TRAN
  2378.     PRINT 'Brisanje uspješno'
  2379. END TRY
  2380. BEGIN CATCH
  2381.     ROLLBACK TRAN
  2382.     PRINT 'Greška pri brisanju'
  2383. END CATCH
  2384. GO
  2385.  
  2386. -----------------------------------------------------------------------------------
  2387. -- Zadatak 10.
  2388. /*
  2389. TRANSAKCIJE (3)
  2390. Napišite proceduru s 3 parametra za brisanje triju država.
  2391. Transakciju vodite unutar procedure.
  2392. Ispišite uspjeh ili neuspjeh.
  2393. Pozovite proceduru s vrijednostima 50, 51 i 52.
  2394. Pozovite proceduru s vrijednostima 50, 51 i 1.
  2395. */
  2396. create PROC p10
  2397.     @IDDrzava1 int,
  2398.     @IDDrzava2 int,
  2399.     @IDDrzava3 int
  2400. AS
  2401. BEGIN TRY
  2402.     BEGIN TRAN
  2403.         DELETE FROM Drzava WHERE IDDrzava = @IDDrzava1
  2404.         DELETE FROM Drzava WHERE IDDrzava = @IDDrzava2
  2405.         DELETE FROM Drzava WHERE IDDrzava = @IDDrzava3
  2406.     COMMIT TRAN
  2407.     PRINT 'Brisanje uspješno'
  2408. END TRY
  2409. BEGIN CATCH
  2410.     ROLLBACK TRAN
  2411.     PRINT 'Greška pri brisanju: '  + ERROR_MESSAGE()
  2412. END CATCH
  2413. GO
  2414. -- Pozovite proceduru s vrijednostima 50, 51 i 52.
  2415. EXEC p10 50, 51, 52
  2416. -- Pozovite proceduru s vrijednostima 50, 51 i 1.
  2417. EXEC p10 50, 51, 1
  2418. GO
  2419.  
  2420. -----------------------------------------------------------------------------------
  2421. -- Zadatak 11.
  2422. /*
  2423. TRANSAKCIJE (4)
  2424. Unutar vanjske transakcije pozovite prethodnu proceduru s vrijednostima 50, 51 i 52.
  2425. Nakon toga odustanite od vanjske transakcije.
  2426. Ispišite uspjeh ili neuspjeh.
  2427. Je li brisanje napravljeno?
  2428. */
  2429. BEGIN TRY
  2430.     BEGIN TRAN
  2431.         EXEC p10 50, 51, 52
  2432.     ROLLBACK TRAN
  2433.     PRINT 'Sve OK, ali odustajem od transakcije'
  2434. END TRY
  2435. BEGIN CATCH
  2436.     ROLLBACK TRAN
  2437.     PRINT 'Desila se greška pa odustajem od transakcije'
  2438. END CATCH
  2439. GO
  2440. ----------------------------------------------------------------
  2441. ----------------------------------------------------------------
  2442.  
  2443. CREATE TABLE Sales ( Country varchar(50), Region varchar(50), Sales int );
  2444. INSERT INTO sales VALUES (N'Canada', N'Alberta', 100);
  2445. INSERT INTO sales VALUES (N'Canada', N'British Columbia', 200);
  2446. INSERT INTO sales VALUES (N'Canada', N'British Columbia', 300);
  2447. INSERT INTO sales VALUES (N'United States', N'Montana', 100);
  2448. GO
  2449.  
  2450. select * from Sales
  2451.  
  2452.  
  2453. -- GROUP BY ROLLUP
  2454. select Country, Region, SUM(Sales) AS TotalSales
  2455. from Sales
  2456. group by rollup (Country, Region)
  2457.  
  2458. -- GROUP BY CUBE
  2459. select Country, Region, SUM(Sales) AS TotalSales
  2460. from Sales
  2461. group by cube (Country, Region)
  2462.  
  2463. -- GROUP BY GROUPING SETS ()
  2464. select Country, Region, SUM(Sales) AS TotalSales
  2465. from Sales
  2466. group by grouping sets (Country, Region, ())
  2467.  
  2468.  
  2469.  
  2470.  
  2471. -- ZADACI.
  2472. use AdventureWorksOBP
  2473. go
  2474.  
  2475. -- 1.
  2476. select
  2477.     Prezime, Ime, COUNT(*) as BrojIzdanihRacuna
  2478. from Racun as r
  2479. inner join Kupac as k on r.KupacID = k.IDKupac
  2480. where k.Prezime in ('Adams', 'Simmons')
  2481. group by rollup (k.Prezime, k.Ime)
  2482.  
  2483. -- 2.
  2484. select
  2485.     Prezime, Ime, COUNT(*) as BrojIzdanihRacuna
  2486. from Racun as r
  2487. inner join Kupac as k on r.KupacID = k.IDKupac
  2488. where k.Ime in ('Rose', 'Lydia')
  2489. group by rollup (k.Ime, k.Prezime)
  2490.  
  2491. -- 3.
  2492. select
  2493.     kom.Ime, kom.Prezime, COUNT(*) as BrojIzdanihRacuna
  2494. from Racun as r
  2495. inner join Komercijalist as kom on r.KomercijalistID = kom.IDKomercijalist
  2496. where kom.Prezime like 'A%'
  2497. group by cube (kom.Ime, kom.Prezime)
  2498.  
  2499. -- 4.
  2500. select
  2501.     p.Naziv, p.Boja, SUM(s.UkupnaCijena) as Zarada
  2502. from Stavka as s
  2503. inner join Proizvod as p on s.ProizvodID = p.IDProizvod
  2504. where p.Boja is not null
  2505. group by GROUPING sets ((p.Naziv), (p.Boja), ())
  2506.  
  2507. -- 5.
  2508. select
  2509.     p.Boja, SUM(s.UkupnaCijena) as Zarada
  2510. from Stavka as s
  2511. inner join Proizvod as p on s.ProizvodID = p.IDProizvod
  2512. where p.Boja is not null
  2513. group by GROUPING sets ((p.Boja), ())
  2514.  
  2515. -- 6.
  2516. select
  2517.     d.Naziv as Drzava, g.Naziv as Grad, SUM(s.UkupnaCijena) as Zarada
  2518. from Stavka as s
  2519. inner join Racun as r on r.IDRacun = s.RacunID
  2520. inner join Kupac as k on k.IDKupac = r.KupacID
  2521. left join Grad as g on g.IDGrad = k.GradID
  2522. left join Drzava as d on d.IDDrzava = g.DrzavaID
  2523. group by rollup (d.Naziv, g.Naziv)
  2524.  
  2525.  
  2526.  
  2527. -- Primjer funkcija rangiranja
  2528. select
  2529.     Country,
  2530.     Region,
  2531.     Sales,
  2532.     ROW_NUMBER()    over (order by Sales) as Rn,
  2533.     RANK()          over (order by Sales) as R,
  2534.     DENSE_RANK()    over (order by Sales) as Dr,
  2535.     NTILE(2)        over (order by Sales) as N
  2536. from Sales
  2537. order by Country, Region
  2538.  
  2539. -- Primjer funkcija rangiranja s particioniranjem
  2540. select
  2541.     Country,
  2542.     Region,
  2543.     Sales,
  2544.     ROW_NUMBER() over (partition by Country order by Sales) as Rn
  2545. from Sales
  2546.  
  2547. -- ZADACI.
  2548.  
  2549. -- 1.
  2550. select
  2551.     *,
  2552.     ROW_NUMBER() over (order by Prezime, Ime) as Rbr
  2553. from Kupac
  2554. order by Prezime, Ime
  2555.  
  2556. -- 2.
  2557. select
  2558.     *,
  2559.     ROW_NUMBER() over (partition by GradID order by Prezime, Ime) as Rbr
  2560. from Kupac
  2561. order by GradID, Prezime, Ime
  2562.  
  2563. -- 3.
  2564. select
  2565.     *,
  2566.     RANK() over (order by Kolicina desc) as MjestoNaRangListi
  2567. from Stavka
  2568. order by Kolicina desc
  2569.  
  2570. -- 4.
  2571. select
  2572.     *,
  2573.     NTILE(13) over (order by DatumIzdavanja, BrojRacuna) as Skupina
  2574. from Racun
  2575. where KomercijalistID = 284
  2576. order by DatumIzdavanja
  2577.  
  2578. -- Primjer agregatnih funkcija
  2579. select
  2580.     *,
  2581.     SUM(s.Kolicina) over ()
  2582. from Racun as r
  2583. inner join Stavka s on s.RacunID = r.IDRacun
  2584. order by r.DatumIzdavanja, r.IDRacun
  2585.  
  2586. select
  2587.     *,
  2588.     SUM(s.Kolicina) over (order by DatumIzdavanja)
  2589. from Racun as r
  2590. inner join Stavka s on s.RacunID = r.IDRacun
  2591. order by r.DatumIzdavanja, r.IDRacun
  2592.  
  2593. select
  2594.     *,
  2595.     SUM(s.Kolicina) over (partition by year(DatumIzdavanja) order by DatumIzdavanja)
  2596. from Racun as r
  2597. inner join Stavka s on s.RacunID = r.IDRacun
  2598. order by r.DatumIzdavanja, r.IDRacun
  2599.  
  2600. -- Primjer running totala.
  2601. select
  2602.     Country,
  2603.     Region,
  2604.     Sales,
  2605.     AVG(Sales) over (order by Region) as a1,
  2606.     SUM(Sales) over (order by Region) as a2
  2607. from Sales
  2608. order by 2
  2609.  
  2610. -- ZADACI.
  2611.  
  2612. -- 1.
  2613. select
  2614.     s.*,
  2615.     r.DatumIzdavanja,
  2616.     SUM(s.UkupnaCijena) over (partition by year(DatumIzdavanja) order by DatumIzdavanja) as RunningSum
  2617. from Racun as r
  2618. inner join Stavka s on s.RacunID = r.IDRacun
  2619. order by r.DatumIzdavanja, r.IDRacun
  2620.  
  2621. -- 2.
  2622. select
  2623.     *,
  2624.     COUNT(*) over (partition by Boja) as ProizvodaBoje
  2625. from Proizvod
  2626.  
  2627.  
  2628. -- 3.
  2629. select
  2630.     *,
  2631.     (MAX(CijenaBezPDV) over ()) - CijenaBezPDV as Razlika
  2632. from Proizvod
  2633. where CijenaBezPDV > 0
  2634. order by CijenaBezPDV
  2635.  
  2636. -- Primjeri analitièkih funkcija
  2637. select
  2638.     *,
  2639.     FIRST_VALUE(Naziv) over (order by Naziv) as a1
  2640. from Proizvod
  2641. where Boja is not null
  2642. order by Naziv
  2643.  
  2644. select
  2645.     *,
  2646.     FIRST_VALUE(Naziv) over (partition by Boja order by boja, Naziv) as a1
  2647. from Proizvod
  2648. where Boja is not null
  2649. order by Boja, Naziv
  2650.  
  2651. select
  2652.     *,
  2653.     LAG(Naziv, 3) over (order by IDProizvod) as a1
  2654. from Proizvod
  2655. where Boja is not null
  2656. order by IDProizvod
  2657. go
  2658.  
  2659. select
  2660.     *,
  2661.     LAG(Naziv, 3) over (partition by Boja order by IDProizvod) as a1
  2662. from Proizvod
  2663. where Boja is not null
  2664. order by Boja, IDProizvod
  2665.  
  2666. -- ZADACI.
  2667.  
  2668. -- 1.
  2669. select
  2670.     *,
  2671.     CijenaBezPDV - LAG(CijenaBezPDV, 1) over (order by CijenaBezPDV) as Delta
  2672. from Proizvod
  2673. where CijenaBezPDV > 0
  2674. order by CijenaBezPDV
  2675.  
  2676. -- 2.
  2677. create table VozniRed
  2678. (
  2679.     IDVozniRed int constraint PK_VozniRed primary key identity,
  2680.     Stanica nvarchar(50) not null,
  2681.     Polazak time not null
  2682. )
  2683. go
  2684. insert into VozniRed (Stanica, Polazak) values ('Zagreb', '11:00')
  2685. insert into VozniRed (Stanica, Polazak) values ('Dugo Selo', '11:35')
  2686. insert into VozniRed (Stanica, Polazak) values ('Kutina', '13:15')
  2687. insert into VozniRed (Stanica, Polazak) values ('Novska', '13:45')
  2688. go
  2689.  
  2690. select
  2691.     *,
  2692.     datediff(minute, Polazak, LEAD(Polazak, 1) over (order by Polazak)) as VoznjaDoIduce
  2693. from VozniRed
  2694. go
  2695.  
  2696.  
  2697.  
  2698.  
  2699.  
  2700.  
  2701.  
  2702.  
  2703. --PRIMJERI SOPLVED
  2704. --ISHOD_1
  2705. --ZADATAK 1
  2706.  
  2707. /* Kreirajte pogled koji će se koristiti za dohvat svih računa kojima su kupci
  2708. iz Njemačke. Korištenjem kreiranog pogleda prikažite koliko je računa izdano u pojedinom gradu. */
  2709.  
  2710. CREATE VIEW pr1
  2711. AS
  2712.     SELECT DISTINCT g.Naziv, COUNT(r.IDRacun) AS BrojRacuna from Racun as r
  2713.     INNER JOIN Kupac AS k ON k.IDKupac = r.KupacID
  2714.     INNER JOIN Grad AS g ON g.IDGrad = k.GradID
  2715. GROUP BY g.Naziv
  2716.  
  2717. SELECT * FROM pr1
  2718. DROP VIEW pr1
  2719.  
  2720. --ISHOD_1
  2721. --ZADATAK_2
  2722.  
  2723. /*Kreirajte novu tablicu Zapisnik sa stupcima IDZapisnik i Sadrzaj. Napravite
  2724. okidač na tablici Komercijalist i vežite ga uz sva tri događaja. U okidaču
  2725. saznajte koji događaj ga je pozvao i tu informaciju upišite u Zapisnik.
  2726. Napravite upis jednog novog retka, izmjenu jednog retka i brisanje jednog
  2727. retka. Uklonite okidač.*/
  2728.  
  2729.  
  2730. CREATE TABLE Zapisnik
  2731. (
  2732.     IDZapisnik int IDENTITY(1,1) PRIMARY KEY,
  2733.     Poruka nvarchar(max),
  2734. )
  2735. GO
  2736.  
  2737. CREATE TRIGGER Okidac3 ON Komercijalist AFTER INSERT, UPDATE, DELETE
  2738. AS
  2739. IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) BEGIN
  2740.     -- INSERT. 
  2741.     INSERT INTO Zapisnik (Poruka) VALUES ('Desio se INSERT.')
  2742. END
  2743. ELSE IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN
  2744.     -- DELETE.
  2745.     INSERT INTO Zapisnik (Poruka) VALUES ('Desio se DELETE.')
  2746. END
  2747. ELSE IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN
  2748.     -- UPDATE.
  2749.     INSERT INTO Zapisnik (Poruka) VALUES ('Desio se UPDATE.')
  2750. END
  2751. GO
  2752.  
  2753. --277
  2754. SELECT * FROM Komercijalist
  2755. --43667
  2756. SELECT * FROM Racun
  2757.  
  2758. SELECT * FROM Stavka
  2759.  
  2760. INSERT INTO Komercijalist (Ime,Prezime) VALUES ('test', 'testic')
  2761. SELECT * FROM Zapisnik
  2762.  
  2763. UPDATE Komercijalist SET Ime = 'pimpek' WHERE IDKomercijalist = 275
  2764. SELECT * FROM Zapisnik
  2765.  
  2766. DELETE FROM Stavka WHERE RacunID = 43667
  2767. DELETE FROM Racun WHERE KomercijalistID = 277
  2768. DELETE FROM Komercijalist WHERE IDKomercijalist = 277
  2769. SELECT * FROM Zapisnik
  2770. GO
  2771.  
  2772. --ZADATAK_3
  2773. /*Kreirajte pogled koji vraća ID-eve svih komercijalista te ID-eve svih
  2774. izdanih računa. Pri tome omogućite da pogled ostane zaštićen od svih
  2775. naknadnih promjena tablica o kojima ovisi. */
  2776.  
  2777. CREATE VIEW SalesRepresentativesInvoices AS
  2778.     SELECT
  2779.         SalesRepresentative.ID AS SalesRepresentativeID,
  2780.         Invoice.ID AS InvoiceID
  2781.     FROM
  2782.         SalesRepresentative
  2783.     JOIN
  2784.         Invoice ON SalesRepresentative.ID = Invoice.SalesRepresentativeID
  2785. WITH SCHEMABINDING
  2786.  
  2787. --ZADATAK_4
  2788. /*Korisnički zahtjevi kažu da se u tablicu Osoba u stupac OIB uvijek
  2789. obavezno mora unijeti podatak duljine 11 znamenaka. Osigurajte
  2790. navedeno korištenjem okidača.
  2791. Onemogućite kreirani okidač.
  2792. Omogućite korištenje rekurzivnih okidača.
  2793. */
  2794.  
  2795. CREATE TRIGGER tr_EnforceOIBLength ON Person
  2796. FOR INSERT, UPDATE
  2797. AS
  2798. BEGIN
  2799.     IF EXISTS (SELECT * FROM inserted WHERE LEN(OIB) <> 11)
  2800.     BEGIN
  2801.         RAISERROR('OIB must be 11 characters long', 16, 1);
  2802.         ROLLBACK TRANSACTION;
  2803.     END
  2804. END
  2805.  
  2806. DISABLE TRIGGER tr_EnforceOIBLength ON Person
  2807.  
  2808. ENABLE TRIGGER tr_EnforceOIBLength ON Person
  2809.  
  2810. EXEC sp_configure 'recursive triggers', 1;
  2811. RECONFIGURE;
  2812.  
  2813.  
  2814. DROP TRIGGER Okidac3
  2815. GO
  2816.  
  2817. --ISHOD_2
  2818. --ZADATAK_1
  2819. /* Na koliko stranica su smješteni podaci iz tablice Potkategorija? Na koliko
  2820. stranica su smješteni indeksi iz tablice Potkategorija? Koja je vrijednost
  2821. IDPotkategorija prve potkategorije na prvoj podatkovnoj stranici? */
  2822.  
  2823. DBCC TRACEON(3604)
  2824. DBCC IND('AdventureWorksOBP', 'Potkategorija', -1)
  2825. -- a. DBCC IND vraca 2 retka, ali samo jedan od njih ima PageType jednak 1.
  2826.  
  2827. --ZADATAK_2
  2828.  
  2829. /*Kreirajte proceduru koja će za primljeni IDKupac izbrisati dotičnog kupca.
  2830. Ukoliko dotični kupac ne postoji, procedura treba kroz RETURN
  2831. parametar vratiti -1, inače 0. Zanemarite odnose tablice Kupac s ostalim
  2832. tablicama.
  2833. Pozovite kreiranu proceduru kako biste prikazali zadanu funkcionalnost. */
  2834.  
  2835. CREATE PROC p1
  2836.     @id int
  2837. AS
  2838. IF EXISTS (SELECT Ime FROM Kupac WHERE IDKupac = @id) BEGIN
  2839.     DELETE FROM Kupac
  2840.     WHERE IDKupac = @id
  2841. END
  2842. ELSE BEGIN
  2843.     RETURN -1
  2844. END
  2845.     RETURN 0
  2846.  
  2847. EXEC p1 1
  2848.  
  2849. --ZADATAK_3
  2850.  
  2851. select * from Proizvod
  2852.  
  2853. /*Kreirajte skalarnu funkciju koja prima boju i računa koliko ima proizvoda
  2854. dotične boje.
  2855. Prikažite primjenu kreirane funkcije tako da je iskoristite u prikazu svih
  2856. proizvoda, za prikaz rezultata funkcije u dodatnom stupcu.*/
  2857.  
  2858. SELECT COUNT (*) FROM Proizvod WHERE Boja = 'Crna'
  2859.  
  2860. ALTER FUNCTION fakatSeBumUbil
  2861. (
  2862.     @boja VARCHAR
  2863. )
  2864. RETURNS INT
  2865. AS
  2866. BEGIN
  2867.     DECLARE @result INT
  2868.  
  2869.     SELECT @result= COUNT(*)
  2870.     FROM Proizvod
  2871.     WHERE Boja = @boja
  2872.  
  2873.     RETURN @result
  2874. END
  2875.  
  2876.  
  2877.  
  2878. SELECT Naziv, Boja, dbo.fakatSeBumUbil(@Rez) AS total_products
  2879. FROM Proizvod
  2880.  
  2881.  
  2882. DECLARE @Rez NVARCHAR
  2883. SET @Rez = 'Crna'
  2884. PRINT dbo.ubilBumSe8(@Rez)
  2885.  
  2886. --ZADATAK_3
  2887. /*Optimizirajte upit što je bolje moguće:
  2888. SELECT DISTINCT PotkategorijaID FROM
  2889. Proizvod WHERE Naziv LIKE 'P%' */
  2890.  
  2891. SET STATISTICS IO ON
  2892.  
  2893. SELECT DISTINCT PotkategorijaID FROM
  2894. Proizvod WHERE Naziv LIKE 'P%'
  2895.  
  2896. CREATE NONCLUSTERED INDEX test5 ON Proizvod(PotkategorijaID)
  2897. GO
  2898.  
  2899. --ZADATAK_04
  2900. /* Kreirajte proceduru koja prima naziv potkategorije i pripadajuće
  2901. IDKategorije, upisuje novu potkategoriju u pripadajuću kategoriju i
  2902. kroz izlazni parametar vraća vrijednost primarnog ključa upisanog
  2903. retka. Ako već postoji potkategorija zadanog imena za tu kategoriju,
  2904. ne treba je upisivati ponovno i u tom slučaju kroz izlazni parametar
  2905. vratite vrijednost 0.
  2906. Pozovite proceduru dva puta s istim nazivom potkategorije i
  2907. IDKategorije te ispišite vraćene vrijednosti. */
  2908.  
  2909. CREATE PROCEDURE AddSubcategory (@SubcategoryName varchar(50), @CategoryID int, @NewSubcategoryID int OUTPUT)
  2910. AS
  2911. BEGIN
  2912.     DECLARE @ExistingSubcategoryID int
  2913.    
  2914.     SELECT @ExistingSubcategoryID = ID
  2915.     FROM Subcategory
  2916.     WHERE Name = @SubcategoryName AND CategoryID = @CategoryID
  2917.    
  2918.     IF @ExistingSubcategoryID IS NULL
  2919.     BEGIN
  2920.         INSERT INTO Subcategory (Name, CategoryID)
  2921.         VALUES (@SubcategoryName, @CategoryID)
  2922.        
  2923.         SET @NewSubcategoryID = SCOPE_IDENTITY()
  2924.     END
  2925.     ELSE
  2926.     BEGIN
  2927.         SET @NewSubcategoryID = 0
  2928.     END
  2929. END
  2930.  
  2931. DECLARE @SubcategoryID1 int, @SubcategoryID2 int
  2932.  
  2933. EXEC AddSubcategory 'Subcategory A', 1, @SubcategoryID1 OUTPUT
  2934. EXEC AddSubcategory 'Subcategory A', 1, @SubcategoryID2 OUTPUT
  2935.  
  2936. PRINT @SubcategoryID1
  2937. PRINT @SubcategoryID2
  2938.  
  2939. --ZADATAK_05
  2940.  
  2941. /*Kreirajte tabličnu funkciju koja prima podatak IDKomercijalist i
  2942. prikazuje sve račune dotičnog komercijaliste.
  2943. Prikažite primjenu kreirane funkcije tako da je iskoristite za prikaz
  2944. naziva gradova iz kojih su kupci tih računa. */
  2945.  
  2946. CREATE FUNCTION GetBillsBySalesperson (@IDKomercijalist INT)
  2947. RETURNS TABLE
  2948. AS
  2949. RETURN (
  2950.     SELECT ra.IDRacun, ra.IDKupac, ra.IDKomercijalist, ku.Grad
  2951.     FROM Racuni ra
  2952.     JOIN Kupci ku
  2953.     ON ra.IDKupac = ku.IDKupac
  2954.     WHERE ra.IDKomercijalist = @IDKomercijalist
  2955. )
  2956. GO
  2957.  
  2958. SELECT Grad
  2959. FROM GetBillsBySalesperson(1)
  2960.  
  2961. --I3
  2962. --ZADATAK_1
  2963.  
  2964. /* Implementirajte CRUD operacije na tablici Kategorija, ako znate da će se
  2965. baza podataka koristiti iz programskog jezika koji ne podržava rad s
  2966. funkcijama na bazi podataka.
  2967. Neka svaka od CRUD operacija bude riješena zasebnim objektom.
  2968. Demonstrirajte korištenje napravljenih objekata.*/
  2969.  
  2970. CREATE PROC pSelectKategorija
  2971. AS
  2972.     SELECT * FROM Kategorija
  2973. EXEC pSelectKategorija
  2974.  
  2975. CREATE PROC pInsertKategorija
  2976.     @Naziv NVARCHAR(255)
  2977. AS
  2978.     INSERT INTO Kategorija(Naziv) VALUES(@Naziv)
  2979. EXEC pInsertKategorija 'Automobili'
  2980.  
  2981. CREATE PROC pUpdateKateogrija
  2982.     @IDKategorija INT,
  2983.     @Naziv NVARCHAR(255)
  2984. AS
  2985.     UPDATE Kategorija
  2986.     SET Kategorija.Naziv = @Naziv
  2987.     WHERE IDKategorija = @IDKategorija
  2988. EXEC pUpdateKateogrija 7, 'Motorla'
  2989.  
  2990. CREATE PROC pDeleteKategorija
  2991.     @IDKategorija int
  2992. AS
  2993.     DELETE FROM Kategorija
  2994.     WHERE IDKategorija = @IDKategorija
  2995. EXEC pDeleteKategorija 7
  2996.  
  2997. --ISHOD_4
  2998. --ZADATAK_1
  2999.  
  3000. /*Napišite proceduru koja prima podatke putem XML, JSON ili tablične
  3001. varijable i poslane podatke upisuje u zadanu tablicu. */
  3002. /*<Gradovi>
  3003.     <Grad>Karlovac</Grad>
  3004.     …
  3005. </Gradovi>*/
  3006.  
  3007. CREATE PROC IspisiNazive
  3008.     @gradovi xml
  3009. AS
  3010. SELECT
  3011.     Tablica.Stupac.value('.', 'nvarchar(50)') AS Grad
  3012. FROM @gradovi.nodes('/Gradovi/Grad') AS Tablica(Stupac)
  3013. GO
  3014. -- Pozvati proceduru  s nekim parametrom.
  3015. EXEC IspisiNazive '<Gradovi><Grad>Karlovac</Grad><Grad>Sisak</Grad><Grad>Kutina</Grad></Gradovi>'
  3016. GO
  3017.  
  3018. -- Zadatak 4.
  3019. /*
  3020. Napisati proceduru koja prima JSON dokument oblika:
  3021.  
  3022. {"OSOBE":
  3023.     [
  3024.         {"OSOBA":
  3025.             {"ime": "Pero", "prezime": "Perić"}},
  3026.         {"OSOBA":
  3027.             {"ime": "Iva", "prezime": "Ivić"}}   ]
  3028. }
  3029.  
  3030. Neka procedura vrati tablicu s imenima i prezimenima osoba.
  3031. Pozvati proceduru s gornjim parametrom.
  3032. */
  3033.  
  3034. create proc p11
  3035.     @json nvarchar(max)
  3036. as
  3037. select ime, prezime
  3038. from openjson(@json, '$.OSOBE')    
  3039. with       
  3040. (
  3041.     Ime nvarchar(50) '$.OSOBA.ime',
  3042.     Prezime nvarchar(50) '$.OSOBA.prezime'
  3043. )
  3044.  
  3045.  
  3046. declare @json nvarchar(max)
  3047. set @json=
  3048. '{"OSOBE": 
  3049.         [
  3050.             {"OSOBA":
  3051.                     {
  3052.                         "ime": "Pero", 
  3053.                         "prezime": "Perić"
  3054.                     }
  3055.             },
  3056.             {"OSOBA":
  3057.                     {
  3058.                         "ime": "Iva",  
  3059.                         "prezime": "Ivić"
  3060.                     }
  3061.             }
  3062.         ]}'
  3063.  
  3064. exec p11 @json
  3065. -----------------------------------------------------------------------------------
  3066. -----------------------------------------------------------------------------------
  3067. -- Zadatak 5.
  3068. /*
  3069. Napisati proceduru koja prima JSON dokument oblika:
  3070.  
  3071. N‘ { "OSOBE":
  3072.     [ { "OSOBA":
  3073.         { "idosoba": 2,  "ime": "Iva",  "prezime": "Ivić",  "ostalo":
  3074.             {"email": "iva.ivic@algebra.hr", "telefon": "091 222 3333” } } } ] } '
  3075.  
  3076. Neka procedura vrati tablicu s imenima, prezimenima i telefonskim brojevima osoba.
  3077. Pozvati proceduru s gornjim parametrom.
  3078. */
  3079.  
  3080. create proc p12
  3081.     @json nvarchar(max)
  3082. as
  3083. select ime, prezime, telefon
  3084. from openjson(@json, '$.OSOBE')    
  3085. with       
  3086. (
  3087.     Ime nvarchar(50) '$.OSOBA.ime',
  3088.     Prezime nvarchar(50) '$.OSOBA.prezime',
  3089.     Telefon nvarchar(50) '$.OSOBA.ostalo.telefon'
  3090. )
  3091. go
  3092.  
  3093. declare @json nvarchar(max)
  3094. set @json=
  3095. N'{"OSOBE":
  3096.         [
  3097.             {"OSOBA":
  3098.                     {"idosoba": 2,
  3099.                      "ime": "Iva", 
  3100.                      "prezime": "Ivić",           
  3101.                      "ostalo":
  3102.                         {"email": "iva.ivic@algebra.hr",
  3103.                          "telefon": "091 222 3333"}}}]}'
  3104. exec p12 @json
  3105. -----------------------------------------------------------------------------------
  3106. -----------------------------------------------------------------------------------
  3107. -- Zadatak 6.
  3108. /*
  3109. Napišite upit kojim ćete s podacima IDKupac, Ime, Prezime, Email i Telefon iz tablice Kupac
  3110. kreirati JSON dokument oblika kako je prikazano niže, za sve kupce koji imaju IDKupac<11:
  3111. {"OSOBE":
  3112.     [
  3113.     {"OSOBA":
  3114.         {"idkupac":1,"ime":"Gustavo","prezime":"Achong",
  3115.             "ostalo":{"email":"gustavo0@adventure-works.com","telefon":"398-555-0132"}}}
  3116.     ]}
  3117. */
  3118. select k.IDKupac as [OSOBA.idkupac], k.Ime as [OSOBA.ime], k.prezime as [OSOBA.prezime],
  3119. email as [OSOBA.ostalo.email],
  3120. telefon as [OSOBA.ostalo.telefon]
  3121. from Kupac as k
  3122. where k.IDKupac<11
  3123. for json path, root('OSOBE')
  3124.  
  3125. --ISHOD 5
  3126. /*Opišite i demonstrirajte probleme koji mogu nastati istovremenim
  3127. izvršavanjem više transakcija te kako ih riješiti.*/
  3128.  
  3129. /* Postoje 3 osovna problema:
  3130.     - prljavo čitanje
  3131.         1. transakcija promijeni vrijednost retka
  3132.         2. transakcija pročita tu vrijednost (ditrty read)
  3133.         3. prva transkacija odustane
  3134.     - neponovljivo čitanje
  3135.         1. transkacija pročita vrijednost stupca u nekom retku (neponovljivo čitanje)
  3136.         2. druga trasnakcija promijeni tu vrijednos i potvrdi se
  3137.         3. prva transkacija istim SELECTom sada čita drugu vrijednost
  3138.     - fantom
  3139.         1. prva transkacija zada SELECT koji vrati n redaka
  3140.         2. druga transakcija umetne redak u raspon
  3141.         3. prva transkacija zada isti SELECT koji sad vrati n+1 redataka (fantom)
  3142. */
  3143.  
  3144. -- prljavo čitanje
  3145.  
  3146. -- KORAK 1
  3147. SET TRANSACTION ISOLATION LEVEL READ COMMITTED
  3148. -- KORAK 3
  3149. BEGIN TRAN
  3150. -- KORAK 5
  3151. UPDATE Drzava
  3152. SET Naziv = 'Croatia'
  3153. WHERE IDDrzava = 1
  3154. -- KORAK 7
  3155. ROLLBACK
  3156.  
  3157. -- fix za dirty read
  3158. -- 2. KONEKCIJA -- ovaj dio treba stavit u ZASEBNU KONEKCIJU (new query pa kopi pejst ovih parnih koraka)
  3159. -- KORAK 2
  3160. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  3161. -- KORAK 4
  3162. BEGIN TRAN
  3163. -- KOARK 6
  3164. SELECT *
  3165. FROM Drzava
  3166. WHERE IDDrzava = 1
  3167. -- KORAK 8
  3168. ROLLBACK
  3169.  
  3170. -- fantom
  3171. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE -- Fantome sprječavamo postavljanjem izolacijskog nivoa na SERIALIZABLE.
  3172. -- 3.
  3173. BEGIN TRAN
  3174. -- 5.
  3175. SELECT * FROM Drzava WHERE Naziv LIKE 'H%' -- vraća 1 redak i postavlja S lokot na sve retke koji započinju s H kojeg će držati do kraja transakcije.
  3176. -- 7.
  3177. SELECT * FROM Drzava WHERE Naziv LIKE 'H%' -- vraća 1 redak.
  3178. -- 8.
  3179. ROLLBACK TRAN
  3180.  
  3181. -- 2.
  3182. SET TRANSACTION ISOLATION LEVEL READ COMMITTED
  3183. -- 4.
  3184. BEGIN TRAN
  3185. -- 6.
  3186. INSERT INTO Drzava (Naziv) VALUES ('Haiti') -- Blokiran zbog S lokota. Da nije, umetnuo bi fantoma.
  3187. -- 9.
  3188. ROLLBACK TRAN
  3189.  
  3190. -- neponovljeno čitanje
  3191. -- 1.
  3192. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ -- Neponovljivo čitanje sprječavamo postavljanjem bilo kojeg izolacijskog nivoa iznad READ COMMITTED.
  3193. -- 3.
  3194. BEGIN TRAN
  3195. -- 5.
  3196. SELECT * FROM Drzava WHERE IDDrzava = 1 -- Tu bi se desilo neponovljivo čitanje, ali se neće desiti jer sam sada postavio S lokot i držim ga do kraja transakcije.
  3197. -- 7.
  3198. SELECT * FROM Drzava WHERE IDDrzava = 1
  3199. -- 8.
  3200. ROLLBACK TRAN
  3201.  
  3202. -- 2.
  3203. SET TRANSACTION ISOLATION LEVEL READ COMMITTED
  3204. -- 4.
  3205. BEGIN TRAN
  3206. -- 6.
  3207. UPDATE Drzava SET Naziv = 'Hrv' WHERE IDDrzava = 1 -- Blokiran zbog S lokota.
  3208. -- 9.
  3209. ROLLBACK TRAN
  3210.  
  3211. --ZADATAK_02
  3212.  
  3213. CREATE PROCEDURE ExampleProcedure
  3214. AS
  3215. BEGIN TRY
  3216.     BEGIN TRANSACTION
  3217.  
  3218.     INSERT INTO Customers (FirstName, LastName, Email)
  3219.     VALUES ('John', 'Doe', 'john.doe@example.com');
  3220.  
  3221.     INSERT INTO Orders (CustomerID, OrderDate, TotalAmount)
  3222.     VALUES (SCOPE_IDENTITY(), GETDATE(), 100.00);
  3223.  
  3224.     COMMIT TRANSACTION
  3225. END TRY
  3226. BEGIN CATCH
  3227.     IF @@TRANCOUNT > 0
  3228.         ROLLBACK TRANSACTION
  3229.  
  3230.     DECLARE @ErrorMessage NVARCHAR(MAX) = ERROR_MESSAGE();
  3231.     DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
  3232.     DECLARE @ErrorState INT = ERROR_STATE();
  3233.  
  3234.     -- Log the error to a separate error log table
  3235.     INSERT INTO ErrorLog (ErrorMessage, ErrorSeverity, ErrorState, ErrorTime)
  3236.     VALUES (@ErrorMessage, @ErrorSeverity, @ErrorState, GETDATE());
  3237.  
  3238.     -- Raise an error to the caller to indicate that the operation failed
  3239.     RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
  3240. END CATCH;
  3241.  
  3242. --ISHOD 6
  3243.  
  3244. --ZADATAK_01
  3245.  
  3246. /*Prikažite grupirane podatke, sub totale i grand total korištenjem
  3247. neke od opcija grupiranja.
  3248. Prikažite podatke i dodijelite im redne brojeve, ranking ili pripadnost
  3249. pojedinoj grupi zapisa tražene veličine.
  3250. Iskoristite agregatne funkcije za prikaz running sum totala.
  3251. Iskoristite analitičke funkcije za usporedbu podataka iz različitih
  3252. zapisa.*/
  3253.  
  3254. /* Prikažite grupirane podatke, sub totale i grand total korištenjem
  3255. neke od opcija grupiranja. */
  3256.  
  3257. SELECT
  3258.     CATEGORY,
  3259.     SUM(QUANTITY) AS TotalQuantity,
  3260.     SUM(PRICE * QUANTITY) AS TotalSales
  3261. FROM
  3262.     Orders
  3263. GROUP BY
  3264.     CATEGORY
  3265. WITH ROLLUP
  3266.  
  3267. /*Prikažite podatke i dodijelite im redne brojeve, ranking ili pripadnost
  3268. pojedinoj grupi zapisa tražene veličine.*/
  3269.  
  3270. WITH RankedData AS (
  3271.     SELECT
  3272.         *,
  3273.         ROW_NUMBER() OVER (ORDER BY [ColumnName] DESC) AS RowNumber,
  3274.         DENSE_RANK() OVER (ORDER BY [ColumnName] DESC) AS Rank,
  3275.         NTILE(4) OVER (ORDER BY [ColumnName] DESC) AS GroupNumber
  3276.     FROM
  3277.         Orders
  3278. )
  3279. SELECT
  3280.     *
  3281. FROM
  3282.     RankedData
  3283.  
  3284. /*Iskoristite agregatne funkcije za prikaz running sum totala.*/
  3285. WITH RunningTotals AS (
  3286.     SELECT
  3287.         [ColumnName],
  3288.         SUM([ColumnName]) OVER (ORDER BY [ColumnName]) AS RunningTotal
  3289.     FROM
  3290.         Orders
  3291. )
  3292. SELECT
  3293.     [ColumnName],
  3294.     RunningTotal
  3295. FROM
  3296.     RunningTotals
  3297.  
  3298. /* Iskoristite analitičke funkcije za usporedbu podataka iz različitih
  3299. zapisa. */
  3300. WITH AnalyticalData AS (
  3301.     SELECT
  3302.         [ColumnName],
  3303.         [ColumnName2],
  3304.         ROW_NUMBER() OVER (ORDER BY [ColumnName] DESC) AS RowNumber,
  3305.         LAG([ColumnName2], 1, 0) OVER (ORDER BY [ColumnName] DESC) AS PrevColumn2Value,
  3306.         LEAD([ColumnName2], 1, 0) OVER (ORDER BY [ColumnName] DESC) AS NextColumn2Value
  3307.     FROM
  3308.         Orders
  3309. )
  3310. SELECT
  3311.     [ColumnName],
  3312.     [ColumnName2],
  3313.     RowNumber,
  3314.     PrevColumn2Value,
  3315.     NextColumn2Value
  3316. FROM
  3317.     AnalyticalData
  3318.  
  3319. --ZADATAK_02
  3320. WITH AdvancedData AS (
  3321.     SELECT
  3322.         [ColumnName],
  3323.         SUM([ColumnName2]) OVER (ORDER BY [ColumnName] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal
  3324.     FROM
  3325.         Orders
  3326. )
  3327. SELECT
  3328.     [ColumnName],
  3329.     RunningTotal
  3330. FROM
  3331.     AdvancedData
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement