· 2 years ago · Sep 17, 2023, 10:05 PM
1--1. Kreirati bazu podataka pod nazivom ZadaciZaVjezbu.
2CREATE DATABASE ZadaciZaVjezbu
3GO
4USE ZadaciZaVjezbu
5
6--2. U pomenutoj bazi kreirati tabelu Aplikanti koja æe sadržavati sljedeæe kolone: Ime, Prezime i Mjesto_roðenja. Sva navedena polja trebaju da budu tekstualnog tipa, te prilikom kreiranja istih paziti da se ne zauzimaju bespotrebno memorijski resursi.
7CREATE TABLE Aplikanti
8(
9Ime NVARCHAR(10),
10Prezime NVARCHAR(20),
11MjestoRodjenja NVARCHAR(50)
12)
13--3. U tabelu Aplikanti dodati kolonu AplikantID, te je proglasiti primarnim kljuèem tabele (kolona mora biti autonkrement)
14ALTER TABLE Aplikanti
15ADD AplikantID INT NOT NULL IDENTITY(1,1)
16
17ALTER TABLE Aplikanti
18ADD CONSTRAINT PK_Aplikant PRIMARY KEY(AplikantID)
19--4. U bazi ZadaciZaVjezbu kreirati tabelu Projekti koji æe sadržavati sljedeæe kolone: Naziv projekta, Akronim projekta, Svrha projekta i Cilj projekta. Sva polja u tabeli su tekstualnog tipa, te prilikom kreiranja istih paziti da se ne zauzimaju bespotrebno memorijski resursi. Sva navedena polja osim cilja projekta moraju imati vrijednost.
20CREATE TABLE Projekti
21(
22NazivProjekta NVARCHAR(30) NOT NULL,
23AkronimProjekta NVARCHAR(30) NOT NULL,
24SvrhaProjekta NVARCHAR(150) NOT NULL,
25CiljProjekta NVARCHAR(150)
26
27)
28--5. U tabelu Projekti dodati kolonu Sifra projekta, te je proglasiti primarnim kljuèem tabele.
29ALTER TABLE Projekti
30ADD SifraProjekta NVARCHAR(30) PRIMARY KEY
31--6. U tabelu Aplikanti dodati kolonu projekatID koje æe biti spoljni kljuè na tabelu projekat.
32ALTER TABLE Aplikanti
33ADD ProjekatID NVARCHAR(30) NOT NULL CONSTRAINT FK_Aplikant_Projekti FOREIGN KEY REFERENCES Projekti(sifraProjekta)
34--7. U bazi podataka ZadaciZaVjezbu kreirati tabelu TematskeOblasti koja æe sadržavati sljedeæa polja tematskaOblastID, naziv i opseg. TematskaOblastID predstavlja primarni kljuè tabele, te se automatski uveæava. Sva definisana polja moraju imati vrijednost. Prilikom definisanja dužine polja potrebno je obratiti pažnju da se ne zauzimaju bespotrebno memorijski resursi.
35CREATE TABLE TematskeOblasti
36(
37TematskaOblastID INT CONSTRAINT PK_TematskaOblast PRIMARY KEY,
38Naziv NVARCHAR(50) NOT NULL,
39Opseg NVARCHAR(150) NOT NULL
40)
41--8. U tabeli Aplikanti dodati polje email koje je tekstualnog tipa i može ostati prazno.
42ALTER TABLE Aplikanti
43ADD Email NVARCHAR(50)
44--9. U tabeli Aplikanti obrisati mjesto roðenja i dodati polja telefon i matièni broj. Oba novokreirana polja su tekstualnog tipa i moraju sadržavati vrijednost.
45ALTER TABLE Aplikanti
46DROP COLUMN MjestoRodjenja
47
48ALTER TABLE Aplikanti
49ADD Telefon NVARCHAR(10) NOT NULL,
50MaticniBroj NVARCHAR(13) NOT NULL --CONSTRAINT UQ_Aplikanti_MaticniBroj UNIQUE
51--10. Obrisati tabele kreirane u prethodnim zadacima
52DROP TABLE Aplikanti, TematskeOblasti, Projekti
53--11. Obrisati kreiranu bazu
54DROP DATABASE ZadaciZaVjezbu
55
56
57
58--1. Kreirati bazu Procedure_ i aktivirati je.
59CREATE DATABASE Procedure_
60GO
61USE Procedure_
62--2. Kreirati tabelu Proizvodi te prilikom kreiranja uraditi insert podataka iz tabele Products baze Northwind.
63SELECT*
64INTO Proizvodi
65FROM Northwind.dbo.Products
66
67--3. Kreirati proceduru sp_Insert_Proizvod kojom æe se u tabeli Proizvodi uraditi insert novog zapisa.
68GO
69CREATE PROCEDURE sp_Products_Insert
70(
71@ProductName NVARCHAR(40),
72@SupplierID INT=NULL,
73@CategoryID INT=NULL,
74@QuantityPerUnit NVARCHAR (20)= NULL,
75@UnitPrice MONEY= NULL,
76@UnitsInStock SMALLINT= NULL,
77@UnitsOnOrder SMALLINT= NULL,
78@ReorderLevel SMALLINT= NULL,
79@Discontinued BIT
80)
81AS
82BEGIN
83INSERT INTO Proizvodi
84VALUES(@ProductName,@SupplierID,@CategoryID,@QuantityPerUnit,@UnitPrice,@UnitsInStock,@UnitsOnOrder,@ReorderLevel,@Discontinued)
85END
86GO
87--4. Kreirati dva testna sluèaja, u prvom poslati podatke u sva polja, u drugom samo u ona koja su obavezna.
88EXEC sp_Products_Insert
89 @ProductName='Mlijeko',
90 @SupplierID=1,
91 @CategoryID=1,
92 @QuantityPerUnit=2,
93 @UnitPrice=1.4,
94 @UnitsInStock=30,
95 @UnitsOnOrder=0,
96 @ReorderLevel=1,
97 @Discontinued=1
98
99SELECT*
100FROM Proizvodi
101ORDER BY 1 DESC
102
103EXEC sp_Products_Insert
104 @ProductName='Brašno',
105 @Discontinued=1
106
107--5. Kreirati proceduru sp_Proizvod_Update kojom æe se u tabeli Proizvodi uraditi update zapisa.
108GO
109CREATE OR ALTER PROCEDURE sp_Proizvod_Update
110(
111@ProductID INT,
112@ProductName NVARCHAR(40),
113@SupplierID INT=NULL,
114@CategoryID INT=NULL,
115@QuantityPerUnit NVARCHAR (20)= NULL,
116@UnitPrice MONEY= NULL,
117@UnitsInStock SMALLINT= NULL,
118@UnitsOnOrder SMALLINT= NULL,
119@ReorderLevel SMALLINT= NULL,
120@Discontinued BIT
121)
122AS
123BEGIN
124UPDATE Proizvodi
125SET
126 ProductName=ISNULL(@ProductName,ProductName),
127 SupplierID=ISNULL(@SupplierID,SupplierID),
128 CategoryID=ISNULL(@CategoryID,CategoryID),
129 QuantityPerUnit=ISNULL(@QuantityPerUnit,QuantityPerUnit),
130 UnitPrice=ISNULL(@UnitPrice,UnitPrice),
131 UnitsInStock=ISNULL(@UnitsInStock,UnitsInStock),
132 UnitsOnOrder=ISNULL(@UnitsOnOrder,UnitsOnOrder),
133 ReorderLevel=ISNULL(@ReorderLevel,ReorderLevel),
134 Discontinued=ISNULL(@Discontinued,Discontinued)
135 WHERE ProductID=@ProductID
136END
137GO
138
139EXEC sp_Proizvod_Update
140 @ProductID=76,
141 @ProductName='New product',
142 @SupplierID=2,
143 @ReorderLevel=1,
144 @Discontinued=1
145
146SELECT *
147FROM Proizvodi
148ORDER BY 1 DESC
149
150
151GO
152CREATE OR ALTER PROCEDURE sp_Proizvod_Update
153(
154@ProductId INT,
155@ProductName NVARCHAR(40)=NULL,
156@SupplierID INT=NULL,
157@CategoryID INT=NULL,
158@QuantityPerUnit NVARCHAR(20)=NULL,
159@UnitPrice MONEY=NULL,
160@UnitsInStock SMALLINT=NULL,
161@UnitsOnOrder SMALLINT=NULL,
162@ReorderLevel SMALLINT=NULL,
163@Discontinued BIT
164)
165AS
166BEGIN
167UPDATE Proizvodi
168SET
169ProductName=ISNULL(@ProductName,ProductName),
170SupplierID=ISNULL(@SupplierID,SupplierID),
171CategoryID= ISNULL(@CategoryID,CategoryID),
172QuantityPerUnit=ISNULL(@QuantityPerUnit,QuantityPerUnit),
173UnitPrice=ISNULL(@UnitPrice,UnitPrice),
174UnitsInStock=ISNULL(@UnitsInStock,UnitsInStock),
175UnitsOnOrder=ISNULL(@UnitsOnOrder,UnitsOnOrder),
176ReorderLevel=ISNULL(@ReorderLevel,ReorderLevel),
177Discontinued=ISNULL(@Discontinued,Discontinued)
178WHERE ProductID=@ProductId
179END
180--6. Kreirati testni sluèaj za update zapisa kroz proceduru.
181EXEC sp_Proizvod_Update
182 @ProductName='Mlijeko',
183 @SupplierID=1,
184 @CategoryID=1,
185 @UnitPrice=1.6,
186 @UnitsInStock=30,
187 @UnitsOnOrder=0,
188 @Discontinued=1,
189 @ProductID=78
190
191--7 Kreirati proceduru sp_Proizvod_Delete kojom æe se u tabeli Proizvodi uraditi delete odreðenog zapisa.
192
193GO
194CREATE PROCEDURE sp_Proizvod_Delete
195(
196 @ProductID INT
197)
198AS
199BEGIN
200DELETE FROM Proizvodi
201WHERE ProductID=@ProductID
202END
203GO
204
205
206GO
207CREATE PROCEDURE sp_Proizvod_Delete
208(
209@ProductID int
210)
211AS
212BEGIN
213DELETE FROM Proizvodi
214WHERE ProductID=@ProductID
215END
216
217--8. Kreirati testni sluèaj za brisanje proizvoda sa id-om 78.
218EXEC sp_Proizvod_Delete @ProductId=78
219
220--9. Kreirati tabelu StavkeNarudzbe te prilikom kreiranja uraditi insert podataka iz tabele Order Details baze Northwind.
221SELECT*
222INTO StavkeNarudzbe
223FROM Northwind.dbo.[Order Details]
224--10. Kreirati proceduru sp_StavkeNarudzbe_Proizvodi_InsertUpdate kojom æe se u tabeli StavkeNarudzbe dodati nova stavka narudžbe a u tabeli Proizvodi umanjiti stanje za zalihama.
225GO
226CREATE PROCEDURE sp_StavkeNarudzbe_Proizvodi_InsertUpdate
227(
228@OrderID int,
229@ProductID int,
230@UnitPrice money,
231@Quantity smallint,
232@Discount real
233)
234AS
235BEGIN
236INSERT INTO StavkeNarudzbe
237VALUES(@OrderID,@ProductID,@UnitPrice,@Quantity,@Discount)
238
239UPDATE Proizvodi
240SET UnitsInStock=UnitsInStock-@Quantity
241WHERE ProductID=@ProductID
242END
243--11. Kreirati testni sluèaj za prethodno kreiranu proceduru.
244EXEC sp_StavkeNarudzbe_Proizvodi_InsertUpdate 10248,1,5,4,0.1
245
246SELECT*
247FROM StavkeNarudzbe
248WHERE OrderID=10248
249
250SELECT*
251FROM Proizvodi
252--12. Kreirati proceduru kojom æe se u tabeli Proizvodi uraditi select proizvoda prema nazivu proizvoda i ID kategorije. Ukoliko korisnik ne unese ništa od navedenog prikazati sve proizvode.
253GO
254CREATE PROCEDURE sp_Proizvodi_SelectByProductNameOrCategoryID
255(
256@ProductName NVARCHAR(40)=NULL,
257@CategoryID INT=NULL
258)
259AS
260BEGIN
261SELECT P.ProductName,P.CategoryID,P.UnitPrice,P.UnitsInStock,P.UnitsOnOrder
262FROM Proizvodi as P
263WHERE(ProductName=@ProductName OR @ProductName IS NULL) AND (CategoryID=@CategoryID OR @CategoryID IS NULL)
264END
265
266--13. Prethodno kreiranu proceduru izvršiti sa sljedeæim testnim sluèajevima:
267EXEC sp_Proizvodi_SelectByProductNameOrCategoryID @ProductName='Chai'
268EXEC sp_Proizvodi_SelectByProductNameOrCategoryID @CategoryID=7
269EXEC sp_Proizvodi_SelectByProductNameOrCategoryID @ProductName='Tofu',@CategoryID=7
270EXEC sp_Proizvodi_SelectByProductNameOrCategoryID @ProductName=NULL,@CategoryID=NULL
271
272
273--14. Kreirati proceduru u bazi Procedure_ naziva sp_uposlenici_selectAll nad tabelama HumanResources.Employee i Person.Person baze AdventureWorks2017 kojom æe se dati prikaz polja BusinessEntityID, FirstName, LastName i JobTitle. Proceduru podesiti da se rezultati sortiraju po BusinessEntityID.
274
275GO
276CREATE PROCEDURE sp_Uposlenici_selectAll
277AS
278BEGIN
279SELECT E.BusinessEntityID, P.FirstName, P.LastName, E.JobTitle
280FROM AdventureWorks2017.HumanResources.Employee AS E
281INNER JOIN AdventureWorks2017.Person.Person AS P
282ON E.BusinessEntityID = P.BusinessEntityID
283ORDER BY E.BusinessEntityID
284END
285
286EXEC sp_Uposlenici_selectAll
287GO
288
289--15. Iz baze AdventureWorks2017 u tabelu Vendor kopirati tabelu Purchasing.Vendor.
290SELECT *
291INTO Vendor
292FROM AdventureWorks2017.Purchasing.Vendor
293--16. Kreirati proceduru sp_vendor_deleteColumn kojom æe se izvršiti brisanje kolone PurchasingWebServiceURL.
294GO
295CREATE PROCEDURE SP_Vendor_deleteColumn
296AS
297BEGIN
298ALTER TABLE Vendor
299DROP COLUMN PurchasingWebServiceURL
300END
301
302EXEC sp_vendor_deleteColumn
303
304SELECT * FROM Vendor
305--17. Kreirati proceduru sp_Vendor_updateColumn kojom æe se izvršiti update kolone AccountNumber tako da u svakom zapisu posljednji znak (cifra) podatka bude iskljuèivo 1.
306GO
307CREATE PROCEDURE sp_Vendor_updateAccountNumber
308AS
309BEGIN
310UPDATE Vendor
311SET AccountNumber = LEFT (AccountNumber, LEN (AccountNumber)-1) + '1'
312WHERE RIGHT (AccountNumber,1) <> '1'
313--WHERE CAST (RIGHT (AccountNumber,1) AS INT) != 1
314--WHERE CONVERT (INT,RIGHT (AccountNumber,1)) <> 1
315END
316
317
318EXEC sp_Vendor_updateAccountNumber
319
320SELECT*
321FROM Vendor
322--18. 18. Kreirati proceduru u bazi Procedure_ naziva sp_Zaposlenici_SelectByFirstNameLastNameGender nad odgovarajuæim tabelama baze AdventureWorks2017 kojom æe se definirati sljedeæi ulazni parametri:
323-- - EmployeeID,
324-- - FirstName,
325-- - LastName,
326-- - Gender.
327--Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijete vrijednosti parametra),
328--te da procedura daje rezultat ako je zadovoljena bilo koja od vrijednosti koje su navedene kao vrijednosti parametara. Nakon kreiranja pokrenuti proceduru za sljedeæe vrijednosti parametara:
329--• EmployeeID = 20,
330--• LastName = Miller,
331--• LastName = Abercrombie Gender = M
332
333GO
334CREATE PROCEDURE sp_Zaposlenici_SelectByFirstNameLastNameGender
335(
336 @EmployeeID INT = NULL,
337 @FirstName NVARCHAR (50) = NULL,
338 @LastName NVARCHAR (50) = NULL,
339 @Gender NCHAR (1) = NULL
340)
341AS
342BEGIN
343SELECT e.BusinessEntityID, p.FirstName, p.LastName, e.Gender
344FROM AdventureWorks2017.HumanResources.Employee AS E
345INNER JOIN AdventureWorks2017.Person.Person AS P
346ON E.BusinessEntityID = P.BusinessEntityID
347WHERE E.BusinessEntityID = @EmployeeID OR P.FirstName = @FirstName OR P.LastName = @LastName OR E.Gender = @Gender
348END
349
350EXEC sp_Zaposlenici_SelectByFirstNameLastNameGender @EmployeeID = 20
351
352EXEC sp_Zaposlenici_SelectByFirstNameLastNameGender @LastName = 'Miller'
353
354EXEC sp_Zaposlenici_SelectByFirstNameLastNameGender @LastName = Abercrombie, @Gender = M
355
356
357--19. Proceduru sp_Zaposlenici_SelectByFirstNameLastNameGender izmijeniti tako da je prilikom izvršavanja moguæe unijeti bilo koje vrijednosti za prva tri parametra (možemo ostaviti bilo koje od tih polja bez unijete vrijednosti), a da vrijednost èetvrtog parametra bude F.
358--Nakon izmjene pokrenuti proceduru za sljedeæe vrijednosti parametara:
359--• EmployeeID = 2,
360--• LastName = Miller
361
362GO
363ALTER PROCEDURE sp_Zaposlenici_SelectByFirstNameLastNameGender
364(
365 @EmployeeID INT = NULL,
366 @FirstName NVARCHAR (50) = NULL,
367 @LastName NVARCHAR (50) = NULL,
368 @Gender NCHAR (1) = 'F'
369)
370AS
371BEGIN
372SELECT E.BusinessEntityID, P.FirstName, P.LastName, E.Gender
373FROM AdventureWorks2017.HumanResources.Employee AS E
374INNER JOIN AdventureWorks2017.Person.Person AS P
375ON E.BusinessEntityID = P.BusinessEntityID
376WHERE (E.BusinessEntityID = @EmployeeID OR P.FirstName = @FirstName or P.LastName = @LastName) AND E.Gender = @Gender
377END
378
379EXEC sp_Zaposlenici_SelectByFirstNameLastNameGender @EmployeeID = 2
380
381EXEC sp_Zaposlenici_SelectByFirstNameLastNameGender @LastName = 'Miller'
382
383--20. Kreirati proceduru u bazi Procedure_ naziva sp_Narudzbe_SelectByCustomerID nad odgovarajuæim tabelama baze Northwind, sa parametrom CustomerID kojom æe se dati pregled ukupno naruèenih koloèina svakog od proizvoda za unijeti ID Customera. Proceduru pokrenuti za ID Customera BOLID
384GO
385CREATE PROCEDURE sp_Narudzbe_SelectByCustomerID
386@CustomerID NCHAR (5)
387AS
388BEGIN
389SELECT P.ProductName, SUM (OD.Quantity) as 'Ukupno narudèenih'
390FROM Northwind.dbo.Products AS P
391INNER JOIN Northwind.dbo.[Order Details] AS OD
392ON P.ProductID = OD.ProductID
393INNER JOIN Northwind.dbo.Orders AS O
394ON OD.OrderID = O.OrderID
395INNER JOIN Northwind.dbo.Customers AS C
396ON O.CustomerID = C.CustomerID
397WHERE C.CustomerID = @CustomerID
398GROUP BY P.ProductName
399ORDER BY 2 desc
400END
401
402EXEC sp_Narudzbe_SelectByCustomerID @CustomerID = BOLID
403
404--21. Koristeæi bazu Northwind pogled v_Narudzbe strukture:
405-- - OrderID
406-- - ShippedDate
407-- - ukupno (predstavlja sumu vrijednosti stavki po narudžbi).
408
409GO
410CREATE VIEW v_Narudzbe
411AS
412SELECT O.OrderID, O.ShippedDate, SUM (OD.Quantity * OD.UnitPrice) 'Ukupno'
413FROM Northwind.dbo.[Order Details] AS OD
414INNER JOIN Northwind.dbo.Orders AS O
415ON OD.OrderID = O.OrderID
416GROUP BY O.OrderID, O.ShippedDate
417GO
418
419--22. Koristeæi pogled v_Narudzbe kreirati proceduru sp_Prodavci_Zemlje sa paramterima:
420-- - startDate, datumski tip
421-- - endDate, datumski tip
422--startDate i endDate su datumi izmeðu kojih se izraèunava suma prometa po narudžbi i obavezno je unijeti oba datuma.
423--Procedura ima sljedeæu strukturu, odnosno vraæa sljedeæe podatke:
424-- - OrderID
425-- - Ukupno
426--pri èemu æe kolona ukupno biti tipa money.
427--Omoguæiti sortiranje u opadajuæem redoslijedu po Ukupno.
428--Nakon kreiranja procedure pokrenuti za vrijednosti
429-- - startDate = 1997-01-01
430-- - endDate = 1997-12-31
431
432GO
433CREATE PROCEDURE sp_Prodavci_Zemlje
434(
435 @startDate DATE,
436 @endDate DATE
437)
438AS
439SELECT OrderID, CAST (Ukupno AS MONEY)
440FROM v_Narudzbe
441WHERE ShippedDate BETWEEN @startDate AND @endDate
442ORDER BY 2
443GO
444
445EXEC sp_Prodavci_Zemlje @startDate = '1997-01-01', @endDate = '1997-12-31'
446
447EXEC sp_Prodavci_Zemlje @startDate = '19970101', @endDate = '19971231'
448
449--23. Iz baze AdventureWorks2017 u bazu Procedure_ kopirati tabelu zaglavlje i tabelu stavke narudžbe za nabavke. Novokreirane tabele imenovati kao zaglavlje i detalji. U kreiranim tabelama definirati PK kao u tabelama u Bazi AdventureWorks2017. Definirati realtionships izmeðu tabela zaglavlje i stavke narudzbe.
450SELECT *
451INTO Detalji
452FROM AdventureWorks2017.Purchasing.PurchaseOrderDetail
453
454SELECT *
455INTO Zaglavlje
456FROM AdventureWorks2017.Purchasing.PurchaseOrderHeader
457
458ALTER TABLE Zaglavlje
459ADD CONSTRAINT PK_Zaglavlje PRIMARY KEY ([PurchaseOrderID])
460
461ALTER TABLE Detalji
462ADD CONSTRAINT PK_Detalji PRIMARY KEY ([PurchaseOrderID],[PurchaseOrderDetailID])
463
464ALTER TABLE Detalji
465ADD CONSTRAINT FK_Detalji_Zaglavlje FOREIGN KEY ([PurchaseOrderID]) REFERENCES Detalji ([PurchaseOrderID])
466
467--24. Kreirati proceduru sp_Narudzbe_Stavke sa paramterima:
468-- - status, kratki cjelobrojni tip
469-- - mjesecNarudzbe, cjelobrojni tip
470-- - kvartalIsporuke, cjelobrojni tip
471-- - vrijednostStavke, realni tip
472--Procedura je sljedeæe strukture:
473-- - status
474-- - mjesec datuma narudžbe
475-- - kvartal datuma isporuke
476-- - naruèena kolièina
477-- - cijena
478-- - vrijednost stavke kao proizvod kolièine i cijene
479--Uslov je da procedura dohvata samo one zapise u kojima je vrijednost kolone ukupno izmeðu 100 i 500, pri èemu æe prilikom pokretanja procedure rezultati biti sortirani u opadajuæem redoslijedu. Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijetog parametra), te da procedura daje rezultat ako je zadovoljena bilo koja od vrijednosti koje su navedene kao vrijednosti parametara.
480--Nakon kreiranja procedure pokrenuti za sljedeæe vrijednosti parametara:
481-- - status = 3
482-- - kvartal_isporuke = 4
483-- - mjesec_narudzbe = 3, status = 1
484
485GO
486CREATE PROCEDURE sp_Narudzbe_Stavke
487(
488 @status TINYINT = NULL,
489 @mjesec_narudzbe INT = NULL,
490 @kvartal_isporuke INT = NULL,
491 @vrijednostStavke REAL = NULL
492)
493AS
494SELECT Z.Status, MONTH (Z.OrderDate) 'Mjesec',
495 DATEPART (QUARTER, Z.ShipDate) 'Kvartal',
496 D.OrderQty, D.UnitPrice, D.OrderQty * D.UnitPrice 'Vrijednost stavke'
497FROM Zaglavlje AS Z
498INNER JOIN Detalji AS D
499ON Z.PurchaseOrderID = D.PurchaseOrderID
500WHERE (Z.Status = @status OR MONTH (Z.OrderDate) = @mjesec_narudzbe OR DATEPART (QUARTER, Z.ShipDate) = @kvartal_isporuke OR
501 D.OrderQty * D.UnitPrice = @vrijednostStavke)
502 AND (D.OrderQty * D.UnitPrice) BETWEEN 100 AND 500
503ORDER BY 6
504GO
505
506EXEC sp_Narudzbe_Stavke @status = 3
507
508EXEC sp_Narudzbe_Stavke @kvartal_isporuke = 4
509
510EXEC sp_Narudzbe_Stavke @mjesec_narudzbe = 3, @status = 1
511
512
513--25. Kreirati proceduru sp_Narudzbe_Stavke_sum sa paramterima:
514-- - status, kratki cjelobrojni tip
515-- - mjesecNarudzbe, cjelobrojni tip
516-- - kvartalIsporuke, cjelobrojni tip
517--Procedura je sljedeæe strukture:
518-- - Status
519-- - mjesec datuma narudžbe
520-- - kvartal datuma isporuke
521-- - ukupnu vrijednost narudžbe
522--Uslov je da procedura dohvata samo one zapise u kojima je vrijednost kolone ukupno izmeðu 10000 i 5 000 000, pri èemu æe prilikom pokretanja procedure rezultati biti sortirani u opadajuæem redoslijedu.
523--Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijetog parametra), te da procedura daje rezultat ako je zadovoljena bilo koja od vrijednosti koje su navedene kao vrijednosti parametara.
524--Nakon kreiranja procedure pokrenuti za sljedeæe vrijednosti parametara:
525-- - status = 1
526-- - kvartal_isporuke = 4, mjesec_narudzbe = 3
527
528GO
529CREATE PROCEDURE sp_Narudzbe_Stavke_sum
530(
531 @status TINYINT = NULL,
532 @mjesec_narudzbe INT = NULL,
533 @kvartal_isporuke INT = NULL
534)
535AS
536SELECT Z.Status, MONTH (Z.OrderDate) 'Mjesec', DATEPART (QUARTER, Z.ShipDate) 'Kvartal', SUM (D.OrderQty * D.UnitPrice) AS Ukupno
537FROM Zaglavlje AS Z
538INNER JOIN Detalji AS D
539ON Z.PurchaseOrderID = D.PurchaseOrderID
540WHERE (Z.Status = @status OR MONTH (Z.OrderDate) = @mjesec_narudzbe OR DATEPART (QUARTER, Z.ShipDate) = @kvartal_isporuke)
541GROUP BY Z.Status, MONTH (Z.OrderDate), DATEPART (QUARTER, Z.ShipDate)
542HAVING SUM(D.OrderQty * D.UnitPrice) BETWEEN 10000 AND 5000000
543ORDER BY 4
544GO
545
546EXEC sp_Narudzbe_Stavke_sum @status = 1
547
548EXEC sp_Narudzbe_Stavke_sum @kvartal_isporuke = 4, @mjesec_narudzbe = 3
549
550--26. Kreirati bazu Indeksi i aktivirati je.
551CREATE DATABASE Indeksi_
552GO
553USE Indeksi_
554
555--27. Kreirati tabelu ProizvodiOsobe koja æe nastati spajanjem tabela Product i Person baze AdventureWorks2017 i prilikom kreiranja importovati 10 miliona zapisa.
556SELECT TOP 100000000 P.ProductID,P.Name,P.ProductNumber,P.Color,P.ListPrice,PP.BusinessEntityID,PP.FirstName,PP.LastName,PP.MiddleName
557INTO ProizvodiOsobe
558FROM AdventureWorks2017.Production.Product AS P
559CROSS JOIN AdventureWorks2017.Person.Person AS PP
560
561--28. Kreirati nonclustered index kojim æe se ubrzati pretraga po imenu i prezimenu. Kreirati testni sluèaj i pogledati aktualni plan izvršenja. Izbrisati kreirani index.
562CREATE INDEX IX_proizvodiOsobe_FirstName_LastName
563ON ProizvodiOsobe(FirstName,LastName)
564
565SELECT PO.FirstName,PO.LastName
566FROM ProizvodiOsobe AS PO
567WHERE PO.FirstName LIKE 'A%' AND PO.LastName LIKE 'S%'
568
569DROP INDEX IX_proizvodiOsobe_FirstName_LastName
570ON ProizvodiOsobe
571
572--29. Kreirati nonclustered indeks koji æe omoguæiti bržu pretragu prema imenu i prezimenu a takoðer pretraga æe biti ubrzana iako se prikaže srednje ime. Kreirati testni sluèaj i pogledati plan izvršenja. Izbrisati kreirani index.
573CREATE INDEX IX_proizvodiOsobe_FirstName_LastName_INC_MiddleName
574ON ProizvodiOsobe(FirstName,LastName) INCLUDE(MiddleName)
575
576SELECT PO.FirstName,PO.LastName,PO.MiddleName
577FROM ProizvodiOsobe AS PO
578WHERE PO.FirstName LIKE 'A%' AND PO.LastName LIKE 'S%' and po.MiddleName like 'L'
579GROUP BY PO.FirstName,PO.LastName,PO.MiddleName
580
581DROP INDEX IX_proizvodiOsobe_FirstName_LastName_INC_MiddleName
582ON ProizvodiOsobe
583
584--30. Kreirati kompozitni primarni kljuè nad kolonama ProductId i BusindessEntityId. Kreirati testni sluèaj za upotrebu primarnog kljuèa.
585ALTER TABLE ProizvodiOsobe
586ADD CONSTRAINT PK_ProizvodiOsobe_ProductId_BusinessEntityID PRIMARY KEY (ProductId, BusinessEntityId)
587
588SELECT *
589FROM ProizvodiOsobe AS PO
590WHERE PO.ProductId = 1 AND PO.BusinessEntityID=14951
591
592
593ALTER TABLE ProizvodiOsobe
594DROP CONSTRAINT PK_ProizvodiOsobe_ProductId_BusinessEntityID
595--31. Kreirati clustered index nad kolonom ProductNumber. Kreirati testni sluèaj za upotrebu indexa i pogledati plan izvršenja. Izbrisati kreirani index.
596CREATE CLUSTERED INDEX IX_proizvodiOsobe_ProductNumber
597ON ProizvodiOsobe(ProductNumber)
598
599SELECT *
600FROM ProizvodiOsobe AS PO
601WHERE PO.ProductNumber LIKE 'A%'
602
603
604
605--Vježba 11_1 :: Zadaci
606USE AdventureWorks2017
607GO
608--1. Kreirati upit koji prikazuje kreditne kartice kojima je plaæeno više od 20 narudžbi. U listu ukljuèiti ime i prezime vlasnika kartice, tip kartice, broj kartice, ukupan iznos plaæen karticom. Rezultate sortirati prema ukupnom iznosu u opadajuæem redoslijedu.
609SELECT PP.FirstName+' '+PP.LastName 'Ime i prezime', CC.CardType 'Tip kartice', CC.CardNumber 'Broj kartice',ROUND( SUM(SOH.TotalDue),2) 'Ukupan iznos'
610FROM Person.Person AS PP
611INNER JOIN Sales.PersonCreditCard AS PCC
612ON PP.BusinessEntityID=PCC.BusinessEntityID
613INNER JOIN Sales.CreditCard AS CC
614ON PCC.CreditCardID=CC.CreditCardID
615INNER JOIN Sales.SalesOrderHeader AS SOH
616ON CC.CreditCardID=SOH.CreditCardID
617GROUP BY PP.FirstName,PP.LastName , CC.CardType , CC.CardNumber
618HAVING COUNT(*)>20
619ORDER BY 4 DESC
620
621
622--2. Prikazati ime i prezime te vrijednost narudžbe (bez popusta) kupaca koji su napravili narudžbu veæu od prosjeène vrijednosti svih narudžbi proizvoda sa id 779
623SELECT P.FirstName,P.LastName, SUM(SOD.OrderQty*SOD.UnitPrice) 'Vrijednost narudžbe'
624FROM Person.Person AS P
625INNER JOIN Sales.Customer AS C
626ON C.PersonID=P.BusinessEntityID
627INNER JOIN Sales.SalesOrderHeader AS SOH
628ON SOH.CustomerID=C.CustomerID
629INNER JOIN Sales.SalesOrderDetail AS SOD
630ON SOD.SalesOrderID=SOH.SalesOrderID
631GROUP BY P.FirstName,P.LastName
632HAVING SUM(SOD.OrderQty*SOD.UnitPrice) >
633(
634 SELECT AVG(SOD1.OrderQty*SOD1.UnitPrice)
635 FROM Sales.SalesOrderDetail AS SOD1
636 WHERE SOD1.ProductID=779
637)
638
639
640
641--3. Kreirati upit koji prikazuje kupce koji su u maju mjesecu 2014. godine naruèili proizvod „Front Brakes“ u kolièini veæoj od 5 komada.
642SELECT CONCAT(PP.FirstName,' ',PP.LastName) 'Ime i prezime', p.Name 'Ime', SOD.OrderQty 'Narucena kolicina',
643CONVERT(NVARCHAR,SOH.OrderDate,104) 'Datum narudzbe'
644FROM Person.Person AS PP
645INNER JOIN Sales.Customer AS C
646ON PP.BusinessEntityID=C.PersonID
647INNER JOIN Sales.SalesOrderHeader AS SOH
648ON C.CustomerID=SOH.CustomerID
649INNER JOIN Sales.SalesOrderDetail AS SOD
650ON SOH.SalesOrderID=SOD.SalesOrderID
651INNER JOIN Production.Product AS P
652ON SOD.ProductID=P.ProductID
653WHERE MONTH(SOH.OrderDate)=5 AND YEAR(SOH.OrderDate)=2014 AND P.Name='Front Brakes' AND SOD.OrderQty>5
654
655
656
657
658--4. Kreirati upit koji prikazuje kupce koji su u 7. mjesecu utrošili više od 200.000 KM. U listu ukljuèiti ime i prezime kupca te ukupni utrošak. Izlaz sortirati prema utrošku opadajuæim redoslijedom.
659SELECT CONCAT (PP.FirstName,' ',PP.LastName) 'Ime i prezime', SUM(SOH.TotalDue) 'Ukupni trošak'
660FROM Person.Person AS PP
661INNER JOIN Sales.Customer AS SC
662ON PP.BusinessEntityID=SC.PersonID
663INNER JOIN Sales.SalesOrderHeader AS SOH
664ON SC.CustomerID=SOH.CustomerID
665WHERE MONTH(SOH.OrderDate)=7
666GROUP BY PP.FirstName,PP.LastName
667HAVING SUM(SOH.TotalDue) > 200000
668ORDER BY 2 DESC
669
670
671--5. Kreirati upit koji prikazuje zaposlenike koji su uradili više od 200 narudžbi. U listu ukljuèiti ime i prezime zaposlenika te ukupan broj uraðenih narudžbi. Izlaz sortirati prema broju narudžbi opadajuæim redoslijedom
672SELECT CONCAT(PP.FirstName,' ',PP.LastName) 'Ime i prezime', COUNT(*) 'Ukupan broj uraðenih narudžbi'
673FROM Person.Person AS PP
674INNER JOIN Sales.SalesPerson AS SP
675ON PP.BusinessEntityID=SP.BusinessEntityID
676INNER JOIN Sales.SalesOrderHeader AS SOH
677ON SP.BusinessEntityID=SOH.SalesPersonID
678GROUP BY PP.FirstName,PP.LastName
679HAVING COUNT(*)>200
680ORDER BY 2 DESC
681
682
683
684--6. Kreirati upit koji prikazuje proizvode kojih na skladištu ima u kolièini manjoj od 30 komada. Lista treba da sadrži naziv proizvoda, naziv skladišta (lokaciju), stanje na skladištu i ukupnu prodanu kolièinu. U rezultate upita ukljuèiti i one proizvode koji nikad nisu prodavani. Ukoliko je ukupna prodana kolièina prikazana kao NULL vrijednost, izlaz formatirati brojem 0.
685SELECT P.Name 'Naziv proizvoda', L.Name 'Naziv skladišta', PI.Quantity 'Stanje na skladištu',
686ISNULL((SELECT SUM(SOD.OrderQty)
687 FROM Sales.SalesOrderDetail AS SOD
688 WHERE SOD.ProductID=P.ProductID),0) 'Prodana kolièina'
689FROM Production.Product AS P
690INNER JOIN Production.ProductInventory AS PI
691ON P.ProductID=PI.ProductID
692INNER JOIN Production.Location AS L
693ON PI.LocationID=L.LocationID
694WHERE (PI.Quantity<30 OR P.ProductID NOT IN(SELECT DISTINCT SOD.ProductID
695 FROM Sales.SalesOrderDetail AS SOD))
696ORDER BY [Prodana kolièina] DESC
697
698
699
700--7. Prikazati ukupnu kolièinu prodaje i ukupnu zaradu (ukljuèujuæi popust) od prodaje svakog pojedinog proizvoda po teritoriji. Uzeti u obzir samo prodaju u sklopu ponude pod nazivom “Volume Discount 11 to 14” i to samo gdje je kolièina prodaje veæa od 100 komada. Zaradu zaokružiti na dvije decimale, te izlaz sortirati po zaradi u opadajuæem redoslijedu.
701SELECT ST.Name 'Teritorija',PP.Name'Naziv proizvoda',SUM(SOD.OrderQty)'Ukupna kolièina prodaje', CAST(SUM((SOD.LineTotal)) AS DECIMAL(10,2)) 'Ukupna zarada'
702FROM Production.Product AS PP
703INNER JOIN Sales.SalesOrderDetail AS SOD
704ON PP.ProductID=SOD.ProductID
705INNER JOIN Sales.SalesOrderHeader AS SOH
706ON SOD.SalesOrderID=SOH.SalesOrderID
707INNER JOIN Sales.SalesTerritory AS ST
708ON SOH.TerritoryID=ST.TerritoryID
709INNER JOIN Sales.SpecialOffer AS SO
710ON SOD.SpecialOfferID=SO.SpecialOfferID
711WHERE SO.Description LIKE 'Volume Discount 11 to 14'
712GROUP BY PP.Name,ST.Name
713HAVING SUM(SOD.OrderQty)>100
714ORDER BY [Ukupna zarada] DESC
715
716SELECT ST.Name 'Teritorija',PP.Name'Naziv proizvoda',SUM(SOD.OrderQty)'Ukupna kolièina prodaje', CAST(SUM((SOD.LineTotal)) AS DECIMAL(10,2)) 'Ukupna zarada'
717FROM Production.Product AS PP
718INNER JOIN Sales.SalesOrderDetail AS SOD
719ON PP.ProductID=SOD.ProductID
720INNER JOIN Sales.SalesOrderHeader AS SOH
721ON SOD.SalesOrderID=SOH.SalesOrderID
722INNER JOIN Sales.SalesTerritory AS ST
723ON SOH.TerritoryID=ST.TerritoryID
724INNER JOIN Sales.SpecialOfferProduct AS SOP
725ON SOP.SpecialOfferID=SOD.SpecialOfferID AND SOP.ProductID=SOD.ProductID
726INNER JOIN Sales.SpecialOffer AS SO
727ON SOP.SpecialOfferID=SO.SpecialOfferID
728WHERE SO.Description LIKE 'Volume Discount 11 to 14'
729GROUP BY PP.Name,ST.Name
730HAVING SUM(SOD.OrderQty)>100
731ORDER BY [Ukupna zarada] DESC
732
733--8. Kreirati upit koji prikazuje naziv proizvoda, naziv lokacije, stanje zaliha na lokaciji, ukupno stanje zaliha na svim lokacijama i ukupnu prodanu kolièinu. Uzeti u obzir prodaju samo u 2013. godini.
734SELECT PP.Name 'Naziv proizvoda', L.Name 'Naziv lokacije', PI.Quantity 'Stanje zaliha',
735(
736 SELECT SUM(PI.Quantity)
737 FROM Production.ProductInventory AS PI
738 WHERE PI.ProductID=PP.ProductID
739) 'Ukupno na svim lokacijama',
740(
741 SELECT SUM(SOD.OrderQty)
742 FROM Sales.SalesOrderDetail AS SOD
743 INNER JOIN Sales.SalesOrderHeader AS SOH
744 ON SOD.SalesOrderID=SOH.SalesOrderID
745 WHERE PP.ProductID=SOD.ProductID AND YEAR(SOH.OrderDate)=2013
746) 'Ukupna prodana kolièina'
747FROM Production.Product AS PP
748INNER JOIN Production.ProductInventory AS PI
749ON PP.ProductID=PI.ProductID
750INNER JOIN Production.Location AS L
751ON PI.LocationID=L.LocationID
752ORDER BY [Ukupna prodana kolièina] DESC
753
754
755
756--9. Kreirati upit kojim æe se prikazati narudžbe kojima je na osnovu popusta kupac uštedio 100KM i više. Upit treba da sadrži broj narudžbe, naziv kupca i stvarnu ukupnu vrijednost narudžbe zaokruženu na 2 decimale. Podatke je potrebno sortirati rastuæim redosljedom od najmanjeg do najveæeg.
757SELECT SOH.SalesOrderID, PP.FirstName +' '+PP.LastName 'Kupac', CAST(SUM(SOD.LineTotal) AS DECIMAL(18,2)) 'Ukupna vrijednost'
758FROM Sales.SalesOrderHeader AS SOH
759INNER JOIN Sales.Customer AS SC
760ON SOH.CustomerID=SC.CustomerID
761INNER JOIN Person.Person AS PP
762ON SC.PersonID=PP.BusinessEntityID
763INNER JOIN Sales.SalesOrderDetail AS SOD
764ON SOD.SalesOrderID=SOH.SalesOrderID
765GROUP BY SOH.SalesOrderID, PP.FirstName +' '+PP.LastName
766HAVING SUM(SOD.UnitPrice*SOD.OrderQty*SOD.UnitPriceDiscount)>=100
767ORDER BY 3
768
769
770--10. Kreirati upit kojim se prikazuje da li su muškarci ili žene napravili veæi broj narudžbi. Naèin provjere spola jeste da osobe èije ime završava slovom „a“ predstavljaju ženski spol. U rezultatima upita prikazati spol (samo jedan), ukupan broj narudžbi koje su napravile osobe datog spola i ukupnu potrošenu vrijednost zaokruženu na dvije decimale.
771SELECT TOP 1 COUNT(*) 'Broj narudžbi',IIF(RIGHT(PP.FirstName,1)='a', 'Ž','M') 'Broj narudžbi', ROUND(SUM(SOH.TotalDue),2) 'Ukupna potrošena vrijednost'
772FROM Person.Person AS PP
773INNER JOIN Sales.Customer AS SC
774ON PP.BusinessEntityID=SC.PersonID
775INNER JOIN Sales.SalesOrderHeader AS SOH
776ON SOH.CustomerID=SC.CustomerID
777GROUP BY IIF(RIGHT(PP.FirstName,1)='a', 'Ž','M')
778ORDER BY 1 DESC
779
780
781--11. Kreirati upit koji prikazuje ukupan broj proizvoda, ukupnu kolièinu proizvoda na lageru, te ukupnu vrijednost proizvoda na lageru (skladištu). Rezultate prikazati grupisane po nazivu dobavljaèa te uzeti u obzir samo one zapise gdje je sumarna kolièina na lageru veæa od 100 i vrijednost cijene proizvoda veæa od 0.
782SELECT PV.Name,COUNT(*) 'Ukupan broj proizvoda', SUM(PPI.Quantity) 'Uk. kolièina na lageru', SUM(PP.ListPrice*PPI.Quantity) 'Uk. vrijednost proizvoda na lageru'
783FROM Production.ProductInventory AS PPI
784INNER JOIN Production.Product AS PP
785ON PPI.ProductID = PP.ProductID
786INNER JOIN Purchasing.ProductVendor AS PPV
787ON PPV.ProductID = PP.ProductID
788INNER JOIN Purchasing.Vendor AS PV
789ON PPV.BusinessEntityID=PV.BusinessEntityID
790WHERE PP.ListPrice > 0
791GROUP BY PV.Name
792HAVING SUM(PPI.Quantity) > 1000
793
794
795
796--Vježba 11_2 :: Zadaci
797
798--1. Kreirati bazu View_ i aktivirati je.
799CREATE DATABASE View_
800GO
801USE View_
802--2. U bazi View kreirati pogled v_Employee sljedeæe strukture:
803-- - prezime i ime uposlenika kao polje ime i prezime,
804-- - teritoriju i
805-- - regiju koju pokrivaju
806--Uslov je da se dohvataju uposlenici koji su stariji od 60 godina.(Northwind)
807GO
808CREATE VIEW v_Employee
809AS
810SELECT E.[FirstName] + ' ' + e.[LastName] 'Ime i prezime', T.[TerritoryDescription] 'Teritorija', R.[RegionDescription] 'Regija'
811FROM Northwind.dbo.Employees AS E
812INNER JOIN Northwind.dbo.EmployeeTerritories AS ET
813ON E.EmployeeID=ET.EmployeeID
814INNER JOIN Northwind.dbo.Territories AS T
815ON ET.TerritoryID=T.TerritoryID
816INNER JOIN Northwind.dbo.Region AS R
817ON T.RegionID=R.RegionID
818WHERE DATEDIFF (YEAR, E.[BirthDate], GETDATE ()) > 60
819GO
820
821--3. Koristeæi pogled v_Employee prebrojati broj teritorija koje uposlenik pokriva po jednoj regiji.(Northwind)
822SELECT VE.[Ime i prezime], VE.Regija, COUNT(VE.Teritorija) 'Broj teritorija'
823FROM v_Employee AS VE
824GROUP BY VE.[Ime i prezime], VE.Regija
825ORDER BY 3 DESC,1
826
827--4. Kreirati pogled v_Sales sljedeæe strukture: (Adventureworks2017)
828-- - Id kupca
829-- - Ime i prezime kupca
830-- - Godinu narudžbe
831-- - Vrijednost narudžbe bez troškova prevoza i takse
832GO
833CREATE VIEW v_Sales
834AS
835SELECT SC.CustomerID 'Id kupca', CONCAT(PP.FirstName, ' ', PP.LastName) 'Ime i prezime kupca', YEAR(SOH.OrderDate) 'Godina narudžbe', SOH.SubTotal 'Vrijednost'
836FROM AdventureWorks2017.Person.Person AS PP
837INNER JOIN AdventureWorks2017.Sales.Customer AS SC
838ON PP.BusinessEntityID=SC.PersonID
839INNER JOIN AdventureWorks2017.Sales.SalesOrderHeader AS SOH
840ON SC.CustomerID=SOH.CustomerID
841GO
842
843--5. Koristeæi pogled v_Sales dati pregled sumarno ostvarenih prometa po osobi i godini.
844SELECT VS.[Godina narudžbe],VS.[Ime i prezime kupca],SUM(VS.Vrijednost) 'Sumarno ostvaren promet'
845FROM v_Sales AS VS
846GROUP BY VS.[Godina narudžbe],VS.[Ime i prezime kupca]
847
848--6. Koristeæi pogled v_Sales dati pregled zapisa iz 2013. godine u kojima je vrijednost narudžbe bez troškova prevoza i takse u intervalu 10% u odnosu na srednju vrijednost SubTotala iz 2013 godine. Pregled treba da sadrži ime i prezime kupca i vrijednost narudžbe.
849GO
850CREATE VIEW v_Sales2013
851AS
852SELECT *
853FROM v_Sales AS VS
854WHERE VS.[Godina narudžbe]= 2013
855GO
856
857SELECT VS13.[Ime i prezime kupca], VS13.Vrijednost
858FROM v_Sales2013 AS VS13
859WHERE VS13.Vrijednost BETWEEN
860 (SELECT AVG (VS13_2.Vrijednost) FROM v_Sales2013 AS VS13_2) - 0.1 * (SELECT AVG (VS13_2.Vrijednost) FROM v_Sales2013 AS VS13_2)
861 AND
862 (SELECT AVG (VS13_2.Vrijednost) FROM v_Sales2013 AS VS13_2) + 0.1 * (SELECT AVG (VS13_2.Vrijednost) FROM v_Sales2013 AS VS13_2)
863ORDER BY 2 DESC
864
865
866
867--DRUGI NAÈIN
868
869SELECT VS.[Ime i prezime kupca],VS.Vrijednost
870FROM v_Sales AS VS
871WHERE VS.[Godina narudžbe]=2013
872AND VS.Vrijednost BETWEEN
873(SELECT AVG(VS.Vrijednost)
874FROM v_Sales AS VS
875WHERE VS.[Godina narudžbe]=2013)-0.1*(SELECT AVG(VS.Vrijednost) FROM v_Sales AS VS
876 WHERE VS.[Godina narudžbe]=2013) AND (SELECT AVG(VS.Vrijednost) FROM v_Sales AS VS
877 WHERE VS.[Godina narudžbe]=2013)+0.1*
878 (SELECT AVG(VS.Vrijednost) FROM v_Sales AS VS
879 WHERE VS.[Godina narudžbe]=2013)
880ORDER BY 2 DESC
881
882--7. Kreirati tabelu Zaposlenici te prilikom kreiranja uraditi insert podataka iz tabele Employees baze Northwind.
883SELECT*
884INTO Zaposlenici
885FROM Northwind.dbo.Employees
886--8. Kreirati pogled v_Zaposlenici koji æe dati pregled ID-a, imena, prezimena i države zaposlenika.
887GO
888CREATE VIEW v_Zaposlenici
889AS
890SELECT Z.EmployeeID,Z.FirstName,Z.LastName,Z.Country
891FROM Zaposlenici AS Z
892GO
893
894--9. Modificirati prethodno kreirani pogled te onemoguæiti unos podataka kroz pogled za uposlenike koji ne dolaze iz Amerike ili Velike Britanije.
895CREATE OR ALTER VIEW v_Zaposlenici
896AS
897SELECT Z.EmployeeID,Z.FirstName,Z.LastName,Z.Country
898FROM Zaposlenici AS Z
899WHERE Z.Country LIKE 'USA' OR Z.Country LIKE 'UK'
900WITH CHECK OPTION
901GO
902
903--10. Testirati prethodno modificiran view unosom ispravnih i neispravnih podataka (napisati 2 testna sluèaja).
904INSERT INTO v_Zaposlenici
905VALUES ('FirstName1','LastName1', 'BIH')
906
907INSERT INTO v_Zaposlenici
908VALUES ('FirstName1','LastName1', 'USA')
909
910SELECT*
911FROM v_Zaposlenici
912
913SELECT*
914FROM Zaposlenici
915--11. Koristeæi tabele Purchasing.Vendor i Purchasing.PurchaseOrderDetail kreirati pogled sljedeæe strukture:
916-- - Name iz tabele Vendor
917-- - PurchaseOrderID iz tabele Purchasing.PurchaseOrderDetail
918-- - DueDate iz tabele Purchasing.PurchaseOrderDetail
919-- - OrderQty iz tabele Purchasing.PurchaseOrderDetail
920-- - UnitPrice iz tabele Purchasing.PurchaseOrderDetail
921-- - ukupno kao proizvod OrderQty i UnitPrice
922--Uslov je da se dohvate samo oni zapisi kod kojih DueDate pripada 1. ili 3. kvartalu. (AdventureWorks2017)
923GO
924CREATE VIEW V_Purchasing
925AS
926SELECT V.Name,POD.PurchaseOrderID,POD.DueDate,POD.OrderQty,POD.UnitPrice,POD.UnitPrice*POD.OrderQty 'Ukupno'
927FROM AdventureWorks2017.Purchasing.Vendor AS V
928INNER JOIN AdventureWorks2017.Purchasing.PurchaseOrderHeader AS POH
929ON V.BusinessEntityID=POH.VendorID
930INNER JOIN AdventureWorks2017.Purchasing.PurchaseOrderDetail AS POD
931ON POH.PurchaseOrderID=POD.PurchaseOrderID
932WHERE DATEPART(QUARTER,POD.DueDate)=1 OR DATEPART(QUARTER,POD.DueDate)=3
933--WHERE MONTH (POD.DueDate) IN (1,2,3,7,8,9)
934GO
935
936--12. Koristeæi pogled v_Purchasing dati pregled svih dobavljaèa(e) koji je u sklopu narudžbe imao stavke èija je ukupni broj stavki jednak minimumu, odnosno, maksimumu ukupnog broja stavki (proizvoda) po narudžbi.
937--Pregled treba imati sljedeæu strukturu:
938-- - Name
939-- - PurchaseOrderID
940-- - prebrojani broj
941GO
942CREATE VIEW V_Purchasing_prebrojano
943AS
944SELECT VP.Name,VP.PurchaseOrderID,COUNT(*) 'Prebrojano'
945FROM V_Purchasing AS VP
946GROUP BY VP.Name,VP.PurchaseOrderID
947GO
948
949SELECT VPP.Name,VPP.PurchaseOrderID, Prebrojano
950FROM V_Purchasing_prebrojano AS VPP
951WHERE VPP.Prebrojano=(SELECT MAX(VPP.Prebrojano) FROM V_Purchasing_prebrojano AS VPP) OR VPP.Prebrojano=(SELECT MIN(VPP.Prebrojano) FROM V_Purchasing_prebrojano AS VPP)
952
953--13. U bazi radna kreirati tabele Osoba i Uposlenik.
954--Strukture tabela su sljedeæe:
955
956--- Osoba
957-- OsobaID cjelobrojna varijabla, primarni kljuè
958-- VrstaOsobe 2 unicode karaktera, obavezan unos
959-- Prezime 50 unicode karaktera, obavezan unos
960-- Ime 50 unicode karaktera, obavezan unos
961
962--- Uposlenik
963-- UposlenikID cjelobrojna varijabla, primarni kljuè
964-- NacionalniID 15 unicode karaktera, obavezan unos
965-- LoginID 256 unicode karaktera, obavezan unos
966-- RadnoMjesto 50 unicode karaktera, obavezan unos
967-- DtmZapos datumska varijabla
968--Spoj tabela napraviti prema spoju izmeðu tabela
969--Person.Person i HumanResources.Employee baze AdventureWorks2017.
970CREATE TABLE Osoba
971(
972 OsobaID INT CONSTRAINT PK_Osoba PRIMARY KEY,
973 VrstaOsobe NVARCHAR (2) NOT NULL,
974 Prezime NVARCHAR (50) NOT NULL,
975 Ime NVARCHAR (50) NOT NULL
976)
977
978CREATE TABLE Uposlenik
979(
980 UposlenikID INT CONSTRAINT PK_Uposlenik PRIMARY KEY,
981 NacionalniID NVARCHAR (15) NOT NULL,
982 LoginID NVARCHAR (256) NOT NULL,
983 RadnoMjesto NVARCHAR (50) NOT NULL,
984 DtmZapos DATE,
985 CONSTRAINT FK_Uposlenik_Osoba FOREIGN KEY (UposlenikID) REFERENCES Osoba (OsobaID)
986)
987
988--14. Nakon kreiranja tabela u tabelu Osoba kopirati odgovarajuæe podatke iz tabele Person.Person, a u tabelu Uposlenik kopirati odgovarajuæe zapise iz tabele HumanResources.Employee.
989INSERT INTO Osoba
990SELECT P.BusinessEntityID,P.PersonType,P.LastName,P.FirstName
991FROM AdventureWorks2017.Person.Person AS P
992
993INSERT INTO Uposlenik
994SELECT E.BusinessEntityID, E.NationalIDNumber, E.LoginID, E.JobTitle, E.HireDate
995FROM AdventureWorks2017.HumanResources.Employee AS E
996
997--15. Kreirati pogled (view) v_osoba_uposlenik nad tabelama Uposlenik i Osoba koji æe sadržavati sva polja obje tabele.
998GO
999CREATE VIEW v_Osoba_Uposlenik
1000AS
1001SELECT *
1002FROM Osoba AS O
1003INNER JOIN Uposlenik AS U
1004ON O.OsobaID = U.UposlenikID
1005GO
1006
1007--16. Koristeæi pogled v_osoba_uposlenik prebrojati koliko se osoba zaposlilo po godinama.
1008SELECT YEAR (VOU.DtmZapos) 'Godina', COUNT (*) 'Broj osoba'
1009FROM v_Osoba_Uposlenik AS VOU
1010GROUP BY YEAR (VOU.DtmZapos)
1011ORDER BY 2
1012
1013
1014
1015
1016
1017--Vježba 12 :: Zadaci
1018
1019--1. Kreirati bazu Function_ i aktivirati je.
1020CREATE DATABASE Function_
1021GO
1022USE Function_
1023--2. Kreirati tabelu Zaposlenici te prilikom kreiranja uraditi insert podataka iz tabele Employees baze Northwind.
1024SELECT*
1025INTO Zaposlenici
1026FROM pubs.dbo.employee
1027
1028--3. U tabeli uposlenici dodati izraèunatu (stalno pohranjenu) kolonu godina kojom æe se iz kolone hire_date izdvajati godina uposlenja.
1029ALTER TABLE Zaposlenici
1030ADD GodinaZaposlenja AS YEAR(hire_date)
1031
1032SELECT*
1033FROM Zaposlenici
1034--4. Kreirati funkciju f_ocjena sa parametrom brojBodova, cjelobrojni tip koja æe vraæati poruke po sljedeæem pravilu:
1035-- - brojBodova < 55 nedovoljan broj bodova
1036-- - brojBodova 55 - 65 šest (6)
1037-- - broj Bodova 65 - 75 sedam (7)
1038-- - brojBodova 75 - 85 osam (8)
1039-- - broj Bodova 85 - 95 devet (9)
1040-- - brojBodova 95-100 deset
1041-- - brojBodova >100 fatal error
1042--Kreirati testne sluèajeve.
1043GO
1044CREATE FUNCTION f_ocjena
1045(
1046 @brojBodova int
1047)
1048RETURNS VARCHAR (30)
1049AS
1050BEGIN
1051 DECLARE @poruka VARCHAR (50)
1052 SET @poruka = 'nedovoljan broj bodova'
1053 IF @brojBodova BETWEEN 55 AND 64 SET @poruka = 'šest (6)'
1054 IF @brojBodova BETWEEN 65 AND 74 SET @poruka = 'sedam (7)'
1055 IF @brojBodova BETWEEN 75 AND 84 SET @poruka = 'osam (8)'
1056 IF @brojBodova BETWEEN 85 AND 94 SET @poruka = 'devet (9)'
1057 IF @brojBodova BETWEEN 95 AND 100 SET @poruka = 'deset (10)'
1058 IF @brojBodova>100 SET @poruka = 'fatal error'
1059 RETURN @poruka
1060END
1061GO
1062SELECT dbo.f_ocjena(55),dbo.f_ocjena(40),dbo.f_ocjena(80)
1063
1064--5. Kreirati funkciju f_godina koja vraæa podatke u formi tabele sa parametrom godina, cjelobrojni tip. Parametar se referira na kolonu godina tabele uposlenici, pri èemu se trebaju vraæati samo oni zapisi u kojima je godina veæa od unijete vrijednosti parametra. Potrebno je da se prilikom pokretanja funkcije u rezultatu nalaze sve kolone tabele uposlenici. Provjeriti funkcioniranje funkcije unošenjem kontrolnih vrijednosti.
1065GO
1066CREATE FUNCTION f_godina
1067(
1068@godina INT
1069)
1070RETURNS TABLE
1071AS
1072RETURN
1073SELECT*
1074FROM Zaposlenici AS Z
1075WHERE Z.GodinaZaposlenja>@godina
1076
1077
1078SELECT *
1079FROM f_godina (1993)
1080ORDER BY 9
1081--6. Kreirati funkciju f_pub_id koja vraæa podatke u formi tabele sa parametrima:
1082-- - prva_cifra, kratki cjelobrojni tip
1083-- - job_id, kratki cjelobrojni tip
1084--Parametar prva_cifra se referira na prvu cifru kolone pub_id tabele uposlenici, pri èemu je njegova zadana vrijednost 0. Parametar job_id se referira na kolonu job_id tabele uposlenici. Potrebno je da se prilikom pokretanja funkcije u rezultatu nalaze sve kolone tabele uposlenici. Provjeriti funkcioniranje funkcije unošenjem vrijednosti za parametar job_id = 5
1085GO
1086CREATE FUNCTION f_pub_id
1087(
1088 @prva_cifra TINYINT = 0,
1089 @job_id TINYINT
1090)
1091RETURNS TABLE
1092AS
1093RETURN
1094 SELECT *
1095 FROM Zaposlenici AS Z
1096 WHERE LEFT (Z.pub_id,1) = @prva_cifra and
1097 Z.job_id = @job_id
1098GO
1099
1100SELECT *
1101FROM f_pub_id (DEFAULT, 5)
1102--7. Kreirati tabelu detalji, te prilikom kreiranja uraditi isert podataka iz tabele Order Details baze Northwind.
1103SELECT*
1104INTO Detalji
1105FROM Northwind.dbo.[Order Details]
1106--8. Kreirati funkciju f_ukupno sa parametrima
1107-- - UnitPrice novèani tip money,
1108-- - Quantity kratki cjelobrojni tip
1109-- - Discount realni broj
1110--Funkcija æe vraæati rezultat tip decimal (10,2) koji æe raèunati po pravilu:
1111-- UnitPrice * Quantity * (1 - Discount)
1112GO
1113CREATE FUNCTION f_ukupno
1114(
1115@UnitPrice MONEY,
1116@Quantity SMALLINT,
1117@Discount REAL
1118)
1119RETURNS DECIMAL(10,2)
1120AS
1121BEGIN
1122RETURN @UnitPrice*@Quantity*(1-@Discount)
1123END
1124GO
1125
1126SELECT dbo.f_ukupno(2,2,0.1)
1127--9. Koristeæi funkciju f_ukupno u tabeli detalji prikazati ukupnu vrijednost prometa po ID proizvoda.
1128SELECT ProductID, SUM (dbo.f_ukupno([UnitPrice],[Quantity],[Discount])) 'Ukupno'
1129FROM Detalji
1130GROUP BY ProductID
1131ORDER BY 1
1132--10. Koristeæi funkciju f_ukupno u tabeli detalji kreirati pogled v_f_ukupno u kojem æe biti prijazan ukupan promet po ID narudžbe.
1133GO
1134CREATE VIEW v_f_ukupno
1135AS
1136SELECT OrderID, SUM (dbo.f_ukupno([UnitPrice],[Quantity],[Discount])) as 'Ukupno'
1137FROM Detalji
1138GROUP BY OrderID
1139GO
1140--11. Iz pogleda v_f_ukupno odrediti najmanju i najveæu vrijednost sume.
1141SELECT MIN(VU.Ukupno) 'Min', MAX(VU.Ukupno) 'Max'
1142FROM v_f_ukupno AS VU
1143--12. Kreirati tabelu Kupovina, te prilikom kreiranja uraditi insert podataka iz tabele PurchaseOrderDetail baze AdventureWorks2017.
1144--Tabela æe sadržavati kolone:
1145-- - PurchaseOrderID,
1146-- - PurchaseOrderDetailID,
1147-- - UnitPrice
1148-- - RejectedQty,
1149-- - RazlikaKolicina koja predstavlja razliku izmeðu naruèene i primljene kolièine
1150SELECT POD.PurchaseOrderID,POD.PurchaseOrderDetailID,POD.UnitPrice,POD.RejectedQty,POD.OrderQty-POD.ReceivedQty 'RazlikaKolicina'
1151INTO Kupovina
1152FROM AdventureWorks2017.Purchasing.PurchaseOrderDetail AS POD
1153--13. Kreirati funkciju f_rejected koja vraæa podatke u formi tabele sa parametrima:
1154-- - RejectedQty decimal (8,2)
1155-- - RazlikaKolicina int
1156--Parametar RejectedQty se referira na kolonu RejectedQty tabele kupovina, pri èemu je njegova zadana vrijednost 0. Parametar RazlikaKolicina se odnosi na kolonu RazlikaKolicina. Potrebno je da se prilikom pokretanja funkcije u rezultatu nalaze sve kolone tabele uposlenici. Provjeriti funkcioniranje funkcije unošenjem vrijednosti za parametar RazlikaKolicina = 27, pri èemu æe upit vraæati sume UnitPrice po PurchaseOrderID.
1157--Sortirati po sumiranim vrijednostima u opadajuæem redoslijedu.
1158
1159GO
1160CREATE FUNCTION f_rejected
1161(
1162@RejectedQty DECIMAL (8,2)=0,
1163@RazlikaKolicina INT
1164)
1165RETURNS TABLE
1166AS
1167RETURN
1168 SELECT *
1169 FROM Kupovina
1170 WHERE RejectedQty= @RejectedQty AND
1171 RazlikaKolicina = @RazlikaKolicina
1172GO
1173
1174SELECT DISTINCT RazlikaKolicina
1175FROM kupovina
1176
1177--0.00
1178--62.00
1179--5.00
1180--3.00
1181--1.00
1182--280.00
1183--187.00
1184--27.00
1185--82.00
1186--9.00
1187
1188
1189SELECT PurchaseOrderID, SUM (UnitPrice)'Ukupno'
1190FROM f_rejected (DEFAULT, 27)
1191GROUP BY PurchaseOrderID
1192ORDER BY 2 DESC
1193
1194--14. Kreirati bazu Trigger_ i aktivirati je.
1195CREATE DATABASE Trigger_
1196GO
1197USE Trigger_
1198--15. Kreirati tabelu Autori, te prilikom kreiranja uraditi insert podataka iz tabele Authors baze Pubs.
1199SELECT*
1200INTO Autori
1201FROM pubs.dbo.authors
1202--16. 16. Kreirati tabelu Autori_log strukture:
1203 --- log_id int identity (1,1)
1204 --- au_id varchar (11)
1205 --- dogadjaj varchar (3)
1206 --- mod_date datetime
1207CREATE TABLE Autori_log
1208(
1209 log_id INT IDENTITY (1,1),
1210 au_id VARCHAR (11),
1211 dogadjaj VARCHAR (3),
1212 mod_date DATETIME
1213)
1214--17. Nad tabelom Autori kreirati okidaè t_ins_autori kojim æe se prilikom inserta podataka u tabelu autori izvršiti insert podataka u tabelu Autori_log.
1215GO
1216CREATE TRIGGER t_ins_autori
1217ON Autori
1218AFTER INSERT
1219AS
1220BEGIN
1221 INSERT INTO autori_log
1222 SELECT au_id, 'ins', GETDATE ()
1223 FROM inserted
1224 --select * from inserted
1225 --select * from deleted
1226END
1227--18. U tabelu Autori insertovati zapis
1228--'1', 'Ringer', 'Albert', '801 826-0752', '67 Seventh Av.', 'Salt Lake City', 'UT', 84152, 1
1229--'2', 'Green', 'Marjorie', '415 986-7020', '309 63rd St. #411', 'Oakland', 'CA', 94618, 1
1230--Provjeriti stanje u tabelama Autori i Autori_log.
1231INSERT INTO Autori
1232VALUES
1233('1', 'Ringer', 'Albert', '801 826-0752', '67 Seventh Av.', 'Salt Lake City', 'UT', 84152, 1),
1234('2', 'Green', 'Marjorie', '415 986-7020', '309 63rd St. #411', 'Oakland', 'CA', 94618, 1)
1235
1236SELECT *
1237FROM Autori
1238
1239SELECT *
1240FROM autori_log
1241--19. Nad tabelom Autori kreirati okidaè t_upd_autori kojim æe se prilikom update podataka u tabeli Autori izvršiti insert podataka u tabelu autori_log.
1242GO
1243CREATE TRIGGER t_upd_autori
1244ON Autori
1245AFTER UPDATE
1246AS
1247BEGIN
1248 INSERT INTO Autori_log
1249 SELECT au_id, 'upd', GETDATE ()
1250 FROM inserted
1251 SELECT * FROM inserted
1252 SELECT * FROM deleted
1253END
1254--20. U tabeli autori napraviti update zapisa u kojem je au_id = 998-72-3567 tako što æe se vrijednost kolone au_lname postaviti na prezime. Provjeriti stanje u tabelama autori i autori_log.
1255UPDATE Autori
1256SET au_lname = 'prezime'
1257WHERE au_id = '998-72-3567'
1258
1259SELECT * FROM autori
1260SELECT * FROM autori_log
1261--21. Nad tabelom Autori kreirati okidaè t_del_autori kojim æe se prilikom brisanja podataka u tabeli Autori izvršiti insert podataka u tabelu Autori_log.
1262s
1263GO
1264CREATE TRIGGER t_del_autori
1265ON Autori
1266AFTER DELETE
1267AS
1268BEGIN
1269 INSERT INTO Autori_log
1270 SELECT au_id, 'del', GETDATE ()
1271 FROM deleted
1272 SELECT * FROM inserted
1273 SELECT * FROM deleted
1274END
1275--22. U tabeli Autori obrisati zapis u kojem je au_id = 3. Provjeriti stanje u tabelama Autori i Autori_log.
1276DELETE
1277FROM Autori
1278WHERE au_id = '2'
1279
1280SELECT * FROM autori
1281SELECT * FROM autori_log
1282--23. Kreirati tabelu Autori_instead_log strukture:
1283-- - log_id INT IDENTITY (1,1),
1284-- - au_id VARCHAR (11),
1285-- - dogadjaj VARCHAR (15),
1286-- - mod_date datetime
1287
1288CREATE TABLE Autori_instead_log
1289(
1290log_id INT IDENTITY (1,1),
1291au_id VARCHAR (11),
1292dogadjaj VARCHAR (15),
1293mod_date datetime
1294)
1295--24. Nad tabelom autori kreirati okidaè t_instead_ins_autori kojim æe se onemoguæiti insert podataka u tabelu autori. Okidaè treba da vraæa poruku da insert nije izvršen.
1296GO
1297CREATE TRIGGER t_instead_ins_autori
1298ON Autori
1299INSTEAD OF INSERT
1300AS
1301BEGIN
1302 SELECT 'Insert nije izvršen'
1303 INSERT INTO Autori_instead_log
1304 SELECT au_id, 'not_insert', GETDATE ()
1305 FROM inserted
1306 SELECT * FROM inserted
1307 SELECT * FROM deleted
1308END
1309GO
1310--25. U tabelu autori insertovati zapis
1311--'3', 'Ringer', 'Albert', '801 826-0752', '67 Seventh Av.', 'Salt Lake City', 'UT', 84152, 1
1312--Provjeriti stanje u tabelama autori, autori_log i autori_instead_log.
1313INSERT INTO Autori
1314VALUES ('3', 'Ringer', 'Albert', '801 826-0752', '67 Seventh Av.', 'Salt Lake City', 'UT', 84152, 1)
1315
1316SELECT * FROM Autori
1317SELECT * FROM Autori_log
1318SELECT * FROM Autori_instead_log
1319--26. Nad tabelom Autori kreirati okidaè t_instead_upd_autori kojim æe se onemoguæiti update podataka u tabelu Autori. Okidaè treba da vraæa poruku da update nije izvršen.
1320GO
1321CREATE TRIGGER t_instead_upd_autori
1322ON Autori
1323INSTEAD OF UPDATE
1324AS
1325BEGIN
1326 SELECT 'Update nije izvršen'
1327 INSERT INTO Autori_instead_log
1328 SELECT au_id, 'not_update', GETDATE ()
1329 FROM inserted
1330 SELECT * FROM inserted
1331 SELECT * FROM deleted
1332END
1333--27. U tabeli Autori pokušati update zapisa u kojem je au_id = 172-32-1176 tako što æe se vrijednost kolone contract postaviti na 0. Provjeriti stanje u tabelama autori i autori_instead_log.
1334UPDATE Autori
1335SET contract = 0
1336WHERE au_id = '172-32-1176'
1337
1338SELECT * FROM Autori
1339SELECT * FROM Autori_log
1340SELECT * FROM Autori_instead_log
1341--28. Nad tabelom autori kreirati okidaè t_instead_del_autori kojim æe se onemoguæiti delete podataka u tabelu autori. Okidaè treba da vraæa poruku da delete nije izvršen.
1342--CHECK
1343GO
1344CREATE OR ALTER TRIGGER t_instead_del_autori
1345ON Autori
1346INSTEAD OF DELETE
1347AS
1348BEGIN
1349 SELECT 'Delete nije izvršen'
1350 INSERT INTO Autori_instead_log
1351 SELECT au_id, 'not_delete', GETDATE ()
1352 FROM deleted
1353 --SELECT * FROM inserted
1354 --SELECT * FROM deleted
1355END
1356--29. U tabeli autori pokušati obrisati zapis u kojem je au_id = 172-32-1176. Provjeriti stanje u tabelama autori i autori_instead_log.
1357DELETE Autori
1358WHERE au_id = '172-32-1176'
1359
1360SELECT * FROM Autori
1361SELECT * FROM Autori_log
1362SELECT * FROM Autori_instead_log
1363--30. Iskljuæiti okidaè t_instead_ins_autori.
1364DISABLE TRIGGER t_instead_ins_autori ON Autori
1365--31. U tabelu Autori insertovati zapis
1366--'3', 'Ringer', 'Albert', '801 826-0752', '67 Seventh Av.', 'Salt Lake City', 'UT', 84152, 1
1367--Provjeriti stanje u tabelama Autori, Autori_log i Autori_instead_log.
1368INSERT INTO Autori
1369VALUES ('3', 'Ringer', 'Albert', '801 826-0752', '67 Seventh Av.', 'Salt Lake City', 'UT', 84152, 1)
1370
1371SELECT * FROM Autori
1372SELECT * FROM Autori_log
1373SELECT * FROM Autori_instead_log
1374
1375--32. Iskljuèiti sve okidaèe nad tabelom autori.
1376DISABLE TRIGGER ALL ON Autori
1377--33. Ukljuèiti sve okidaèe nad tabelom autori.
1378ENABLE TRIGGER ALL ON Autori
1379
1380
1381
1382
1383--1. Koristeæi bazu Northwind izdvojiti godinu, mjesec i dan datuma isporuke narudžbe.
1384SELECT YEAR(O.ShippedDate) AS Godina, MONTH(O.ShippedDate) AS Mjesec, DAY(O.ShippedDate) AS Dan
1385FROM Northwind.dbo.Orders AS O
1386--2. Koristeæi bazu Northwind izraèunati koliko je vremena prošlo od datum narudžbe do danas.
1387USE Northwind
1388SELECT DATEDIFF(YEAR,O.OrderDate,GETDATE()) AS 'Broj godina'
1389FROM Orders AS O
1390--3. Koristeæi bazu Northwind dohvatiti sve zapise u kojima ime zaposlenika poèinje slovom A.
1391SELECT*
1392FROM Employees AS E
1393WHERE E.FirstName LIKE 'A%'
1394--4. Koristeæi bazu Pubs dohvatiti sve zapise u kojima ime zaposlenika poèinje slovom A ili M.
1395SELECT*
1396FROM pubs.dbo.employee AS E
1397WHERE E.fname LIKE 'A%' OR E.fname LIKE 'M%'
1398
1399--% Represents zero or more characters bl% finds bl, black, blue, and blob
1400--_ Represents a single character h_t finds hot, hat, and hit
1401--[] Represents any single character within the brackets h[oa]t finds hot and hat, but not hit
1402--^ Represents any character not in the brackets h[^oa]t finds hit, but not hot and hat
1403--- Represents any single character within the specified range c[a-b]t finds cat and cbt
1404SELECT*
1405FROM pubs.dbo.employee AS E
1406WHERE E.fname LIKE '[AM]%'
1407
1408--5. Koristeæi bazu Northwind prikazati sve kupce koje u koloni ContactTitle sadrže pojam "manager".
1409SELECT*
1410FROM Customers AS C
1411WHERE C.ContactTitle LIKE '%manager%'
1412--6. Koristeæi bazu Northwind dohvatiti sve kupce kod kojih se poštanski broj sastoji samo od cifara.
1413SELECT*
1414FROM Customers AS C
1415WHERE C.PostalCode LIKE '[0-9]%' AND C.PostalCode NOT LIKE '%-%'
1416
1417SELECT*
1418FROM Customers AS C
1419WHERE C.PostalCode NOT LIKE '%[^0-9]%'
1420
1421SELECT*
1422FROM Customers AS C
1423WHERE ISNUMERIC(C.PostalCode)=1
1424
1425--7. Iz tabele Person.Person baze AdventureWorks2017 u bazu Vjezba2 u tabelu Osoba kopirati kolone FirstName, MiddleName i LastName. Prikazati spojeno ime, srednje ime i prezime.Uslov je da se izmeðu pojedinih segmenata nalazi space. Omoguæiti prikaz podataka i ako neki od podataka nije unijet. Prikazati samo jedinstvene zapise (bez ponavljanja istih zapisa).
1426
1427USE Vjezba2
1428
1429SELECT PP.FirstName,PP.MiddleName,PP.LastName
1430INTO Osoba
1431FROM AdventureWorks2017.Person.Person AS PP
1432
1433SELECT O.FirstName + ' ' +ISNULL(O.MiddleName,' ')+ ' ' + O.LastName
1434FROM Osoba AS O
1435
1436UPDATE Osoba
1437SET MiddleName=' '
1438WHERE MiddleName IS NULL
1439
1440SELECT DISTINCT O.FirstName + ' ' + O.MiddleName + ' ' + O.LastName
1441FROM Osoba AS O
1442
1443SELECT DISTINCT CONCAT(PP.FirstName,' ',PP.MiddleName,' ',PP.LastName)
1444FROM AdventureWorks2017.Person.Person AS PP
1445
1446--8. Prikazati listu zaposlenika sa sljedeæim atributima: ID, ime, prezime, država i titula, gdje je ID = 9 ili dolaze iz USA.
1447SELECT E.EmployeeID,E.FirstName,E.LastName,E.Country,E.Title
1448FROM Northwind.dbo.Employees AS E
1449WHERE E.EmployeeID=9 OR E.Country LIKE 'USA'
1450--WHERE
1451--9. Prikazati podatke o narudžbama koje su napravljene prije 19.07.1996. godine. Izlaz treba da sadrži sljedeæe kolone: ID narudžbe, datum narudžbe, ID kupca, te grad.
1452USE Northwind
1453SELECT O.OrderID,O.OrderDate,O.CustomerID,O.ShipCity
1454FROM Orders AS O
1455WHERE O.OrderDate<'1996-07-19'
1456--10. Prikazati stavke narudžbe gdje je kolièina narudžbe bila veæa od 100 komada uz odobreni popust.
1457SELECT*
1458FROM [Order Details] AS OD
1459WHERE OD.Quantity>100 AND OD.Discount>0
1460--11. Prikazati ime kompanije kupca i kontakt telefon i to samo onih koji u svome imenu posjeduju rijeè „Restaurant“. Ukoliko naziv kompanije sadrži karakter (-), kupce izbaciti iz rezultata upita.
1461SELECT C.CompanyName,C.Phone
1462FROM Customers AS C
1463WHERE C.CompanyName LIKE '%Restaurant%' AND C.CompanyName NOT LIKE '%-%'
1464--12. Prikazati proizvode èiji naziv poèinje slovima „C“ ili „G“, drugo slovo može biti bilo koje, a treæe slovo u nazivu je „A“ ili „O“.
1465SELECT*
1466FROM Products AS P
1467WHERE P.ProductName LIKE '[CG]_[ao]%'
1468--13. Prikazati listu proizvoda èiji naziv poèinje slovima „L“ ili „T“, ili je ID proizvoda = 46. Lista treba da sadrži samo one proizvode èija se cijena po komadu kreæe izmeðu 10 i 50 (ukljuèujuæi graniène vrijednosti). Upit napisati na dva naèina.
1469SELECT *
1470FROM Products AS P
1471WHERE (P.ProductName LIKE '[LT]%' OR P.ProductID=46) AND P.UnitPrice BETWEEN 10 AND 50
1472
1473SELECT *
1474FROM Products AS P
1475WHERE (P.ProductName LIKE '[LT]%' OR P.ProductID=46) AND P.UnitPrice>=10 AND P.UnitPrice<=50
1476
1477--14. Prikazati naziv proizvoda i cijenu gdje je stanje na zalihama manje od naruèene kolièine. Takoðer, u rezultate upita ukljuèiti razliku izmeðu naruèene kolièine i stanja zaliha.
1478SELECT P.ProductName,P.UnitPrice,P.UnitsInStock-P.UnitsOnOrder AS Razlika
1479FROM Products AS P
1480WHERE P.UnitsInStock<P.UnitsOnOrder
1481--15. Prikazati dobavljaèe koji dolaze iz Španije ili Njemaèke a nemaju unesen broj faxa. Formatirati izlaz NULL vrijednosti. Upit napisati na dva naèina
1482SELECT S.SupplierID,S.CompanyName,S.ContactName,S.ContactTitle,S.Address,S.City,S.Region,S.PostalCode,S.Country,S.Phone,ISNULL(S.Fax,'nepoznata vrijednost') AS Fax,S.HomePage
1483FROM Suppliers AS S
1484WHERE S.Country IN ('Spain','Germany') AND S.Fax IS NULL
1485
1486SELECT S.SupplierID,S.CompanyName,S.ContactName,S.ContactTitle,S.Address,S.City,S.Region,S.PostalCode,S.Country,S.Phone,ISNULL(S.Fax,'nepoznata vrijednost') AS Fax,S.HomePage
1487FROM Suppliers AS S
1488WHERE (S.Country LIKE'Spain'OR S.Country LIKE'Germany') AND S.Fax IS NULL
1489
1490--16. Prikazati listu autora sa sljedeæim kolonama: ID, ime i prezime (spojeno), grad i to samo one autore èiji ID poèinje brojem 8 ili dolaze iz grada „Salt Lake City“. Takoðer autorima status ugovora treba biti 1. Koristiti aliase nad kolonama.
1491USE pubs
1492SELECT A.au_id, A.au_fname +' '+A.au_lname AS 'ime prezime', A.city,A.contract
1493FROM authors AS A
1494WHERE (A.au_id LIKE '8%' OR A.city LIKE 'Salt Lake City') AND A.contract=1
1495--17. Prikazati sve tipove knjiga bez duplikata. Listu sortirati po tipu.
1496SELECT DISTINCT T.type
1497FROM titles AS T
1498ORDER BY T.type
1499--18. Prikazati listu prodaje knjiga sa sljedeæim kolonama: ID prodavnice, broj narudžbe i kolièinu, ali samo gdje je kolièina izmeðu 10 i 50, ukljuèujuæi i graniène vrijednosti. Rezultat upita sortirati po kolièini opadajuæim redoslijedom. Upit napisati na dva naèina.
1500SELECT S.stor_id,S.ord_num,S.qty AS Kolicina
1501FROM sales AS S
1502WHERE S.qty BETWEEN 10 AND 50
1503ORDER BY 3 DESC
1504--19. Prikazati listu knjiga sa sljedeæim kolonama: naslov, tip djela i cijenu. Kao novu kolonu dodati 20% od prikazane cijene (npr. Ako je cijena 19.99 u novoj koloni treba da piše 3,998). Naziv kolone se treba zvati „20% od cijene“. Listu sortirati abecedno po tipu djela i po cijeni opadajuæim redoslijedom. Sa liste eliminisati one vrijednosti koje u polju cijena imaju nepoznatu vrijednost. Modifikovati upit tako da prikaže cijenu umanjenu za 20 %. Naziv kolone treba da se zove „Cijena umanjena za 20%“.
1505SELECT T.title,T.type,T.price,T.price*0.2 '20% od cijene', T.price*(1-0.2)'Cijena umanjena za 20%'
1506FROM titles AS T
1507WHERE T.price IS NOT NULL
1508ORDER BY 2,3
1509--20. Prikazati 10 kolièinski najveæih stavki prodaje. Lista treba da sadrži broj narudžbe, datum narudžbe i kolièinu. Provjeriti da li ima više stavki sa kolièinom kao posljednja u listi
1510USE pubs
1511SELECT TOP 10 WITH TIES S.ord_num,S.ord_date,S.qty
1512FROM sales AS S
1513ORDER BY 3 DESC
1514
1515
1516
1517
1518
1519
1520
1521
1522--Vježba 10 :: Zadaci
1523
1524--1. a) Upotrebom podupita iz tabele Customers baze Northwind
1525--dati prikaz svih polja tabele pri èemu je kupac iz Berlina.
1526--b) Upotrebom podupita iz tabele Customers baze Northwind dati prikaz svih polja tabele pri èemu je kupac iz Londona ili Berlina.
1527--A
1528USE Northwind
1529SELECT*
1530FROM Customers AS C
1531WHERE C.City LIKE (SELECT C.City
1532 FROM Customers AS C
1533 WHERE C.City='Berlin')
1534--B
1535SELECT*
1536FROM Customers AS C
1537WHERE C.City IN (SELECT C.City
1538 FROM Customers AS C
1539 WHERE C.City='Berlin' OR C.City='London')
1540
1541
1542--2. Prikazati srednju vrijednost nabavljene kolièine, u obzir uzeti samo one zapise
1543--u kojima je vrijednost UnitPrice izmeðu 50 i 100 (ukljuèujuæi graniène
1544--vrijednosti). (AdventureWorks2017)
1545
1546USE AdventureWorks2017
1547
1548SELECT AVG(PP.OrderQty) 'Srednja vrijednost naruèene kolièine'
1549FROM Purchasing.PurchaseOrderDetail AS PP
1550WHERE PP.UnitPrice BETWEEN 50 AND 100
1551
1552SELECT AVG(PodQ.OrderQty) 'Srednja vrijednost naruèene kolièine'
1553FROM (SELECT PP.OrderQty
1554 FROM Purchasing.PurchaseOrderDetail AS PP
1555 WHERE PP.UnitPrice BETWEEN 50 AND 100) AS PodQ
1556
1557--3.Prikazati ID narudžbe(i) u kojima je naruèena kolièina jednaka minimalnoj, odnosno, maksimalnoj vrijednosti svih naruèenih kolièina. (Northwind)
1558USE Northwind
1559
1560SELECT MIN(OD.Quantity) 'MIN', MAX(OD.Quantity)'MAX'
1561FROM [Order Details] AS OD
1562--MIN 1
1563--MAX 130
1564--NAÈIN 1
1565SELECT DISTINCT OD.OrderID, OD.Quantity
1566FROM [Order Details] AS OD
1567WHERE OD.Quantity=(SELECT MIN(OD.Quantity)
1568 FROM [Order Details] AS OD) OR OD.Quantity=(SELECT MAX(OD.Quantity)
1569 FROM [Order Details] AS OD)
1570--NAÈIN 2
1571SELECT OD.OrderID, OD.Quantity
1572FROM [Order Details] AS OD
1573WHERE OD.Quantity=(SELECT MIN(OD.Quantity)
1574 FROM [Order Details] AS OD)
1575UNION
1576SELECT OD.OrderID, OD.Quantity
1577FROM [Order Details] AS OD
1578WHERE OD.Quantity=(SELECT MAX(OD.Quantity)
1579 FROM [Order Details] AS OD)
1580
1581--4. Prikazati ID narudžbe i ID kupca koji je kupio više od 10 komada proizvoda èiji je ID 15. (Northwind)
1582SELECT O.OrderID,O.CustomerID
1583FROM Orders as O
1584WHERE ( SELECT Quantity
1585 FROM [Order Details] AS OD
1586 WHERE O.OrderID=OD.OrderID AND OD.ProductID=15)>10
1587
1588USE Northwind
1589SELECT O.OrderID,O.CustomerID, OD.Quantity
1590FROM Orders AS O
1591INNER JOIN [Order Details] AS OD
1592ON O.OrderID=OD.OrderID
1593WHERE OD.ProductID=15 AND OD.Quantity>10
1594
1595--5. Prikazati sve osobe koje nemaju prihode, vanredni i redovni. (Prihodi)
1596USE prihodi
1597SELECT O.OsobaID, o.Ime
1598FROM Osoba AS O
1599WHERE NOT EXISTS (SELECT VP.OsobaID
1600 FROM VanredniPrihodi AS VP
1601 WHERE VP.OsobaID=O.OsobaID) AND NOT EXISTS (SELECT RP.OsobaID
1602 FROM RedovniPrihodi AS RP
1603 WHERE RP.OsobaID=O.OsobaID)
1604
1605SELECT O.OsobaID, O.Ime
1606FROM Osoba AS O
1607LEFT JOIN VanredniPrihodi AS VP
1608ON VP.OsobaID=O.OsobaID
1609WHERE VP.OsobaID IS NULL
1610INTERSECT
1611SELECT O.OsobaID, O.Ime
1612FROM Osoba AS O
1613LEFT JOIN RedovniPrihodi AS RP
1614ON RP.OsobaID=O.OsobaID
1615WHERE RP.OsobaID IS NULL
1616
1617--6. Dati prikaz ID narudžbe, ID proizvoda i jediniène cijene, te razliku cijene u odnosu na srednju vrijednost cijene za sve stavke. Rezultat sortirati prema vrijednosti razlike u rastuæem redoslijedu. (Northwind)
1618USE Northwind
1619SELECT OD.OrderID,OD.ProductID,OD.UnitPrice,
1620(SELECT AVG(OD.UnitPrice)
1621FROM [Order Details] AS OD) 'Srednja vrijednost',
1622OD.UnitPrice-(SELECT AVG(OD.UnitPrice)
1623 FROM [Order Details] AS OD) 'Razlika'
1624FROM [Order Details] AS OD
1625ORDER BY 5
1626
1627--7. Za sve proizvode kojih ima na stanju dati prikaz ID proizvoda, naziv proizvoda i stanje zaliha, te razliku stanja zaliha proizvoda u odnosu na srednju vrijednost stanja za sve proizvode u tabeli. Rezultat sortirati prema vrijednosti razlike u opadajuæem redoslijedu. (Northwind)
1628SELECT P.ProductID,P.ProductName,P.UnitsInStock, P.UnitsInStock -(SELECT AVG(P.UnitsInStock)
1629 FROM Products AS P) 'Razlika'
1630FROM Products AS P
1631WHERE P.UnitsInStock>0
1632ORDER BY 4 DESC
1633
1634--8. Prikazati po 5 najstarijih zaposlenika muškog, odnosno, ženskog spola uz navoðenje sljedeæih podataka: radno mjesto na kojem se nalazi, datum roðenja, korisnicko ime i godine starosti. Korisnièko ime je dio podatka u LoginID. Rezultate sortirati prema polu rastuæim, a zatim prema godinama starosti opadajuæim redoslijedom. (AdventureWorks2017)
1635USE AdventureWorks2017
1636SELECT *
1637FROM(SELECT TOP 5 E.JobTitle, E.BirthDate, E.LoginID, DATEDIFF(YEAR, E.BirthDate, GETDATE())'Godine starosti', E.Gender
1638FROM HumanResources.Employee AS E
1639WHERE E.Gender='F'
1640ORDER BY 4 DESC) AS F
1641UNION
1642SELECT*
1643FROM(SELECT TOP 5 E.JobTitle, E.BirthDate, E.LoginID, DATEDIFF(YEAR, E.BirthDate, GETDATE())'Godine starosti', E.Gender
1644FROM HumanResources.Employee AS E
1645WHERE E.Gender='M'
1646ORDER BY 4 DESC) AS M
1647ORDER BY 5, 4 DESC
1648
1649
1650
1651
1652--9. Prikazati po 3 zaposlenika koji obavljaju poslove managera uz navoðenje sljedeæih podataka: radno mjesto na kojem se nalazi, datum zaposlenja, braèni status i staž. Ako osoba nije u braku plaæa dodatni porez (upitom naglasiti to), inaèe ne plaæa. Rezultate sortirati prema braènom statusu rastuæim, a zatim prema stažu opadajuæim redoslijedom. (AdventureWorks2017)
1653SELECT TOP 3 E.JobTitle,E.HireDate,E.MaritalStatus,DATEDIFF(YEAR, E.HireDate,GETDATE()) 'Godine staza', 'Placa dodatni porez' Porez
1654FROM HumanResources.Employee AS E
1655WHERE E.JobTitle LIKE '%manager%' AND E.MaritalStatus ='S'
1656UNION
1657SELECT TOP 3 E.JobTitle,E.HireDate,E.MaritalStatus,DATEDIFF(YEAR, E.HireDate,GETDATE()) 'Godine staza', ' ' Porez
1658FROM HumanResources.Employee AS E
1659WHERE E.JobTitle LIKE '%manager%' AND E.MaritalStatus ='M'
1660ORDER BY 3, [Godine staza] DESC
1661
1662
1663--10. Prikazati po 5 osoba koje se nalaze na 1, odnosno, 4. organizacionom nivou, uposlenici su i žele primati email ponude od AdventureWorksa uz navoðenje sljedeæih polja: ime i prezime osobe kao jedinstveno polje, organizacijski nivo na kojem se nalazi i da li prima email promocije. Pored ovih uvesti i polje koje æe sadržavati poruke: Ne prima (0), Prima selektirane (1) i Prima (2). Sadržaj novog polja ovisi o vrijednosti polja EmailPromotion. Rezultat sortirati prema organizacijskom nivou i dodatno uvedenom polju. (AdventureWorks2017)
1664SELECT TOP 5 PP.FirstName +' ' +PP.LastName 'Ime i prezime', E.OrganizationLevel,PP.EmailPromotion, 'Ne prima' Prima
1665FROM HumanResources.Employee AS E
1666INNER JOIN Person.Person AS PP
1667ON E.BusinessEntityID=PP.BusinessEntityID
1668WHERE (E.OrganizationLevel=1 OR E.OrganizationLevel=4) AND PP.EmailPromotion=0
1669UNION
1670SELECT TOP 5 PP.FirstName +' ' +PP.LastName 'Ime i prezime', E.OrganizationLevel,PP.EmailPromotion, 'Prima selektirane' Prima
1671FROM HumanResources.Employee AS E
1672INNER JOIN Person.Person AS PP
1673ON E.BusinessEntityID=PP.BusinessEntityID
1674WHERE (E.OrganizationLevel=1 OR E.OrganizationLevel=4) AND PP.EmailPromotion=1
1675UNION
1676SELECT TOP 5 PP.FirstName +' ' +PP.LastName 'Ime i prezime', E.OrganizationLevel,PP.EmailPromotion, 'Prima email promocije' Prima
1677FROM HumanResources.Employee AS E
1678INNER JOIN Person.Person AS PP
1679ON E.BusinessEntityID=PP.BusinessEntityID
1680WHERE (E.OrganizationLevel=1 OR E.OrganizationLevel=4) AND PP.EmailPromotion=2
1681ORDER BY 2 ,4
1682
1683--11. Prikazati broj narudžbe, datum narudžbe i datum isporuke za narudžbe koje su isporuèene u Kanadu u 7. mjesecu 2014. godine. Uzeti u obzir samo narudžbe koje nisu plaæene kreditnom karticom. Datume formatirati u sljedeæem obliku: dd.mm.yyyy. (AdventureWorks2017)
1684SELECT SOH.SalesOrderID, FORMAT(SOH.OrderDate,'dd.MM.yyyy') 'Order date',FORMAT( SOH.ShipDate,'dd.MM.yyyy') 'Ship date'
1685FROM Sales.SalesOrderHeader AS SOH
1686INNER JOIN Sales.SalesTerritory AS ST
1687ON ST.TerritoryID=SOH.TerritoryID
1688WHERE ST.Name LIKE 'Canada' AND YEAR(SOH.ShipDate)=2014 AND MONTH(SOH.ShipDate)=7 AND SOH.CreditCardID IS NULL
1689
1690
1691--12. Kreirati upit koji prikazuje minimalnu, maksimalnu, prosjeènu te ukupnu vrijednost stavke po mjesecima u 2013. godini. (AdventureWorks2017)
1692SELECT MONTH(SOH.OrderDate) 'Mjesec',AVG(SOD.LineTotal) 'Prosjek', MIN(SOD.LineTotal) 'Minimalna', MAX(SOD.LineTotal) 'Maksimalna'
1693FROM Sales.SalesOrderDetail AS SOD
1694INNER JOIN Sales.SalesOrderHeader AS SOH
1695ON SOD.SalesOrderID=SOH.SalesOrderID
1696WHERE YEAR(SOH.OrderDate)=2013
1697GROUP BY MONTH(SOH.OrderDate)
1698ORDER BY 1
1699
1700SELECT MONTH(SOH.OrderDate) 'Mjesec',AVG(SOD.UnitPrice*SOD.OrderQty) 'Prosjek', MIN(SOD.UnitPrice*SOD.OrderQty) 'Minimalna', MAX(SOD.UnitPrice*SOD.OrderQty) 'Maksimalna'
1701FROM Sales.SalesOrderDetail AS SOD
1702INNER JOIN Sales.SalesOrderHeader AS SOH
1703ON SOD.SalesOrderID=SOH.SalesOrderID
1704WHERE YEAR(SOH.OrderDate)=2013
1705GROUP BY MONTH(SOH.OrderDate)
1706ORDER BY 1
1707
1708--13. Kreirati upit koji prikazuje ime i prezime, korisnièko ime (sve iza znaka „\“ u koloni LoginID), dužinu korisnièkog imena, titulu, datum zaposlenja (dd.mm.yyyy), starost i staž zaposlenika. Uslov je da se prikaže 10 najstarijih zaposlenika koji obavljaju bilo koju ulogu menadžera. (AdventureWorks2017)
1709SELECT TOP 10 PP.FirstName+ ' '+PP.LastName 'Ime i prezime', RIGHT(E.LoginID, CHARINDEX('\',REVERSE(E.LoginID))-1) 'Korisnièko ime', LEN(RIGHT(E.LoginID, CHARINDEX('\',REVERSE(E.LoginID))-1)) 'Dužina korisnièkog imena', E.JobTitle, FORMAT(E.HireDate,'dd.MM.yyyy') 'Datum zaposlenja', DATEDIFF(YEAR,E.BirthDate,GETDATE()) 'Starost', DATEDIFF(YEAR, E.HireDate,GETDATE()) 'Staž'
1710FROM Person.Person AS PP
1711INNER JOIN HumanResources.Employee AS E
1712ON E.BusinessEntityID=PP.BusinessEntityID
1713WHERE E.JobTitle LIKE '%Manager%'
1714ORDER BY Starost DESC
1715
1716--14. Kreirati upit koji prikazuje 10 najskupljih stavki prodaje (detalji narudžbe) i to sljedeæe kolone: naziv proizvoda, kolièina, cijena, iznos. Cijenu i iznos zaokružiti na dvije decimale. Takoðer, kolièinu prikazati u formatu „10 kom.“, a cijenu i iznos u formatu „1000 KM“. (AdventureWorks2017)
1717SELECT TOP 10 PP.Name,CAST(SOD.OrderQty AS VARCHAR) +' kom' 'Kolicina',CAST(SOD.UnitPrice AS VARCHAR) +' KM' 'Cijena',CAST(SUM(SOD.UnitPrice*SOD.OrderQty) AS VARCHAR) +' KM' 'Iznos'
1718FROM Sales.SalesOrderDetail AS SOD
1719INNER JOIN Production.Product AS PP
1720ON SOD.ProductID=PP.ProductID
1721GROUP BY PP.Name,SOD.OrderQty,SOD.UnitPrice
1722ORDER BY 3 DESC
1723
1724--15. Kreirati upit koji prikazuje naziv modela i opis modela proizvoda. Uslov je da naziv modela sadrži rijeè „Mountain“, dok je opis potrebno prikazati samo na engleskom jeziku. (AdventureWorks2017)
1725SELECT PM.Name,PD.Description
1726FROM Production.ProductModel AS PM
1727INNER JOIN Production.ProductModelProductDescriptionCulture AS PMPDC
1728ON PM.ProductModelID=PMPDC.ProductModelID
1729INNER JOIN Production.ProductDescription AS PD
1730ON PD.ProductDescriptionID=PMPDC.ProductDescriptionID
1731INNER JOIN Production.Culture AS C
1732ON C.CultureID=PMPDC.CultureID
1733WHERE C.Name LIKE 'English' AND PM.Name LIKE '%Mountain%'
1734
1735--16. Kreirati upit koji prikazuje broj, naziv i cijenu proizvoda, te stanje zaliha po lokacijama. Uzeti u obzir samo proizvode koji pripadaju kategoriji „Bikes“. Izlaz sortirati po stanju zaliha u opadajuæem redoslijedu. (AdventureWorks2017)
1736SELECT PP.ProductNumber,PP.Name,PP.ListPrice,PL.Name,SUM(PI.Quantity) 'Stanje zaliha'
1737FROM Production.Product AS PP
1738INNER JOIN Production.ProductInventory AS PI
1739ON PP.ProductID=PI.ProductID
1740INNER JOIN Production.Location AS PL
1741ON PI.LocationID=PL.LocationID
1742INNER JOIN Production.ProductSubcategory AS PS
1743ON PP.ProductSubcategoryID=PS.ProductSubcategoryID
1744INNER JOIN Production.ProductCategory AS PC
1745ON PS.ProductCategoryID=PC.ProductCategoryID
1746WHERE PC.Name LIKE 'Bikes'
1747GROUP BY PP.ProductNumber,PP.Name,PP.ListPrice,PL.Name
1748ORDER BY 5 DESC
1749
1750--17. Kreirati upit koji prikazuje ukupno ostvarenu zaradu bez popusta po zaposleniku, za robu isporuèenu na podruèje Evrope, u januaru mjesecu 2014. godine. Lista treba da sadrži ime i prezime zaposlenika, datum zaposlenja (dd.mm.yyyy), mail adresu, te ukupnu ostvarenu zaradu zaokruženu na dvije decimale. Izlaz sortirati po zaradi u opadajuæem redoslijedu. (AdventureWorks2017)
1751SELECT PP.FirstName + ' '+ PP.LastName 'Ime i prezime zaposlenika', FORMAT(E.HireDate,'dd.MM.yyyy') 'Datum zaposlenja',E.HireDate,EA.EmailAddress,ROUND(SUM(SOD.UnitPrice*SOD.OrderQty),2)'Ukupna zarada'
1752FROM HumanResources.Employee AS E
1753INNER JOIN Person.Person AS PP
1754ON E.BusinessEntityID=PP.BusinessEntityID
1755INNER JOIN Person.EmailAddress AS EA
1756ON PP.BusinessEntityID=EA.BusinessEntityID
1757INNER JOIN Sales.SalesPerson AS SP
1758ON E.BusinessEntityID=SP.BusinessEntityID
1759INNER JOIN Sales.SalesOrderHeader AS SOH
1760ON SOH.SalesPersonID=SP.BusinessEntityID
1761INNER JOIN Sales.SalesOrderDetail AS SOD
1762ON SOD.SalesOrderID=SOH.SalesOrderID
1763INNER JOIN Sales.SalesTerritory AS ST
1764ON SOH.TerritoryID=ST.TerritoryID
1765WHERE ST.[Group]='Europe' AND YEAR(SOH.OrderDate)=2014 AND MONTH(SOH.OrderDate)=1
1766GROUP BY PP.FirstName + ' '+ PP.LastName,FORMAT(E.HireDate,'dd.MM.yyyy'),E.HireDate,EA.EmailAddress
1767ORDER BY [Ukupna zarada] DESC
1768
1769
1770
1771--FUNKCIJE ZA RAD SA STRINGOVIMA
1772SELECT LEFT('Softverski inzinjering',2) --REZULTAT: SO
1773SELECT RIGHT('Softverski inzinjering',11) --REZULTAT: INZINJERING
1774SELECT CHARINDEX(' ','Sofrverski inzinjering') --REZULTAT: 11
1775SELECT PATINDEX('%[0-9]%','FITCC2022') --REZULTAT 6
1776SELECT SUBSTRING('Sofrverski inzinjering',11+1,11) --REZULTAT: INZINJERING
1777SELECT UPPER('Sofrverski inzinjering') --REZULTAT: INZINJERING
1778SELECT LOWER('Sofrverski inzinjering') --REZULTAT: inzinjering
1779SELECT LEN('Sofrverski inzinjering') --REZULTAT: 22
1780SELECT REPLACE('Sofrverski inzinjering','i','XY') --REZULTAT:SofrverskXY XYnzXYnjerXYng
1781SELECT STUFF('Softverski inzinjering',3,2,'XY') --REZULTAT: SoXYverski inzinjering
1782SELECT STR(122)+ '.' --REZULTAT: 122.
1783SELECT REVERSE('Softverski inzinjering') --REZULTAT: gnirejnizni iksrevtfoS
1784
1785
1786--Vježba 9_1 :: Zadaci
1787
1788--1. Iz tabele HumanResources.Employee baze AdventureWorks2017 iz kolone LoginID izvuæi ime uposlenika.
1789SELECT E.LoginID, SUBSTRING(E.LoginID,CHARINDEX('\',E.LoginID)+1,LEN(E.LoginID)-CHARINDEX('\',E.LoginID)-1) AS 'Ime uposlenika'
1790FROM AdventureWorks2017.HumanResources.Employee AS E
1791
1792--2. Kreirati upit koji prikazuje podatke o zaposlenicima. Lista treba da sadrži sljedeæe kolone: ID uposlenika, korisnièko ime i novu lozinku:
1793--Uslovi su sljedeæi:
1794--• Za korisnièko ime potrebno je koristiti kolonu LoginID (tabela Employees). Npr. LoginID zaposlenika sa imenom i prezimenom 'Mary Gibson' je adventureworks\mary0. Korisnièko ime zaposlenika je sve što se nalazi iza znaka \ (backslash) što je u ovom primjeru mary0,
1795--• Nova lozinka se formira koristeæi hešovanu lozinku zaposlenika na sljedeæi naèin: o Hešovanu lozinku potrebno je okrenuti obrnuto (npr. dbms2015 -> 5102smbd) o Nakon toga preskaèemo prvih 5 i uzimamo narednih 8 karaktera
1796--• Sljedeæi korak jeste da iz dobivenog stringa poèevši od drugog karaktera naredna dva zamijenimo sa X# (npr. ako je dobiveni string dbms2015 izlaz æe biti dX#s2015)
1797--RJEŠENJE 1
1798SELECT *,RIGHT(E.LoginID,CHARINDEX('\',REVERSE(E.LoginID))-1) AS 'Korisnicko ime',
1799REPLACE(SUBSTRING(REVERSE(E.rowguid),6,7),SUBSTRING(SUBSTRING(REVERSE(E.rowguid),6,8),2,3),'X#')
1800FROM AdventureWorks2017.HumanResources.Employee AS E
1801--RJEŠENJE 2
1802SELECT *,RIGHT(E.LoginID,CHARINDEX('\',REVERSE(E.LoginID))-1) AS 'Korisnicko ime',
1803STUFF(SUBSTRING(REVERSE(E.rowguid),6,8),2,2,'X#') 'Nova lozinka'
1804FROM AdventureWorks2017.HumanResources.Employee AS E
1805
1806--3. Iz tabele Sales.Customer baze AdventureWorks2017 iz kolone AccountNumber izvuæi broj pri èemu je potrebno broj prikazati bez vodeæih nula.
1807--a) dohvatiti sve zapise
1808--b) dohvatiti one zapise kojima je unijet podatak u kolonu PersonID
1809--a
1810SELECT C.AccountNumber, CAST(RIGHT(C.AccountNumber,PATINDEX('%[A-Z]%',REVERSE(C.AccountNumber))-1) AS INT)
1811FROM AdventureWorks2017.Sales.Customer AS C
1812--b
1813SELECT C.AccountNumber, CAST(RIGHT(C.AccountNumber,PATINDEX('%[A-Z]%',REVERSE(C.AccountNumber))-1) AS INT)
1814FROM AdventureWorks2017.Sales.Customer AS C
1815WHERE C.PersonID IS NOT NULL
1816
1817--4. Iz tabele Purchasing.Vendor baze AdventureWorks2017 dohvatiti zapise u kojima se podatak u koloni AccountNumber formirao iz prve rijeèi kolone Name.
1818--1.RJEŠENJE
1819SELECT PV.AccountNumber,PV.Name,LEFT(PV.AccountNumber,CHARINDEX('0',PV.AccountNumber)-1), LEFT(PV.Name+' ',CHARINDEX(' ',PV.Name+ ' ')-1)
1820FROM AdventureWorks2017.Purchasing.Vendor AS PV
1821WHERE LEFT(PV.AccountNumber,CHARINDEX('0',PV.AccountNumber)-1)=LEFT(PV.Name+' ',CHARINDEX(' ',PV.Name+ ' ')-1)
1822--2.RJEŠENJE
1823SELECT PV.AccountNumber,PV.Name,LEFT(PV.AccountNumber,CHARINDEX('0',PV.AccountNumber)-1), IIF(CHARINDEX(' ',PV.Name)=0,PV.Name,LEFT(PV.Name,CHARINDEX(' ',PV.Name)-1))
1824FROM AdventureWorks2017.Purchasing.Vendor AS PV
1825WHERE LEFT(PV.AccountNumber,CHARINDEX('0',PV.AccountNumber)-1)=IIF(CHARINDEX(' ',PV.Name)=0,PV.Name,LEFT(PV.Name,CHARINDEX(' ',PV.Name)-1))
1826--3 RJEŠENJE
1827SELECT PV.AccountNumber,PV.Name,LEFT(PV.AccountNumber,PATINDEX('%[0-9]%',PV.AccountNumber)-1), IIF(CHARINDEX(' ',PV.Name)=0,PV.Name,LEFT(PV.Name,CHARINDEX(' ',PV.Name)-1))
1828FROM AdventureWorks2017.Purchasing.Vendor AS PV
1829WHERE LEFT(PV.AccountNumber,PATINDEX('%[0-9]%',PV.AccountNumber)-1)=IIF(CHARINDEX(' ',PV.Name)=0,PV.Name,LEFT(PV.Name,CHARINDEX(' ',PV.Name)-1))
1830
1831--5. Koristeæi bazu Northwind kreirati upit koji æe prikazati odvojeno ime i prezime, naziv firme te državu i grad kupca ali samo onih èija adresa završava sa 2 ili više cifre. U rezultate upita ne treba ukljuèiti one koje u polju ContactName imaju 2 ili više rijeèi
1832SELECT LEFT(C.ContactName,CHARINDEX(' ',C.ContactName)-1) AS Ime, RIGHT(C.ContactName,CHARINDEX(' ',REVERSE(C.ContactName))-1) AS Prezime, C.CompanyName ,C.ContactName,C.Address
1833FROM Northwind.dbo.Customers AS C
1834WHERE IIF(ISNUMERIC(RIGHT(C.Address,CHARINDEX(' ',REVERSE(C.Address))-1))=1,RIGHT(C.Address,CHARINDEX(' ',REVERSE(C.Address))-1),0)>=10 AND LEN(C.ContactName)-LEN(REPLACE(C.ContactName,' ',''))=1
1835
1836
1837--ILI
1838
1839SELECT LEFT(C.ContactName,CHARINDEX(' ',C.ContactName)-1) AS Ime, RIGHT(C.ContactName,CHARINDEX(' ',REVERSE(C.ContactName))-1) AS Prezime, C.CompanyName ,C.ContactName,C.Address
1840FROM Northwind.dbo.Customers AS C
1841WHERE RIGHT(C.Address,CHARINDEX(' ',REVERSE(C.Address))-1) NOT LIKE '%[^0-9]%' AND LEN(RIGHT(C.Address,CHARINDEX(' ',REVERSE(C.Address))-1))>=2 AND LEN(C.ContactName)-LEN(REPLACE(C.ContactName,' ',''))=1
1842--6. Koristeæi bazu Northwind u tabeli Customers dodati izraèunato polje Spol u koji æe se upitom pohraniti vrijednost da li se radi o muškarcu ili ženi (M ili F). Vrijednost na osnovu koje se odreðuje to o kojem se spolu radi nalazi se u koloni ContactName gdje zadnje slovo prve rijeèi odreðuje spol (rijeèi koje se završavaju slovom a predstavljaju osobe ženskog spola).
1843--SELECT I PROVJERA ISPRAVNOSTI ZAPISA
1844SELECT C.ContactName,IIF(RIGHT(LEFT(C.ContactName,CHARINDEX(' ',C.ContactName)-1),1)='a','F','M')
1845FROM Northwind.dbo.Customers AS C
1846--COMPUTED FIELD
1847ALTER TABLE Northwind.dbo.Customers
1848ADD Spol2 AS IIF(RIGHT(LEFT(ContactName,CHARINDEX(' ',ContactName)-1),1)='a','F','M')
1849
1850
1851
1852--1. U tabeli Customers baze Northwind ID kupca je primarni kljuè.
1853--U tabeli Orders baze Northwind ID kupca je vanjski kljuè.
1854--Prikazati:
1855--a) Koliko je kupaca evidentirano u obje tabele
1856--b) Da li su svi kupci obavili narudžbu
1857--c) Ukoliko postoje neki da nisu prikazati koji su to
1858USE Northwind
1859--A
1860--UNIJOM PROVJERAVAMO KOLIKO JE KUPACA EVIDENTIRANO-BROJ KUPACA
1861SELECT C.CustomerID
1862FROM Customers AS C
1863UNION
1864SELECT O.CustomerID
1865FROM Orders AS O
1866--B
1867--INTERSECTOM MOŽEMO PROVJERITI DA LI SU SVI KUPCI OBAVILI NARUDŽBU
1868SELECT C.CustomerID
1869FROM Customers AS C
1870INTERSECT
1871SELECT O.CustomerID
1872FROM Orders AS O
1873--C
1874SELECT C.CustomerID
1875FROM Customers AS C
1876EXCEPT
1877SELECT O.CustomerID
1878FROM Orders AS O
1879--LEFT JOIN
1880SELECT C.CustomerID,O.OrderID
1881FROM Customers AS C
1882LEFT OUTER JOIN Orders AS O
1883ON O.CustomerID=C.CustomerID
1884WHERE O.OrderID IS NULL
1885
1886--2. Dati pregled vanrednih prihoda svih osoba. Pregled treba da sadrži sljedeæe kolone: OsobaID, Ime, VanredniPrihodID, IznosPrihoda (Prihodi)
1887USE prihodi
1888SELECT O.OsobaID,O.Ime,VP.VanredniPrihodiID,VP.IznosVanrednogPrihoda
1889FROM Osoba AS O
1890LEFT OUTER JOIN VanredniPrihodi AS VP
1891ON VP.OsobaID=O.OsobaID
1892
1893--3. Dati pregled redovnih prihoda svih osoba. Pregled treba da sadrži sljedeæe kolone: OsobaID, Ime, RedovniPrihodID, Neto (Prihodi)
1894SELECT O.OsobaID,O.Ime,RP.RedovniPrihodiID,RP.Neto
1895FROM Osoba AS O
1896LEFT OUTER JOIN RedovniPrihodi AS RP
1897ON O.OsobaID=RP.OsobaID
1898
1899
1900--4. Odrediti da li je svaki autor napisao bar po jedan naslov. (Pubs)
1901--a) ako ima autora koji nisu napisali ni jedan naslov navesti njihov ID.
1902--b) dati pregled autora koji su napisali bar po jedan naslov.
1903USE pubs
1904SELECT A.au_id
1905FROM authors AS A
1906INTERSECT
1907SELECT TA.au_id
1908FROM titleauthor AS TA
1909
1910SELECT*
1911FROM authors
1912
1913-- OVIM VIDIMO DA SVI AUTORI NISU NAPISALI PO JEDAN NASLOV
1914--A
1915SELECT A.au_id 'Autori bez naslova'
1916FROM authors AS A
1917LEFT OUTER JOIN titleauthor AS TA
1918ON A.au_id=TA.au_id
1919WHERE TA.title_id IS NULL
1920
1921--ILI
1922
1923SELECT A.au_id
1924FROM authors AS A
1925EXCEPT
1926SELECT TA.au_id
1927FROM titleauthor AS TA
1928
1929--B
1930-- DISTINCT UKOLIKO ŽELIMO DA SE JEDAN AUTOR NE PONAVLJA VIŠE PUTA
1931SELECT DISTINCT A.au_id 'Autori s naslovima'
1932FROM authors AS A
1933INNER JOIN titleauthor AS TA
1934ON A.au_id=TA.au_id
1935
1936--ILI
1937
1938SELECT A.au_id
1939FROM authors AS A
1940INTERSECT
1941SELECT TA.au_id
1942FROM titleauthor AS TA
1943
1944--5. Prikazati 10 najskupljih stavki prodaje. Upit treba da sadrži naziv proizvoda, kolièinu, cijenu i vrijednost stavke prodaje. Cijenu i vrijednost stavke prodaje zaokružiti na dvije decimale. Izlaz formatirati na naèin da uz kolièinu stoji 'kom' (npr 50kom) a uz cijenu KM (npr 50KM). (AdventureWorks2017)
1945USE AdventureWorks2017
1946SELECT TOP 10 PP.Name,CAST(SOD.OrderQty AS NVARCHAR)+' kom' 'Kolicina',CAST(ROUND(SOD.UnitPrice,2) AS NVARCHAR) +' KM' 'Cijena',CAST(ROUND((SOD.OrderQty*SOD.UnitPrice),2) AS nvarchar) +'KM' 'Stavka prodaje'
1947FROM Sales.SalesOrderDetail AS SOD
1948INNER JOIN Production.Product AS PP
1949ON SOD.ProductID=PP.ProductID
1950ORDER BY 4 DESC
1951
1952--6. Kreirati upit koji prikazuje ukupan broj kupaca po teritoriji. Lista treba da sadrži sljedeæe kolone: naziv teritorije, ukupan broj kupaca. Uzeti u obzir samo teritorije gdje ima više od 1000 kupaca. (AdventureWorks2017)
1953SELECT ST.Name, COUNT(*) 'Broj kupaca'
1954FROM Sales.Customer AS SC
1955INNER JOIN SALES.SalesTerritory AS ST
1956ON SC.TerritoryID=ST.TerritoryID
1957GROUP BY St.Name
1958HAVING COUNT(*)>1000
1959
1960--7. Kreirati upit koji prikazuje zaradu od prodaje proizvoda. Lista treba da sadrži naziv proizvoda, ukupnu zaradu bez uraèunatog popusta i ukupnu zaradu sa uraèunatim popustom. Iznos zarade zaokružiti na dvije decimale. Uslov je da se prikaže zarada samo za stavke gdje je bilo popusta. Listu sortirati po zaradi opadajuæim redoslijedom. (AdventureWorks2017)
1961SELECT PP.Name,ROUND(SUM(SOD.UnitPrice*SOD.OrderQty),2) 'Ukupna zarada bez popusta', ROUND(SUM(SOD.UnitPrice*SOD.OrderQty*(1-SOD.UnitPriceDiscount)),2) 'Ukupna zarada sa popustom'
1962FROM Sales.SalesOrderDetail AS SOD
1963INNER JOIN Production.Product AS PP
1964ON PP.ProductID=SOD.ProductID
1965WHERE SOD.UnitPriceDiscount>0
1966GROUP BY PP.Name
1967ORDER BY 3 DESC
1968
1969
1970
1971--VJEŽBA 8
1972
1973USE Northwind
1974
1975--1. Prikazati kolièinski najmanju i najveæu vrijednost stavke narudžbe. (Northwind)
1976SELECT MIN(OD.Quantity) 'Najmanja', MAX(OD.Quantity) 'Najveca'
1977FROM [Order Details] AS OD
1978
1979--2. Prikazati kolièinski najmanju i najveæu vrijednost stavke narudžbe za svaku od
1980--narudžbi pojedinaèno. (Northwind)
1981SELECT OD.OrderID, MIN(OD.Quantity) Najmanja, MAX(OD.Quantity) Najveca
1982FROM [Order Details] AS OD
1983GROUP BY OD.OrderID
1984
1985--3. Prikazati ukupnu zaradu od svih narudžbi. (Northwind)
1986SELECT SUM(OD.Quantity*OD.UnitPrice) 'Zarada'
1987FROM [Order Details] AS OD
1988
1989--4. Prikazati ukupnu vrijednost za svaku narudžbu pojedinaèno uzimajuæi u obzir i popust.
1990--Rezultate zaokružiti na dvije decimale i sortirati prema ukupnoj vrijednosti naružbe u
1991--opadajuæem redoslijedu. (Northwind)
1992SELECT OD.OrderID, ROUND(SUM(OD.Quantity*OD.UnitPrice*(1-OD.Discount)),2) 'Ukupna vrijednost sa popustom'
1993FROM [Order Details] AS OD
1994GROUP BY OD.OrderID
1995ORDER BY 2 DESC
1996
1997--5. Prebrojati stavke narudžbe gdje su naruèene kolièine veæe od 50 (ukljuèujuæi i graniènu
1998--vrijednost). Uzeti u obzir samo one stavke narudžbe gdje je odobren popust.
1999--(Northwind)
2000SELECT COUNT(*) 'Broj stavki'
2001FROM [Order Details] AS OD
2002WHERE OD.Quantity>=50 AND OD.Discount>0
2003
2004--6. Prikazati prosjeènu cijenu stavki narudžbe za svaku narudžbu pojedinaèno. Sortirati
2005--po prosjeènoj cijeni u opadajuæem redoslijedu. (Northwind)
2006SELECT OD.OrderID,AVG(OD.UnitPrice) 'Cijena'
2007FROM [Order Details] AS OD
2008GROUP BY OD.OrderID
2009
2010--7. Prikazati broj stavki narudžbi sa odobrenim popustom. (Northwind)
2011SELECT COUNT(*) 'Broj stavki'
2012FROM [Order Details] AS OD
2013WHERE OD.Discount>0
2014
2015--8. Prikazati broj narudžbi u kojima je unesena regija kupovine. (Northwind)
2016SELECT COUNT (*) 'Broj narudžbi sa unesenim regijama'
2017FROM Orders AS O
2018WHERE O.ShipRegion IS NOT NULL
2019
2020SELECT COUNT (O.ShipRegion) 'Broj narudžbi sa unesenim regijama'
2021FROM Orders AS O
2022
2023--9. Modificirati prethodni upit tako da se dobije broj narudžbi u kojima nije unesena regija
2024--kupovine. (Northwind)
2025SELECT COUNT(*)-COUNT(O.ShipRegion) 'Nije unesena regija kupovine'
2026FROM Orders AS O
2027
2028SELECT COUNT (*) 'Broj narudžbi sa unesenim regijama'
2029FROM Orders AS O
2030WHERE O.ShipRegion IS NULL
2031
2032--10. Prikazati ukupne troškove prevoza po uposlenicima. Uslov je da ukupni troškovi
2033--prevoza nisu prešli 7500 pri èemu se rezultat treba sortirati opadajuæim redoslijedom
2034--po visini troškova prevoza. (Northwind)
2035SELECT O.EmployeeID, SUM(O.Freight) 'Troškovi prevoza'
2036FROM Orders AS O
2037GROUP BY O.EmployeeID
2038HAVING SUM(O.Freight)<7500
2039ORDER BY 2 DESC
2040
2041--11. Prikazati ukupnu vrijednost troškova prevoza po državama ali samo ukoliko je veæa od
2042--4000 za robu koja se kupila u Francuskoj, Njemaèkoj ili USA. (Northwind)
2043SELECT O.ShipCountry, SUM (O.Freight) 'Troškovi prevoza'
2044FROM Orders AS O
2045WHERE O.ShipCountry IN ('France', 'Germany', 'USA')
2046GROUP BY O.ShipCountry
2047HAVING SUM (O.Freight)>4000
2048
2049--12. Prikazati ukupan broj modela proizvoda. Lista treba da sadrži ID modela proizvoda i
2050--njihov ukupan broj. Uslov je da proizvod pripada nekom modelu i da je ukupan broj
2051--proizvoda po modelu veæi od 3. U listu ukljuèiti (prebrojati) samo one proizvode èiji
2052--naziv poèinje slovom 'S'. (AdventureWorks2017)
2053USE AdventureWorks2017
2054SELECT PP.ProductModelID, COUNT (*)
2055FROM Production.Product AS PP
2056WHERE PP.Name LIKE 'S%' AND PP.ProductModelID IS NOT NULL
2057GROUP BY PP.ProductModelID
2058HAVING COUNT (*)>3
2059
2060--ILI
2061
2062SELECT PP.ProductModelID, COUNT (PP.ProductModelID)
2063FROM Production.Product AS PP
2064WHERE PP.Name LIKE 'S%'
2065GROUP BY PP.ProductModelID
2066HAVING COUNT (PP.ProductModelID)>3
2067
2068--13. Prikazati tip popusta, naziv prodavnice i njen id. (Pubs)
2069USE pubs
2070SELECT D.discounttype,S.stor_name,S.stor_id
2071FROM stores AS S
2072INNER JOIN discounts AS D
2073ON S.stor_id=D.stor_id
2074
2075--14. Prikazati ime uposlenika, njegov id, te naziv posla koji obavlja. (Pubs)
2076SELECT E.fname,E.emp_id,J.job_desc
2077FROM employee AS E
2078INNER JOIN jobs AS J
2079ON J.job_id=E.job_id
2080
2081--15. Prikazati spojeno ime i prezime uposlenika, teritoriju i regiju koju pokriva. Uslov je da su zaposlenici mlaði od 60 godina. (Northwind)
2082USE Northwind
2083SELECT E.FirstName + ' '+E.LastName,T.TerritoryDescription,R.RegionDescription
2084FROM Employees AS E
2085INNER JOIN EmployeeTerritories AS ET
2086ON E.EmployeeID=ET.EmployeeID
2087INNER JOIN Territories AS T
2088ON ET.TerritoryID=T.TerritoryID
2089INNER JOIN Region AS R
2090ON R.RegionID=T.RegionID
2091WHERE DATEDIFF(YEAR,E.BirthDate,GETDATE())<60
2092
2093--16. Prikazati ime uposlenika i ukupnu vrijednost svih narudžbi koju je taj uposlenik napravio u 1996. godini. U obzir uzeti samo one uposlenike èija je ukupna napravljena vrijednost veæa od 20000. Podatke sortirati prema ukupnoj vrijednosti (zaokruženoj na dvije decimale) u rastuæem redoslijedu. (Northwind)
2094SELECT E.EmployeeID,SUM(OD.UnitPrice*OD.Quantity)'Ukupna vrijednost'
2095FROM Employees AS E
2096INNER JOIN Orders AS O
2097ON E.EmployeeID=O.EmployeeID
2098INNER JOIN [Order Details] AS OD
2099ON OD.OrderID=O.OrderID
2100WHERE YEAR(O.OrderDate)=1996
2101GROUP BY E.EmployeeID
2102HAVING SUM(OD.UnitPrice*OD.Quantity)>20000
2103ORDER BY 2
2104
2105--17. Prikazati naziv dobavljaèa, adresu i državu dobavljaèa i nazive proizvoda koji pripadaju kategoriji piæa i ima ih na stanju više od 30 komada. Rezultate upita sortirati po državama. (Northwind)
2106SELECT S.ContactName,S.Address,S.Country,P.ProductName
2107FROM Suppliers AS S
2108INNER JOIN Products AS P
2109ON S.SupplierID=P.SupplierID
2110INNER JOIN Categories AS C
2111ON C.CategoryID=P.CategoryID
2112WHERE P.UnitsInStock>30 AND C.Description LIKE '%drinks%'
2113ORDER BY 3
2114
2115--18. Prikazati kontakt ime kupca, njegov id, broj narudžbe, datum kreiranja narudžbe (prikazan na naèin npr 24.07.2021) te ukupnu vrijednost narudžbe sa i bez popusta. Prikazati samo one narudžbe koje su kreirane u 1997. godini. Izraèunate vrijednosti zaokružiti na dvije decimale, te podatke sortirati prema ukupnoj vrijednosti narudžbe sa popustom. (Northwind)
2116USE Northwind
2117SELECT C.ContactName,C.CustomerID,O.OrderID,FORMAT(O.OrderDate,'dd.MM.yyyy') AS 'Datum kreiranja narudžbe', SUM(OD.UnitPrice*OD.Quantity) 'Ukupno bez popusta',ROUND(SUM(OD.UnitPrice*OD.Quantity*(1-OD.Discount)),2) 'Ukupno sa popustom'
2118FROM Customers AS C
2119INNER JOIN Orders AS O
2120ON C.CustomerID=O.CustomerID
2121INNER JOIN [Order Details] AS OD
2122ON OD.OrderID=O.OrderID
2123WHERE YEAR(O.OrderDate)=1997
2124GROUP BY C.ContactName,C.CustomerID,O.OrderID,FORMAT(O.OrderDate,'dd.MM.yyyy')
2125ORDER BY 6 DESC
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135--01.11.2022.
2136
2137--BAZE PODATAKA – PRAKTIÈNI ISPIT
2138
2139
2140--1. Kroz SQL kod kreirati bazu podataka sa imenom vašeg broja indeksa.
2141CREATE DATABASE ispitni
2142GO
2143USE ispitni
2144--2. U kreiranoj bazi podataka kreirati tabele sa sljedeæom strukturom:
2145--a) Proizvodi
2146--• ProizvodID, cjelobrojna vrijednost i primarni kljuè
2147--• Naziv, 50 UNICODE karaktera (obavezan unos)
2148--• SifraProizvoda, 25 UNICODE karaktera (obavezan unos)
2149--• Boja, 15 UNICODE karaktera
2150--• NazivKategorije, 50 UNICODE (obavezan unos)
2151--• Tezina, decimalna vrijednost sa 2 znaka iza zareza
2152--b) ZaglavljeNarudzbe
2153--• NarudzbaID, cjelobrojna vrijednost i primarni kljuè,
2154--• DatumNarudzbe, polje za unos datuma i vremena (obavezan unos)
2155--• DatumIsporuke, polje za unos datuma i vremena
2156--• ImeKupca, 50 UNICODE (obavezan unos)
2157--• PrezimeKupca, 50 UNICODE (obavezan unos)
2158--• NazivTeritorije, 50 UNICODE (obavezan unos)
2159--• NazivRegije, 50 UNICODE (obavezan unos)
2160--• NacinIsporuke, 50 UNICODE (obavezan unos)
2161--c) DetaljiNarudzbe
2162--• NarudzbaID, cjelobrojna vrijednost, strani kljuè
2163--• ProizvodID, cjelobrojna vrijednost, strani kljuè
2164--• Cijena, novèani tip (obavezan unos),
2165--• Kolicina, smallint (obavezan unos),
2166--• Popust, novèani tip (obavezan unos)
2167--• Narudzba ID i ProizvodID primarni kljuè
2168--12 bodova
2169CREATE TABLE Proizvodi (
2170ProizvodID INT PRIMARY KEY,
2171Naziv NVARCHAR(50) NOT NULL,
2172SifraProizvoda NVARCHAR(25) NOT NULL,
2173Boja NVARCHAR(15),
2174NazivKategorije NVARCHAR(50) NOT NULL,
2175Tezina DECIMAL(8,2)
2176)
2177
2178CREATE TABLE ZaglavljeNarudzbe (
2179NarudzbaID INT PRIMARY KEY,
2180DatumNarudzbe DATETIME,
2181DatumIsporuke DATETIME,
2182ImeKupca NVARCHAR(50) NOT NULL,
2183PrezimeKupca NVARCHAR(50) NOT NULL,
2184NazivTeritorije NVARCHAR(50) NOT NULL,
2185NazivRegije NVARCHAR(50) NOT NULL,
2186NacinIsporuke NVARCHAR(50) NOT NULL,
2187)
2188
2189CREATE TABLE DetaljiNarudzbe (
2190NarudzbaID INT CONSTRAINT FK_DetaljiNarudzbe_NarudzbaID FOREIGN KEY REFERENCES ZaglavljeNarudzbe (NarudzbaID),
2191ProizvodID INT CONSTRAINT FK_DetaljiNarudzbe_ProizvodID FOREIGN KEY REFERENCES Proizvodi (ProizvodID),
2192Cijena MONEY NOT NULL,
2193Kolicina SMALLINT NOT NULL,
2194Popust MONEY NOT NULL,
2195PRIMARY KEY(NarudzbaID, ProizvodID)
2196)
2197
2198--3. Iz baze podataka AdventureWorks u svoju bazu podataka prebaciti sljedeæe podatke:
2199--a) U tabelu Proizvodi dodati sve proizvode, na mjestima gdje nema pohranjenih podataka o težini zamijeniti vrijednost sa 0
2200--• ProductID -> ProizvodID
2201--• Name -> Naziv
2202--• ProductNumber -> SifraProizvoda
2203--• Color -> Boja
2204--• Name (ProductCategory) -> NazivKategorije
2205--• Weight -> Tezina
2206INSERT INTO Proizvodi
2207SELECT PP.ProductID, PP.Name, PP.ProductNumber, PP.Color, PPC.Name, ISNULL(PP.Weight, 0)
2208FROM AdventureWorks2017.Production.Product AS PP
2209INNER JOIN AdventureWorks2017.Production.ProductSubcategory AS PPS
2210ON PP.ProductSubcategoryID = PPS.ProductSubcategoryID
2211INNER JOIN AdventureWorks2017.Production.ProductCategory AS PPC
2212ON PPS.ProductCategoryID = PPC.ProductCategoryID
2213
2214--b) U tabelu ZaglavljeNarudzbe dodati sve narudžbe
2215--• SalesOrderID -> NarudzbaID
2216--• OrderDate -> DatumNarudzbe
2217--• ShipDate -> DatumIsporuke
2218--• FirstName (Person) -> ImeKupca
2219--• LastName (Person) -> PrezimeKupca
2220--• Name (SalesTerritory) -> NazivTeritorije
2221--• Group (SalesTerritory) -> NazivRegije
2222--• Name (ShipMethod) -> NacinIsporuke
2223INSERT INTO ZaglavljeNarudzbe
2224SELECT SOH.SalesOrderID, SOH.OrderDate, SOH.ShipDate, PP.FirstName, PP.LastName, ST.Name, ST.[Group], SM.Name
2225FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
2226INNER JOIN AdventureWorks2017.Sales.Customer AS SC
2227ON SOH.CustomerID = SC.CustomerID
2228INNER JOIN AdventureWorks2017.Person.Person AS PP
2229ON SC.PersonID = PP.BusinessEntityID
2230INNER JOIN AdventureWorks2017.Sales.SalesTerritory AS ST
2231ON SOH.TerritoryID = ST.TerritoryID
2232INNER JOIN AdventureWorks2017.Purchasing.ShipMethod AS SM
2233ON SOH.ShipMethodID = SM.ShipMethodID
2234--c) U tabelu DetaljiNarudzbe dodati sve stavke narudžbe
2235--• SalesOrderID -> NarudzbaID
2236--• ProductID -> ProizvodID
2237--• UnitPrice -> Cijena
2238--• OrderQty -> Kolicina
2239--• UnitPriceDiscount -> Popust
2240--12 bodova
2241INSERT INTO DetaljiNarudzbe
2242SELECT SOD.SalesOrderID, SOD.ProductID, SOD.UnitPrice, SOD.OrderQty, SOD.UnitPriceDiscount
2243FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
2244
2245--4.
2246--a) (6 bodova) Prikazati sve proizvode koji imaju težinu izmeðu 15 i 25, ili su crvene ili crne boje.
2247SELECT * FROM Proizvodi
2248WHERE Tezina BETWEEN 15 and 25
2249OR Boja IN ('Black', 'Red')
2250
2251--b) (7 bodova) Prikazati ukupni promet (uzimajuæi u obzir i popust) od narudžbi grupisan po teritorijama.
2252SELECT NazivTeritorije, SUM(DT.Cijena * DT.Kolicina * (1 - DT.Popust)) as UkupnoProdano
2253FROM ZaglavljeNarudzbe AS ZN
2254INNER JOIN DetaljiNarudzbe AS DT
2255ON ZN.NarudzbaID = DT.NarudzbaID
2256GROUP BY ZN.NazivTeritorije
2257
2258--c) (7 bodova) Napisati upit koji æe prebrojati stavke narudžbe za svaku narudžbu pojedinaèno. U rezultatima prikazati ID narudžbe i broj stavki, te uzeti u obzir samo one narudžbe èiji je broj stavki veæi od 1, te koje su napravljene izmeðu 1.6. i 10.6. bilo koje godine. (Novokreirana baza)
2259SELECT ZN.NarudzbaID, COUNT(*) as BrojStavki
2260FROM ZaglavljeNarudzbe AS ZN
2261INNER JOIN DetaljiNarudzbe AS DN
2262ON ZN.NarudzbaID = DN.NarudzbaID
2263WHERE MONTH(DatumNarudzbe) = 6
2264AND DAY(DatumNarudzbe) BETWEEN 1 and 10
2265GROUP BY ZN.NarudzbaID
2266HAVING COUNT(*) > 1
2267
2268--d) (7 bodova) Prikazati sve uposlenike ženskog spola koji imaju više od 10 godina radnog staža a rade na Production ili Marketing odjelu. Upitom je potrebno prikazati spojeno ime i prezime uposlenika, godine radnog staža, te odjel na kojem rade uposlenici. Rezultate upita sortirati u rastuæem redoslijedu prema nazivu odjela, te opadajuæem prema godinama radnog staža. (AdventureWorks2017)
2269USE AdventureWorks2017
2270SELECT PP.FirstName+ ' '+ PP.LastName 'Ime i prezime', DATEDIFF(YEAR,E.HireDate,GETDATE()) 'Godine radnog staza', D.Name
2271FROM HumanResources.Employee AS E
2272INNER JOIN HumanResources.EmployeeDepartmentHistory AS EDH
2273ON E.BusinessEntityID=EDH.BusinessEntityID
2274INNER JOIN HumanResources.Department AS D
2275ON D.DepartmentID=EDH.DepartmentID
2276INNER JOIN Person.Person AS PP
2277ON PP.BusinessEntityID=E.BusinessEntityID
2278WHERE DATEDIFF(YEAR,E.HireDate,GETDATE())>10 AND E.Gender ='F' AND D.Name IN ('Production','Marketing')
2279ORDER BY 3, 2 DESC
2280--e) (11 bodova) Prikazati spojeno ime i prezime osobe, spol, ukupnu vrijednost redovnih bruto prihoda, ukupnu vrijednost vanrednih prihoda, te sumu ukupnih vanrednih i ukupnih redovnih bruto prihoda. Uslov je da osobe dolaze iz Latvije, Kine ili Indonezije a suma ukupnih bruto i ukupnih vanrednih prihoda je veæa od 1000KM. Takoðer, uslov je da tip vanrednog prihoda bude prekovremeni rad a tip redovnog prihoda plata. Rezultate upita sortirati prema ukupnoj vrijednosti prihoda obrnuto abecedno. (Prihodi)
2281USE prihodi
2282select*
2283from(select O.Ime,O.PrezIme, SUM(rp.Bruto) 'Ukupna bruto vrijednost',SUM(vp.IznosVanrednogPrihoda) 'Ukupna vrijednost vanr prih',SUM(rp.Bruto)+SUM(vp.IznosVanrednogPrihoda) 'Ukupna vrijednost prihoda'
2284from Osoba as o
2285inner join Drzava as d
2286on o.DrzavaID=d.DrzavaID
2287inner join RedovniPrihodi as rp
2288on o.OsobaID=rp.OsobaID
2289inner join VanredniPrihodi as vp
2290on vp.OsobaID=o.OsobaID
2291inner join TipVanrednogPrihoda as tvp
2292on vp.TipVanrednogPrihodaID=tvp.TipVanrednogPrihodaID
2293inner join TipRedovnogPrihoda as trp
2294on rp.TipRedovnogPrihodaID=trp.TipRedovnogPrihodaID
2295where d.Drzava IN( 'China','Latvia','Indonesia') and tvp.NazivVanrednogPrihoda like 'prekovremeni rad' and trp.NazivRedovnogPrihoda like 'plata'
2296group by o.ime,o.PrezIme) as podq
2297where [Ukupna vrijednost prihoda]>10000
2298order by 5 desc
2299
2300USE prihodi
2301select O.Ime,O.PrezIme, SUM(rp.Bruto) 'Ukupna bruto vrijednost',SUM(vp.IznosVanrednogPrihoda) 'Ukupna vrijednost vanr prih',SUM(rp.Bruto)+SUM(vp.IznosVanrednogPrihoda) 'Ukupna vrijednost prihoda'
2302from Osoba as o
2303inner join Drzava as d
2304on o.DrzavaID=d.DrzavaID
2305inner join RedovniPrihodi as rp
2306on o.OsobaID=rp.OsobaID
2307inner join VanredniPrihodi as vp
2308on vp.OsobaID=o.OsobaID
2309inner join TipVanrednogPrihoda as tvp
2310on vp.TipVanrednogPrihodaID=tvp.TipVanrednogPrihodaID
2311inner join TipRedovnogPrihoda as trp
2312on rp.TipRedovnogPrihodaID=trp.TipRedovnogPrihodaID
2313where d.Drzava IN( 'China','Latvia','Indonesia') and tvp.NazivVanrednogPrihoda like 'prekovremeni rad' and trp.NazivRedovnogPrihoda like 'plata'
2314group by o.ime,o.PrezIme
2315having SUM(rp.Bruto)+SUM(vp.IznosVanrednogPrihoda)>10000
2316order by 5 desc
2317--f) (10 bodova) Napisati upit koji æe prikazati sljedeæe podatke o proizvodima: ID proizvoda, naziv proizvoda, šifru proizvoda, te novokreiranu šifru proizvoda. Nova šifra se sastoji od sljedeæih vrijednosti:
2318--1) Svi karakteri nakon prvog znaka - (crtica)
2319--2) Karakter /
2320--3) ID proizvoda
2321--Npr. Za proizvod sa ID-om 716 i šifrom LJ-0192-X, nova šifra æe biti 0192-X/716.
2322USE ispitni
2323GO
2324SELECT ProizvodID, Naziv, SifraProizvoda,
2325SUBSTRING(SifraProizvoda, CHARINDEX('-', SifraProizvoda, 0) + 1, LEN(SifraProizvoda)) + '/' + CONVERT(NVARCHAR(50), ProizvodID) as Šifra
2326FROM Proizvodi
2327
2328-- 48 bodova
2329--5.
2330--a) (8 bodova) Kreirati view koji prikazuje sljedeæe kolone: ID narudžbe, datum narudžbe, spojeno ime i prezime kupca i ukupnu vrijednost narudžbe. Podatke sortirati prema ukupnoj vrijednosti u opadajuæem redoslijedu. (Novokreirana baza)
2331GO
2332CREATE VIEW view_5a AS
2333SELECT ZN.NarudzbaID, ZN.DatumNarudzbe,ZN.ImeKupca + ' '+ ZN.PrezimeKupca AS 'Ime i prezime',
2334SUM(DN.Cijena*DN.Kolicina*(1-DN.Popust)) AS 'Vrijednost'
2335FROM ZaglavljeNarudzbe AS ZN
2336INNER JOIN DetaljiNarudzbe AS DN
2337ON ZN.NarudzbaID=DN.NarudzbaID
2338GROUP BY ZN.NarudzbaID, ZN.DatumNarudzbe, ZN.ImeKupca, ZN.PrezimeKupca
2339
2340GO
2341
2342SELECT*
2343FROM view_5a
2344ORDER BY Vrijednost DESC
2345
2346--b) (7 bodova) Kreirati proceduru sp_edit_proizvodi kojom æe se izmijeniti odreðeni zapis iz tabele Proizvodi. Procedurom korisnik može da izmijeni sve podatke o jednom proizvodu ili samo neki odreðeni podatak. Ukoliko korisnik mijenja odreðeni podatak voditi raèuna da ostali podaci ne dobiju NULL vrijednost. OBAVEZNO kreirati testni sluèaj za kreiranu proceduru. (Novokreirana baza)
2347GO
2348CREATE PROCEDURE sp_edit_proizvodi
2349(
2350@ProizvodID INT,
2351@Naziv NVARCHAR(40)=NULL,
2352@SifraProizvoda NVARCHAR(25)=NULL,
2353@Boja NVARCHAR(15)=NULL,
2354@NazivKategorije NVARCHAR(50)=NULL,
2355@Tezina DECIMAL (8,2)=NULL
2356)
2357AS
2358BEGIN
2359UPDATE Proizvodi
2360SET Naziv=ISNULL(@Naziv, Naziv),
2361SifraProizvoda=ISNULL(@SifraProizvoda, SifraProizvoda),
2362Boja=ISNULL(@Boja, Boja),
2363NazivKategorije=ISNULL(@NazivKategorije, NazivKategorije),
2364Tezina=ISNULL(@Tezina, Tezina)
2365WHERE @ProizvodID=ProizvodID
2366END
2367GO
2368
2369EXEC sp_edit_proizvodi @ProizvodID=706, @Naziv='HL Naziv'
2370
2371SELECT*
2372FROM Proizvodi
2373
2374--c) (7 bodova) Kreirati proceduru sp_search_proizvodi kojom æe se u tabeli Proizvodi uraditi select proizvoda prema nazivu proizvoda ili nazivu kategorije. Proceduru obavezno pokrenuti. (Novokreirana baza)
2375GO
2376CREATE PROCEDURE proc_search_proizvodi
2377(
2378@Naziv NVARCHAR(40)=NULL,
2379@Kategorija NVARCHAR(50)=NULL
2380)
2381AS
2382BEGIN
2383SELECT * FROM Proizvodi as P
2384WHERE Naziv=@Naziv OR NazivKategorije=@Kategorija
2385END
2386
2387EXEC proc_search_proizvodi @Naziv = 'HL Road Frame - Red, 62'
2388EXEC proc_search_proizvodi @Kategorija = 'Components'
2389EXEC proc_search_proizvodi @Naziv = 'LL Road Front Wheel', @Kategorija = 'Components'
2390
2391
2392--22 boda
2393
2394
2395--SQL skriptu (bila prazna ili ne) imenovati Vašim brojem indeksa, te istu upload-ovati na FTP u folder Upload.
2396--Maksimalan broj bodova:100
2397--Prag prolaznosti: 55
2398
2399
2400
2401
2402create database zadacic
2403go
2404use zadacic
2405
2406
2407
2408--1 zadatak
2409create table proizvodi
2410(
2411 proizvodID int constraint PK_proizvodi primary key not null,
2412 naziv nvarchar(50) not null,
2413 sifraProizvoda nvarchar(25) not null,
2414 boja nvarchar (15),
2415 nazivKategorije nvarchar(50) not null,
2416 tezina decimal (8,2)
2417)
2418
2419create table zaglavljeNarudzba
2420(
2421 narudzbaID int constraint PK_narudzba primary key not null,
2422 datumNaruzdbe datetime not null,
2423 datumIsporuke datetime,
2424 imeKupca nvarchar (50) not null,
2425 prezimeKupca nvarchar (50) not null,
2426 nazivTeritorije nvarchar (50) not null,
2427 nazivRegije nvarchar (50) not null,
2428 nacinIsporuke nvarchar (50) not null
2429)
2430
2431create table detaljiNarudzbe
2432(
2433 narudzbaID int,
2434 proizvodID int,
2435 constraint FK_detaljiNarudzbeZ foreign key (narudzbaID) references zaglavljeNarudzba (narudzbaID),
2436 constraint FK_detaljiNarudzbeP foreign key (proizvodID) references proizvodi (proizvodID),
2437 cijena money not null,
2438 kolicina smallint not null,
2439 popust money not null,
2440 constraint PK_detaljiNarudzbeZP primary key(narudzbaID,proizvodID)
2441)
2442
2443
2444--2 zadatak
2445
2446insert into proizvodi
2447select pp.productID, pp.Name, pp.ProductNumber, pp.color, pc.Name, isnull(pp.Weight,0) as Weight
2448from [AdventureWorks2014].Production.Product as pp inner join [AdventureWorks2014].Production.ProductSubcategory as sc
2449on pp.ProductSubcategoryID = sc.ProductSubcategoryID
2450inner join [AdventureWorks2014].Production.ProductCategory as pc
2451on sc.ProductCategoryID = pc.ProductCategoryID
2452
2453
2454insert into zaglavljeNarudzba
2455select soh.SalesOrderID, soh.OrderDate, soh.ShipDate, pp.FirstName, pp.LastName, st.Name, st.[Group], sm.Name
2456from [AdventureWorks2014].Sales.SalesOrderHeader as soh inner join AdventureWorks2014.Sales.Customer as c
2457on soh.CustomerID = c.CustomerID
2458inner join AdventureWorks2014.Person.Person as pp
2459on c.PersonID = pp.BusinessEntityID
2460inner join AdventureWorks2014.Sales.SalesTerritory as st
2461on st.TerritoryID = soh.TerritoryID
2462inner join AdventureWorks2014.Purchasing.ShipMethod as sm
2463on soh.ShipMethodID = sm.ShipMethodID
2464
2465
2466insert into detaljiNarudzbe
2467select SalesOrderID, ProductID, UnitPrice, OrderQty, UnitPriceDiscount
2468from AdventureWorks2014.Sales.SalesOrderDetail
2469
2470--zadatak 3
2471select naziv, boja, tezina
2472from proizvodi
2473where tezina between 15 and 25 and (boja like 'Black' or boja like 'Red')
2474
2475select*
2476from proizvodi
2477--zadatak 4
2478
2479select dn.narudzbaID, dn.cijena*dn.kolicina*(1-dn.popust) as UkupniPrometSaPopustom, zn.nazivTeritorije
2480from detaljiNarudzbe as dn inner join zaglavljeNarudzba as zn
2481on dn.narudzbaID = zn.narudzbaID
2482
2483select *
2484from detaljiNarudzbe as dn inner join zaglavljeNarudzba as zn
2485on dn.narudzbaID = zn.narudzbaID
2486
2487--zadatak5
2488
2489select zn.narudzbaID, dn.kolicina, month(zn.datumNaruzdbe) as Mjesec
2490from zaglavljeNarudzba as zn inner join detaljiNarudzbe as dn
2491on zn.narudzbaID = dn.narudzbaID
2492where dn.kolicina > 1 and day(zn.datumNaruzdbe) between 1 and 10
2493--nema 6 mjeseca
2494
2495select*
2496from zaglavljeNarudzba as zn inner join detaljiNarudzbe as dn
2497on zn.narudzbaID = dn.narudzbaID
2498
2499--zadatak6
2500
2501select pp.FirstName + pp.LastName as ImePrezime, year(e.HireDate) as GodinaRadnogStaza, e.JobTitle
2502from AdventureWorks2014.HumanResources.Employee as e inner join AdventureWorks2014.Person.Person as pp
2503on e.BusinessEntityID = pp.BusinessEntityID
2504where e.Gender like 'F' and ( e.JobTitle like '%Marketing%' or e.JobTitle like '%Production%') and DATEDIFF(year, e.HireDate, getdate()) > 10
2505order by e.JobTitle asc, e.HireDate desc
2506
2507select *
2508from AdventureWorks2014.HumanResources.Employee as e inner join AdventureWorks2014.Person.Person as pp
2509on e.BusinessEntityID = pp.BusinessEntityID
2510
2511--zadaatak 7, prihodi
2512
2513select o.ime+o.prezime as imeprezime, sum(rp.bruto) as ukupnaVrijednostBruto, sum(vp.iznos) as ukupnaVrijednostVanPrihodaIznosa, sum(rp.bruto) + sum(vp.iznos) as Ukupno
2514from prihodi.dbo.osoba as o inner join prihodi.dbo.red_prihodi as rp
2515on o.osobaID = rp.osobaID
2516inner join prihodi.dbo.vanr_prihodi as vp
2517on o.osobaID = vp.osobaID
2518inner join prihodi.dbo.grad as g
2519on o.gradID = g.gradID
2520inner join prihodi.dbo.regija as r
2521on g.regijaID = r.regijaID
2522inner join prihodi.dbo.drzava as d
2523on r.drzavaID = d.drzavaID
2524inner join prihodi.dbo.tip_vanr_prihoda as tvp
2525on vp.tip_vanr_prihodaID = tvp.tip_vanr_prihodaID
2526inner join prihodi.dbo.tip_red_prihoda as trp
2527on rp.tip_red_prihodaID = trp.tip_red_prihodaID
2528where (d.naziv like 'Latvia' or d.naziv like 'Indonesia' or d.naziv like 'China') and rp.bruto + vp.iznos > 1000 and tvp.tip_vanr_prihodaID like '1' and trp.tip_red_prihodaID like '1'
2529group by o.ime+o.prezime
2530
2531
2532
2533--pomoc pri rjesavanju zadatka
2534select*
2535from prihodi.dbo.osoba as o inner join prihodi.dbo.red_prihodi as rp
2536on o.osobaID = rp.osobaID
2537inner join prihodi.dbo.vanr_prihodi as vp
2538on o.osobaID = vp.osobaID
2539inner join prihodi.dbo.grad as g
2540on o.gradID = g.gradID
2541inner join prihodi.dbo.regija as r
2542on g.regijaID = r.regijaID
2543inner join prihodi.dbo.drzava as d
2544on r.drzavaID = d.drzavaID
2545where (d.drzavaID like 'Latvia' or d.drzavaID like 'Indonesia' or d.drzavaID like 'China')
2546
2547select vp.tip_vanr_prihodaID
2548from prihodi.dbo.osoba as o inner join prihodi.dbo.red_prihodi as rp
2549on o.osobaID = rp.osobaID
2550inner join prihodi.dbo.vanr_prihodi as vp
2551on o.osobaID = vp.osobaID
2552
2553
2554select*
2555from prihodi.dbo.tip_red_prihoda
2556
2557--zadatak 8
2558
2559select proizvodID, naziv, sifraProizvoda, right(concat(sifraProizvoda,'/', proizvodID),10) as novaSifra
2560from proizvodi
2561
2562--right(sifraProizvoda, (charindex ('-', sifraProizvoda)+3)), -- left(punaAdresa, (charindex ('-', punaAdresa)-1))-- ovo mogu iskoristiiti za sifru sa apl roka
2563
2564--zadatak 9
2565
2566go
2567create view zadatak9view
2568as
2569select dn.narudzbaID, zn.datumNaruzdbe, zn.imeKupca+zn.prezimeKupca as imePrezime, dn.cijena * dn.kolicina as UkupnaVrijednostNarudzbe
2570from detaljiNarudzbe as dn inner join zaglavljeNarudzba as zn
2571on dn.narudzbaID = zn.narudzbaID
2572go
2573
2574--samo sortirati ostalo
2575
2576--zadatak 10
2577
2578go
2579create procedure sp_editProizvodi
2580as
2581begin
2582 update proizvodi
2583 set
2584 where
2585end
2586go
2587
2588--nemam pojma iskreno
2589
2590select*
2591from proizvodi
2592
2593
2594
2595--zadatak 11
2596go
2597create procedure sp_searchProizvod
2598(
2599 @naziv nvarchar (50) = null,
2600 @nazivKategorije nvarchar (50) = null
2601)
2602as
2603begin
2604select *
2605from proizvodi
2606where naziv = @naziv or
2607 nazivKategorije = @nazivKategorije
2608end
2609
2610
2611
2612exec sp_searchProizvod @naziv = 'HL Road Frame - Black, 58'
2613exec sp_searchProizvod @nazivKategorije = 'Components'
2614
2615select*
2616from proizvodi
2617
2618
2619
2620
2621create database IspitniZadatak11
2622go
2623use IspitniZadatak11
2624
2625--1 zadatak
2626
2627create table proizvodi
2628(
2629 proizvodID int constraint PK_proizvodi primary key not null,
2630 naziv nvarchar (50) not null,
2631 sifraProizvoda nvarchar (25) not null,
2632 bona nvarchar (15),
2633 nazivKategorije nvarchar (50) not null,
2634 tezina decimal (8,2)
2635)
2636
2637select*
2638from detaljiNarudzbe
2639
2640create table zaglavljeNarudzbe
2641(
2642 narudzbaID int constraint PK_zaglavljeNarudzbe primary key not null,
2643 datumNarudzbe datetime not null,
2644 datumIsporuke datetime not null,
2645 nazivTeritorije nvarchar (50) not null,
2646 nazivRegije nvarchar (50) not null,
2647 nazivIsporuke nvarchar (50) not null
2648)
2649
2650create table detaljiNarudzbe
2651(
2652 narudzbaID int,
2653 constraint FK_detaljiNarudzbeNarudzba foreign key (narudzbaID) references zaglavljeNarudzbe (narudzbaID),
2654 proizvodID int,
2655 constraint FK_detaljiNarudzbeProizvod foreign key (proizvodID) references proizvodi (proizvodID),
2656 cijena money not null,
2657 kolicina smallint not null,
2658 popust money not null,
2659 constraint PK_proizNaru primary key (narudzbaID, proizvodID)
2660)
2661
2662drop table detaljiNarudzbe
2663
2664
2665--2 zadatak
2666
2667insert into proizvodi
2668select p.ProductID, p.name, p.ProductNumber, isnull(p.Color,'nije naznaceno') as Boja, pc.Name, p.Weight
2669from AdventureWorks2014.Production.Product as p inner join AdventureWorks2014.Production.ProductSubcategory as psc
2670on p.ProductSubcategoryID = psc.ProductSubcategoryID
2671inner join AdventureWorks2014.Production.ProductCategory as pc
2672on psc.ProductCategoryID = pc.ProductCategoryID
2673
2674select*
2675from proizvodi
2676
2677insert into zaglavljeNarudzbe
2678select soh.SalesOrderID, soh.OrderDate, soh.ShipDate, st.Name, st.[Group], sm.Name
2679from AdventureWorks2014.Sales.SalesOrderHeader as soh inner join AdventureWorks2014.Sales.SalesTerritory as st
2680on soh.TerritoryID = st.TerritoryID
2681inner join AdventureWorks2014.Purchasing.ShipMethod as sm
2682on soh.ShipMethodID = sm.ShipMethodID
2683
2684select*
2685from zaglavljeNarudzbe
2686
2687insert into detaljiNarudzbe
2688select soh.SalesOrderID, sod.ProductID, sod.UnitPrice, sod.OrderQty, sod.UnitPriceDiscount
2689from AdventureWorks2014.Sales.SalesOrderHeader as soh inner join AdventureWorks2014.Sales.SalesOrderDetail as sod
2690on soh.SalesOrderID = sod.SalesOrderID
2691
2692select*
2693from detaljiNarudzbe
2694
2695--3 zadatak
2696
2697go
2698create view v_proizvodi
2699as
2700select p.naziv, p.sifraProizvoda, count(dn.kolicina) as ukupnoKolicina, dn.cijena*dn.kolicina*(1-dn.popust) as cijena
2701from proizvodi as p inner join detaljiNarudzbe as dn
2702on p.proizvodID = dn.proizvodID
2703group by p.naziv, p.sifraProizvoda, dn.cijena*dn.kolicina*(1-dn.popust)
2704go
2705
2706select *
2707from v_proizvodi
2708order by cijena desc
2709
2710
2711
2712--4 zadatak
2713
2714select d.GroupName, count(*)
2715from AdventureWorks2014.HumanResources.Employee as e inner join AdventureWorks2014.HumanResources.EmployeeDepartmentHistory as edh
2716on e.BusinessEntityID = edh.BusinessEntityID
2717inner join AdventureWorks2014.HumanResources.Department as d
2718on d.DepartmentID = edh.DepartmentID
2719where datediff(year, e.HireDate,getdate()) > 10
2720group by d.GroupName
2721order by count(*) desc
2722
2723
2724--pomoc pri rjesavanju
2725--select d.GroupName
2726--from AdventureWorks2014.HumanResources.Employee as e inner join AdventureWorks2014.HumanResources.EmployeeDepartmentHistory as edh
2727--on e.BusinessEntityID = edh.BusinessEntityID
2728--inner join AdventureWorks2014.HumanResources.Department as d
2729--on d.DepartmentID = edh.DepartmentID
2730--where datediff(year, e.HireDate,getdate()) > 10
2731
2732
2733--5 zadatak
2734
2735
2736select count(pod.OrderQty) as UkupnoPoMjesecu
2737from AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh inner join AdventureWorks2014.Purchasing.PurchaseOrderDetail as pod
2738on poh.PurchaseOrderID = pod.PurchaseOrderID
2739inner join AdventureWorks2014.Purchasing.ShipMethod as sm
2740on poh.ShipMethodID = sm.ShipMethodID
2741where poh.Freight between 500 and 2500 and sm.Name like '%Cargo%'
2742group by month(pod.DueDate)
2743
2744--pomoc
2745--select*
2746--from AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh inner join AdventureWorks2014.Purchasing.PurchaseOrderDetail as pod
2747--on poh.PurchaseOrderID = pod.PurchaseOrderID
2748--inner join AdventureWorks2014.Purchasing.ShipMethod as sm
2749--on poh.ShipMethodID = sm.ShipMethodID
2750
2751
2752--6 zadatak
2753
2754select soh.SalesPersonID, count(soh.SalesOrderID) as BrojNarucenihNarudzbiPoOsobi
2755from AdventureWorks2014.Sales.SalesOrderHeader as soh inner join AdventureWorks2014.Sales.SalesTerritory as st
2756on soh.TerritoryID = st.TerritoryID
2757where (year(soh.OrderDate) like 2011 or year(soh.OrderDate) like 2011) and (st.Name like 'Canada' or st.Name like 'France' or st.Name like 'United Kingdom')
2758group by soh.SalesPersonID
2759order by count(soh.SalesOrderID)
2760
2761--pomoc
2762--select st.Name
2763--from AdventureWorks2014.Sales.SalesOrderHeader as soh inner join AdventureWorks2014.Sales.SalesTerritory as st
2764--on soh.TerritoryID = st.TerritoryID
2765
2766--7 zadatak
2767-- moram ponoviti index
2768
2769--8 zadatak
2770
2771
2772
2773--1
2774/*
2775a) Kreirati bazu Indeks.
2776*/
2777
2778create database IspitniZadatak10
2779go
2780use IspitniZadatak10
2781
2782/*
2783b) U bazi indeks kreirati sljedeće tabele:
27841. Narudzba koja će se sastojati od polja:
27852. Dobavljac
27863. Proizvod
2787*/
2788
2789create table narudzba
2790(
2791 narudzbaID int constraint PK_narudzba primary key not null,
2792 datumNarudzbe date not null,
2793 datumPrijema date not null,
2794 datumIsporuke date not null,
2795 trosakPrevoza money not null,
2796 punaAdresa nvarchar (70) not null
2797)
2798
2799
2800create table dobavljac
2801(
2802 dobavljacID int constraint PK_dobavljac primary key not null,
2803 nazivDobavljaca nvarchar (40) not null,
2804 punaAdresa nvarchar (60) not null,
2805 drzava nvarchar (15) not null
2806)
2807
2808create table proizvod
2809(
2810 narudzbaID int not null,
2811 dobavljacID int not null,
2812 proizvodID int constraint PK_proizvod primary key not null,
2813 nazivProizvoda nvarchar (40) not null,
2814 cijena int not null,
2815 kolicina int not null,
2816 popust decimal (3,2) not null,
2817 raspolozivost bit not null,
2818 constraint FK_proizvodNarudzba foreign key (narudzbaID) references narudzba (narudzbaID),
2819 constraint FK_proizvodDobavljac foreign key (dobavljacID) references dobavljac (dobavljacID)
2820)
2821
2822
2823--2
2824/*a) U tabelu Narudzba insertovati podatke iz tabele Orders baze Northwind pri čemu će puna adresa biti sačinjena od adrese, poštanskog broja i grada isporuke.
2825Između dijelova adrese umetnuti prazno mjesto. Ukoliko nije unijeta vrijednost poštanskog broja zamijeniti je sa 00000.
2826Uslov je da se insertuju zapisi iz 1997. i većih godina (1998, 1999...), te da postoji datum isporuke. Zapise sortirati po vrijednosti troška prevoza.
2827*/
2828insert into narudzba
2829select orderID, OrderDate, RequiredDate, ShippedDate, Freight, ShipAddress + ' ' + isnull(ShipPostalCode, '00000') + ShipCity as PunaAdresa
2830from NORTHWND.dbo.Orders
2831where year(OrderDate) > 1996 and ShippedDate is not null -- postoji datum isporuke
2832order by Freight
2833
2834--RJ: 657
2835
2836/*
2837b) U tabelu Dobavljac insertovati zapise iz tabele Suppliers. Puna adresa će se sastojati od adrese, poštanskog broja i grada dobavljača.
2838*/
2839insert into dobavljac
2840select SupplierID, CompanyName, Address + ' '+ PostalCode + ' ' + City, Country
2841from NORTHWND.dbo.Suppliers
2842
2843--RJ: 29
2844
2845/*
2846c) U tabelu Proizvod insertovati zapise iz odgovarajućih kolona tabela Order Details i Product uz uslov da vrijednost cijene bude veća od
284710, te da je na proizvod odobren popust. S obzirom na zadatak 2a voditi računa o postavljanju odgovarajućeg uslova da ne bi došlo do
2848konflikta u odnosu na NarudzbaID - potrebno je postaviti uslov da se insertuju zapisi iz 1997. i većih godina (1998, 1999...), te da postoji datum isporuke.
2849*/
2850
2851insert into proizvod
2852select od.OrderID, p.SupplierID, p.ProductID, p.ProductName, p.UnitPrice, od.Quantity, od.Discount, p.Discontinued
2853from NORTHWND.dbo.[Order Details] as od inner join NORTHWND.dbo.Products as p
2854on od.ProductID = p.ProductID
2855inner join NORTHWND.dbo.Orders as o
2856on od.OrderID = o.OrderID
2857where od.Quantity > 10 and od.Discount > 0 and year (o.OrderDate) > 1996 and o.ShippedDate is not null
2858
2859insert into proizvod
2860select od.OrderID, p.SupplierID, p.ProductID, p.ProductName, od.UnitPrice, od.Quantity, od.Discount, p.Discontinued
2861from NORTHWND.dbo.[Order Details] as od inner join NORTHWND.dbo.Products as p
2862on od.ProductID = p.ProductID
2863inner join NORTHWND.dbo.Orders as o
2864 on od.OrderID = o.OrderID
2865where od.Quantity > 10 and od.Discount > 0 and year (o.OrderDate) > 1996 and o.ShippedDate is not null
2866
2867--RJ: 521
2868
2869--3
2870/*
2871Iz tabele Proizvod dati pregled ukupnog broja ostvarenih narudzbi po dobavljaču i proizvodu.
2872*/
2873SELECT DobavljacID, NazivProizvoda, COUNT (NarudzbaID) AS UkupnoNarudzbi
2874FROM Proizvod
2875GROUP BY DobavljacID, NazivProizvoda
2876ORDER BY 1
2877--RJ: 76
2878
2879--4
2880/*
2881Iz tabele Proizvod dati pregled ukupnog prometa ostvarenog po dobavljaču i narudžbi uz uslov da se prikažu samo oni zapisi kod kojih je vrijednost
2882prometa manja od 1000 i odobreni popust veći od 10%. Ukupni promet izračunati uz uzimanje u obzir i odobrenog popusta.
2883*/
2884SELECT DobavljacID, NarudzbaID, Popust, SUM (Cijena * Kolicina * (1 - Popust)) AS Promet
2885FROM Proizvod
2886WHERE Popust > 0.10
2887GROUP BY DobavljacID, NarudzbaID, Popust
2888HAVING SUM (Cijena * Kolicina * (1 - Popust)) < 1000
2889ORDER BY 1
2890--RJ: 242
2891
2892--5
2893/*
2894Iz tabele Narudzba dati pregled svih narudzbi kod kojih je broj dana od datuma narudžbe do datuma isporuke manji od 10.
2895Pregled će se sastojati od ID narudžbe, broja dana razlike i kalendarske godine, pri čemu je razdvojiti pregled po godinama
2896(1997 i 1998 - prvo sve 1997, zatim sve 1998). Sortirati po broju dana isporuke u opadajućem redoslijedu.
2897*/
2898SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, YEAR (DatumIsporuke) AS Godina
2899FROM Narudzba
2900WHERE DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) < 10
2901ORDER BY 3, 2
2902--RJ: 495
2903
2904SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, '1997' AS Godina
2905FROM Narudzba
2906WHERE YEAR (DatumIsporuke) = 1997 AND DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) < 10
2907UNION
2908SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, '1998' AS Godina
2909FROM Narudzba
2910WHERE YEAR (DatumIsporuke) = 1998 AND DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) < 10
2911ORDER BY 2 DESC
2912
2913--6
2914/*
2915Iz tabele Narudzba dati pregled svih narudzbi kod kojih je isporuka izvršena u istom mjesecu.
2916Pregled će se sastojati od ID narudžbe, broja dana razlike, mjeseca narudžbe, mjeseca isporuke i kalendarske godine, pri čemu je potrebno razdvojiti pregled po godinama
2917(1997 i 1998 - prvo sve 1997, zatim sve 1998). Sortirati po broju dana isporuke u opadajućem redoslijedu.
2918*/
2919SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, MONTH (DatumIsporuke) AS MjesecNarudzbe, MONTH (DatumNarudzbe) AS MjesecIsporuke, YEAR (DatumIsporuke) AS Godina
2920FROM Narudzba
2921WHERE MONTH (DatumIsporuke) = MONTH (DatumNarudzbe)
2922ORDER BY 5, 2
2923--RJ: 464
2924
2925--7
2926/*Iz tabele Narudzba dati pregled svih narudžbi koje su isporučene u Graz ili Köln.
2927Pregled će se sastojati od ID narudžbe i naziva grada. Sortirati po nazivu grada.
2928*/
2929SELECT NarudzbaID, RIGHT (PunaAdresa, 4) AS NazivGrada
2930FROM Narudzba
2931WHERE PunaAdresa LIKE '%Graz%' OR PunaAdresa LIKE '%Köln%'
2932ORDER BY 2
2933--RJ: 31
2934
2935--8
2936/*
2937Iz tabela Narudzba, Dobavljac i Proizvod kreirati pregled koji će se sastojati od polja NarudzbaID, GodNarudzbe kao godinu iz polja DatumNarudzbe,
2938NazivProizvoda, NazivDobavljaca, Drzava, TrosakPrevoza, Ukupno kao ukupna vrijednost narudžbe koja će se računati uz uzimanje u obzir i popusta i postotak
2939koji će davati informaciju o vrijednosti postotka troška prevoza u odnosu na ukupnu vrijenost narudžbe.
2940Uslov je da postotak bude veći od 30% i da je ukupna vrijednost veća od troška prevoza. Sortirati po vrijednosti postotka u opadajućem redoslijedu.
2941*/
2942SELECT N.NarudzbaID, YEAR (N.DatumNarudzbe) AS GodNarudzbe, P.NazivProizvoda, D.NazivDobavljaca, D.Drzava,
2943 N.TrosakPrevoza, P.Cijena * P.Kolicina * (1 - P.Popust) AS Ukupno, LEFT (ROUND (N.TrosakPrevoza / (P.Cijena * P.Kolicina * (1 - P.Popust)) * 100, 2),5) AS Postotak
2944FROM Narudzba AS N INNER JOIN Proizvod AS P
2945ON N.NarudzbaID = P.NarudzbaID
2946 INNER JOIN Dobavljac AS D
2947 ON P.DobavljacID = D.DobavljacID
2948WHERE N.TrosakPrevoza > 0.3 * (P.Cijena * P.Kolicina * (1 - P.Popust)) AND N.TrosakPrevoza < (P.Cijena * P.Kolicina * (1 - P.Popust))
2949ORDER BY 8 DESC
2950--RJ: 104
2951
2952--9
2953/*
2954Iz tabela Narudzba, Dobavljac i Proizvod kreirati pogled koji će sadržavati ID narudžbe, dan iz datuma prijema, raspoloživost, naziv grada iz pune adrese naručitelja,
2955i državu dobavljača. Uslov je da je datum prijema u 2. ili 3. dekadi mjeseca i da grad naručitelja Bergamo.
2956*/
2957USE Indeks
2958GO
2959CREATE VIEW view1
2960AS
2961SELECT TOP 100 PERCENT N.NarudzbaID, DAY (N.DatumPrijema) AS DanPrijema, P.Raspolozivost, RIGHT (N.PunaAdresa, 7) AS NazivGrada, D.Drzava
2962FROM Narudzba AS N INNER JOIN Proizvod AS P
2963ON N.NarudzbaID = P.NarudzbaID
2964 INNER JOIN Dobavljac AS D
2965 ON P.DobavljacID = D.DobavljacID
2966WHERE DAY (N.DatumPrijema) BETWEEN 11 AND 31 AND RIGHT (N.PunaAdresa, 7) = 'Bergamo'
2967ORDER BY 2
2968
2969SELECT * FROM view1
2970--RJ: 5
2971
2972--10
2973/*
2974Iz tabela Proizvod i Dobavljac kreirati proceduru proc1 koja će sadržavati ID i naziv dobavljača i ukupan broj proizvoda
2975koji je realizirao dobavljač. Pokrenuti proceduru za vrijednost ukupno realiziranog broja proizvoda 22 i 14.
2976*/
2977USE Indeks
2978GO
2979CREATE PROCEDURE proc1
2980(
2981 @DobavljacID int = NULL,
2982 @NazivDobavljaca nvarchar(40) = NULL,
2983 @UkBroj int = NULL
2984)
2985AS
2986BEGIN
2987SELECT P.DobavljacID, D.NazivDobavljaca, COUNT (P.ProizvodID) AS Broj
2988FROM Proizvod AS P INNER JOIN Dobavljac AS D
2989ON P.DobavljacID = D.DobavljacID
2990--WHERE P.DobavljacID = @DobavljacID OR
2991-- NazivDobavljaca = @NazivDobavljaca OR
2992-- P.ProizvodID >= 0
2993GROUP BY P.DobavljacID, D.NazivDobavljaca
2994HAVING COUNT (P.ProizvodID) = @UkBroj
2995END
2996
2997exec proc1 @UkBroj = 14
2998
2999exec proc1 @UkBroj = 22
3000
3001
3002
3003
3004--1
3005/*
3006a) Koristeći izričito SQL kod kreirati bazu podataka pod vlastitim brojem indeksa.
3007*/
3008
3009create database IspitniZadatak9
3010go
3011use IspitniZadatak9
3012
3013
3014
3015--b) Kreiranje tabela. Voditi računa o međusobnom odnosu između tabela. Definirati odgovarajuće spoljne ključeve pomoću kojih će se tabele međusobno povezati.
3016/*
3017I. Kreirati tabelu narudzba sljedeće strukture:
3018 - narudzbaID cjelobrojna varijabla, primarni ključ
3019 - kupac, 40 unicode karaktera
3020 - puna_adresa, 80 unicode karaktera
3021 - datum_narudzbe, datumska varijabla
3022 - cijena_prevoza, novčana varijabla
3023*/
3024create table narudzba
3025(
3026 narudzbaID int constraint PK_narudzba primary key not null,
3027 kupac nvarchar (40),
3028 punaAdresa nvarchar (80),
3029 datumNarudzbe date,
3030 cijenaPrevoza money
3031)
3032
3033/*
3034II. Kreirati tabelu proizvod sljedeće strukture:
3035 - proizvodID, , cjelobrojna varijabla, primarni ključ
3036 - naziv_proizvoda, 40 unicode karaktera
3037 - naziv_dobavljaca, 40 unicode karaktera
3038 - stanje_na_sklad, cjelobrojna varijabla
3039 - narucena_kol, cjelobrojna varijabla
3040
3041*/
3042create table proizvod
3043(
3044 proizvodID int constraint PK_proizvod primary key not null,
3045 nazivProizvoda nvarchar (40),
3046 nazivDobavljaca nvarchar (40),
3047 stanjeNaSkladistu int,
3048 narucenaKolicina int
3049)
3050
3051/*
3052II. Kreirati tabelu detalji_narudzbe sljedeće strukture:
3053 - narudzbaID, cjelobrojna varijabla
3054 - proizvodID, cjelobrojna varijabla
3055 - cijena_proizvoda, novčana varijabla
3056 - kolicina, cjelobrojna varijabla
3057 - popust, decimalna varijabla
3058*/
3059
3060create table detaljiNarudzbe
3061(
3062 narudzbaID int,
3063 proizvodID int,
3064 cijenaProizvoda money,
3065 kolicina int,
3066 popust decimal(8,2),
3067 constraint PK_detaljiNarudzbe primary key (narudzbaID, proizvodID),
3068 constraint FK_detaljiProizvod foreign key (proizvodID) references proizvod (proizvodID),
3069 constraint FK_detaljiNarudzba foreign key (narudzbaID) references narudzba (narudzbaID)
3070)
3071
3072drop table detaljiNarudzbe
3073
3074--10 bodova
3075
3076---------------------------------------------------------------------------
3077--2. Import podataka
3078/*
3079Koristeći bazu Northwind u vlastiti bazu prebaciti podatke prema zadatim pravilima.
3080a) U tabelu narudzba iz tabela Customers i Orders prebaciti:
3081 - OrderID -> narudzbaID
3082 - CompanyName -> kupac
3083 - puna_adresa - spojiti podatke iz kolona Address, PostalCode i City pri čemu je potrebno podatke razdvojiti crticom
3084 - OrderDate -> datum_narudzbe
3085 - Freight -> cijena_prevoza
3086
3087*/
3088insert into narudzba
3089select o.OrderID, c.CompanyName, c.Address + '-' + c.PostalCode + '-' + c.City as PunaAdresa, o.OrderDate, o.Freight
3090from NORTHWND.dbo.Customers as c inner join NORTHWND.dbo.Orders as o
3091on c.CustomerID = o.CustomerID
3092
3093select*
3094from narudzba
3095--830
3096
3097
3098/*
3099b) U tabelu proizvod iz tabela Products i Suppliers prebaciti:
3100 - ProductID -> proizvodID
3101 - ProductName -> naziv_proizvoda
3102 - CompanyName -> naziv_dobavljaca
3103 - UnitsInStock -> stanje_na_sklad
3104 - UnitsOnOrder -> narucena_kol
3105*/
3106insert into proizvod
3107select p.ProductID, p.ProductName, s.CompanyName, p.UnitsInStock, p.UnitsOnOrder
3108from NORTHWND.dbo.Products as p inner join NORTHWND.dbo.Suppliers as s
3109on p.SupplierID = s.SupplierID
3110
3111select*
3112from proizvod
3113--77
3114
3115/*
3116c) U tabelu detalji_narudzbe iz tabela Order Details i Products prebaciti:
3117 - OrderID -> narudzbaID
3118 - ProductID -> proizvodID
3119 - UnitPrice -> cijena_proizvoda
3120 - Quantity -> kolicina
3121 - Discount -> popust
3122*/
3123
3124insert into detaljiNarudzbe
3125select od.OrderID, p.ProductID, p.UnitPrice, od.Quantity, od.Discount
3126from NORTHWND.dbo.[Order Details] as od inner join NORTHWND.dbo.Products as p
3127on od.ProductID = p.ProductID
3128
3129--2155
3130--10 bodova
3131
3132---------------------------------------------------------------------------
3133/*
31343.
3135a) Koristeći tabele narudzba i detalji_narudzbe kreirati pogled view_kupac_kol sljedeće strukture:
3136 - narudzbaID
3137 - kupac
3138 - datum_narudzbe
3139 - kolicina
3140uz uslov da je narudzba izvršena najranije 22 godine u odnosu na aktuelni datum.
3141*/
3142
3143go
3144create view view_kupac_kol
3145as
3146select n.narudzbaID, n.kupac, n.datumNarudzbe, dn.kolicina
3147from narudzba as n inner join detaljiNarudzbe as dn
3148on n.narudzbaID = dn.narudzbaID
3149where datediff(year, n.datumNarudzbe, getdate()) < 25 --zapamti
3150go
3151
3152--691
3153select * from view_kupac_kol
3154
3155--12 bodova
3156
3157---------------------------------------------------------------------------
3158/*
31594.
3160Kreirati proceduru koja će imati istu strukturu kao tabela detalji_narudzba. Voditi računa o tipovima varijabli u proceduri.
3161Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti).
3162Uslov je da preuzmu samo oni zapisi u kojima nije odobren popust. Pokrenuti porceduru za sljedeće vrijednosti parametara:
31631. količina = 10
31642. ID narudžbe = 10255
3165*/
3166go
3167create procedure procedureDetaljiNarudzba
3168(
3169 @narudzbaID int = null,
3170 @proizvodID int = null,
3171 @cijenaProizvoda money = null,
3172 @kolicina int = null,
3173 @popust decimal(8,2) = null
3174)
3175as
3176begin
3177 select narudzbaID, proizvodID, cijenaProizvoda, kolicina, popust
3178 from detaljiNarudzbe
3179where (
3180 @narudzbaID = narudzbaID or
3181 @proizvodID = proizvodID or
3182 @cijenaProizvoda = cijenaProizvoda or
3183 @kolicina = kolicina or
3184 @popust = popust ) and popust = 0
3185end
3186go
3187
3188drop procedure procedureDetaljiNarudzba
3189
3190exec procedureDetaljiNarudzba @kolicina = 10
3191exec procedureDetaljiNarudzba @narudzbaID = 10255
3192
3193--130
3194--4
3195
3196--8 bodova
3197
3198---------------------------------------------------------------------------
3199/*
32005. Kreirati pogled kojim će se dati prikaz naručenih količina prema mjesecu narudžbe.
3201Uslov je da je narudžba izvršena u 1996. godini. Pogled treba sadržavati ID narudžbe, redni broj mjeseca i količinu.
3202*/
3203go
3204create view zadatak5
3205as
3206select dn.narudzbaID, month(n.datumNarudzbe) as mjesec, dn.kolicina
3207from detaljiNarudzbe as dn inner join narudzba as n
3208on dn.narudzbaID = n.narudzbaID
3209where year(n.datumNarudzbe) = 1996
3210go
3211
3212--405
3213
3214select * from zadatak5
3215
3216--7 bodova
3217
3218---------------------------------------------------------------------------
3219/*
32206.
3221a) Kreirati pogled koji će se sastojati od naziva dobavljača, naziva proizvoda,
3222ukupne cijene koja je proizvod jedinične cijene i količine, ukupne cijene s popustom koja predstavlja ukupnu cijenu sa obračunatim popustom i visinu popusta izraženu kao broj. Obratiti pažnju na
3223način računanja ukupne cijene s popustom. Uslov da je u pogledu budu samo oni zapisi kod kojih je odobren popust.
3224b) Koriseći pogled kreiran pod a) prikazati minimalnu, maksimalnu i srednju vrijednost visine popusta,
3225te razliku između minimalne i maksimalne vrijednosti. Srednja vrijednsot predstavlja srednju vrijednost novčanih vrijednosti, pa njen prikaz treba s tim uskladiti.
3226*/
3227--a
3228go
3229create view zadatak6
3230as
3231select p.nazivDobavljaca, p.nazivProizvoda, dn.cijenaProizvoda * dn.kolicina as ukupnaCijena, dn.cijenaProizvoda * dn.kolicina * (1 - dn.popust) as UkupnaCijenaSaPopustom,
3232 dn.cijenaProizvoda * dn.kolicina * dn.popust as visinaPopusta
3233from proizvod as p inner join detaljiNarudzbe as dn
3234on p.proizvodID = dn.proizvodID
3235where dn.popust > 0
3236go
3237
3238select * from zadatak6
3239
3240--838
3241
3242--b
3243
3244select min(visinaPopusta) as minimalno, max(visinaPopusta) as maksimalno, round(avg(visinaPopusta),2) as srednjaVrijednost, max(visinaPopusta) - min(visinaPopusta) as razlikaIzmedjuMaxiMin
3245from zadatak6
3246
3247
3248--8 bodova
3249
3250---------------------------------------------------------------------------
3251/*
32527.
3253a) Kreirati pogled koji će prikazati sumirane cijene proizvoda po nazivu proizvoda i popustu.
3254b) Koristeći pogled kreiran pod a) prikazati maksimalne vrijednosti suma po visinama popusta. Sortirati po vrijednostima popusta u rastućem redoslijedu.
3255c) Koristeći pogled kreiran pod a) prikazati srednje vrijednosti suma po nazivima proizvoda. Sortirati po vrijednostima suma u opadajućem redoslijedu.
3256--Voditi računa da je cijena proizvoda novčana varijabla, te prema tome formatirati srednje vrijednosti.
3257*/
3258--
3259--a
3260go
3261create view sumirano
3262as
3263select p.nazivProizvoda, dn.popust, sum(dn.cijenaProizvoda) as ukupno
3264from detaljiNarudzbe as dn inner join proizvod as p
3265on dn.proizvodID = p.proizvodID
3266group by p.nazivProizvoda, dn.popust
3267go
3268
3269select *
3270from sumirano
3271
3272--b
3273
3274select popust, max(ukupno)
3275from sumirano
3276group by popust
3277
3278--407
3279--11
3280/*
32810.00 3530.90
32820.01 15.00
32830.02 25.00
32840.03 33.25
32850.04 81.00
32860.05 1212.10
32870.06 34.00
32880.10 527.00
32890.15 297.00
32900.20 421.60
32910.25 742.74
3292*/
3293--c
3294select nazivProizvoda, round(avg(ukupno),2)
3295from sumirano
3296group by nazivProizvoda
3297order by 2 desc
3298--77
3299--15 bodova
3300
3301
3302
3303---------------------------------------------------------------------------
3304/*
33058. Dati pregled kupovine po rednom broju dana u mjesecu. Upit treba da sadrži naziv proizvoda,
3306redni broj dana u mjesecu i ukupan broj prodaje proizvoda na taj redni broj dana. Npr, proizvod_1 se 1 dana u mjesecu prodao 3 puta. Uslova je da se dadne prikaz za prvu polovicu mjeseca.
3307*/
3308select p.nazivProizvoda, day(n.datumNarudzbe) as brojDana, count(day(n.datumNarudzbe))
3309from proizvod as p inner join detaljiNarudzbe as dn
3310on p.proizvodID = dn.proizvodID
3311inner join narudzba as n
3312on n.narudzbaID = dn.narudzbaID
3313where day(n.datumNarudzbe) between 1 and 15
3314group by p.nazivProizvoda, day(n.datumNarudzbe)
3315
3316--646
3317--15 bodova
3318
3319
3320---------------------------------------------------------------------------
3321/*
33229. Kreirati pregled kojim će se na osnovu podataka iz kolone puna_adresa prebrojati koliko puta se neka adresa pojavljuje.
3323Upit treba da sadrži adresu i broj pojavljivanja adrese. Npr. adresa 1 se pojavljuje 10 puta. Sortirati prema broju pojavljivanja u opadajućem redoslijedu.
3324*/
3325
3326select left(punaAdresa, (charindex ('-', punaAdresa)-1)) as dioAdrese, count( left(punaAdresa, (charindex ('-', punaAdresa)-1))) as prebrojano
3327from narudzba
3328group by left(punaAdresa, (charindex ('-', punaAdresa)-1))
3329order by 2 desc
3330
3331-- left(punaAdresa, (charindex ('-', punaAdresa)-1))-- ovo mogu iskoristiiti za sifru sa apl roka
3332
3333
3334
3335--89
3336--15 bodova
3337
3338
3339
3340------------------------------------------------
3341--1
3342/*
3343a) Kreirati bazu podataka pod vlastitim brojem indeksa.
3344*/
3345create database IspitniZadatak8
3346go
3347use IspitniZadatak8
3348
3349
3350--------------------------
3351
3352/*Prilikom kreiranja tabela voditi računa o međusobnom odnosu između tabela.
3353b) Kreirati tabelu radnik koja će imati sljedeću strukturu:
3354 - radnikID, cjelobrojna varijabla, primarni ključ
3355 - drzavaID, 15 unicode karaktera
3356 - loginID, 256 unicode karaktera
3357 - sati_god_odmora, cjelobrojna varijabla
3358 - sati_bolovanja, cjelobrojna varijabla
3359*/
3360create table radnik
3361(
3362 radnikID int constraint PK_radnik primary key not null,
3363 drzavaID nvarchar (15),
3364 loginID nvarchar (256),
3365 satiGodisnjegOdmora int,
3366 satiBolovanja int
3367)
3368
3369/*
3370c) Kreirati tabelu kupovina koja će imati sljedeću strukturu:
3371 - kupovinaID, cjelobrojna varijabla, primarni ključ
3372 - status, cjelobrojna varijabla
3373 - radnikID, cjelobrojna varijabla
3374 - br_racuna, 15 unicode karaktera
3375 - naziv_dobavljaca, 50 unicode karaktera
3376 - kred_rejting, cjelobrojna varijabla
3377*/
3378create table kupovina
3379(
3380 kupovinaID int constraint PK_kupovina primary key not null,
3381 status int,
3382 radnikID int,
3383 constraint FK_kupovina foreign key (radnikID) references radnik (radnikID),
3384 brRacuna nvarchar(15),
3385 nazivDobavljaca nvarchar (50),
3386 kredRejting int
3387)
3388
3389/*
3390c) Kreirati tabelu prodaja koja će imati sljedeću strukturu:
3391 - prodavacID, cjelobrojna varijabla, primarni ključ
3392 - prod_kvota, novčana varijabla
3393 - bonus, novčana varijabla
3394 - proslogod_prodaja, novčana varijabla
3395 - naziv_terit, 50 unicode karaktera
3396*/
3397create table prodaja
3398(
3399 prodavacID int constraint PK_prodaja primary key not null,
3400 prodKvota money,
3401 bonus money,
3402 proslogodisnjaProdaja money,
3403 nazivteritorije nvarchar (50),
3404 constraint FK_ProdajaRadnik foreign key (prodavacID) references radnik (radnikID)
3405)
3406
3407--10 bodova
3408
3409
3410--------------------------------------------
3411--2. Import podataka
3412/*
3413a) Iz tabele humanresources.employee baze AdventureWorks2014 u tabelu radnik importovati podatke po sljedećem pravilu:
3414 - BusinessEntityID -> radnikID
3415 - NationalIDNumber -> drzavaID
3416 - LoginID -> loginID
3417 - VacationHours -> sati_god_odmora
3418 - SickLeaveHours -> sati_bolovanja
3419*/
3420
3421insert into radnik
3422select BusinessEntityID, NationalIDNumber, LoginID, VacationHours, SickLeaveHours
3423from AdventureWorks2014.HumanResources.Employee
3424
3425--rj: 290
3426
3427/*
3428b) Iz tabela purchasing.purchaseorderheader i purchasing.vendor baze AdventureWorks2014 u tabelu kupovina importovati podatke po sljedećem pravilu:
3429 - PurchaseOrderID -> kupovinaID
3430 - Status -> status
3431 - EmployeeID -> radnikID
3432 - AccountNumber -> br_racuna
3433 - Name -> naziv_dobavljaca
3434 - CreditRating -> kred_rejting
3435*/
3436insert into kupovina
3437select poh.PurchaseOrderID, poh.status, poh.EmployeeID, v.AccountNumber, v.Name, v.CreditRating
3438from AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh inner join AdventureWorks2014.Purchasing.Vendor as v
3439on poh.VendorID = v.BusinessEntityID
3440
3441--rj: 4012
3442
3443/*
3444c) Iz tabela sales.salesperson i sales.salesterritory baze AdventureWorks2014 u tabelu prodaja importovati podatke po sljedećem pravilu:
3445 - BusinessEntityID -> prodavacID
3446 - SalesQuota -> prod_kvota
3447 - Bonus -> bonus
3448 - SalesLastYear -> proslogod_prodaja
3449 - Name -> naziv_terit
3450 - CreditRating -> kred_rejting // nema imena
3451*/
3452insert into prodaja
3453select sp.BusinessEntityID, sp.SalesQuota, sp.Bonus, sp.SalesLastYear, st.Name
3454from AdventureWorks2014.Sales.SalesPerson as sp inner join AdventureWorks2014.Sales.SalesTerritory as st
3455on sp.TerritoryID = st.TerritoryID
3456
3457--rj: 14
3458--10 bodova
3459
3460------------------------------------------
3461/*
34623.
3463a) Iz tabela radnik i kupovina kreirati pogled view_bicikl koji će imati sljedeću strukturu:
3464 - kupovinaID,
3465 - naziv dobavljača,
3466 - kreditni rejting
3467Uslov je da u pogledu budu samo oni zapisi u kojima se prema nazivu dobavljača zaključuje da se bavi prodajom bicikla.
3468Obavezno napisati kod kojim će se dati prikaz sadržaja pogleda sortiran po ID kupovine.
3469b) Koristeći prethodno kreirani pogled prebrojati broj obavljenih kupovina prema kreditnom rejtingu. Pregled treba da sadrži oznaku kreditnog rejtinga i ukupan broj obavljenih kupovina.*/
3470--a
3471go
3472create view v_biciklo
3473as
3474select k.kupovinaID, k.nazivDobavljaca, k.kredRejting
3475from radnik as r inner join kupovina as k
3476on r.radnikID = k.radnikID
3477where k.nazivDobavljaca like '%Bi%'
3478go
3479
3480select * from v_biciklo
3481order by kupovinaID
3482
3483--rj: 1474
3484
3485--b
3486select kredRejting, count(kredRejting) as UkupanBroj
3487from v_biciklo
3488group by kredRejting
3489order by 1
3490
3491--rj: 3
3492/*
34931 1273
34943 151
34955 50
3496*/
3497--10 bodova
3498-----------------------------------------------
3499/*
35004.
3501Kreirati proceduru koja će imati istu strukturu kao pogled kreiran u prethodnom zadatku.
3502Voditi računa o tipovima varijabli u proceduri.
3503Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti).
3504Uslov je da se procedurom obuhvate oni zapisi iz pogleda kod kojih je kreditni rejting veći od 1, te da se izvrši sortiranje po kreditnom rejtingu. Pokrenuti proceduru za kreditni rejting 3 i 5.*/
3505
3506go
3507create procedure zadatak4
3508(
3509 @kupovinaID int = null,
3510 @nazivDobavljaca nvarchar (50) = null,
3511 @kredRejting int = null
3512)
3513as
3514begin
3515select kupovinaID, nazivDobavljaca, kredRejting
3516from v_biciklo
3517where @kredRejting > 1 and
3518 (
3519 @kupovinaID = kupovinaID or
3520 @nazivDobavljaca = nazivDobavljaca or
3521 @kredRejting = kredRejting
3522 )
3523order by kredRejting
3524end
3525
3526exec zadatak4 @kredRejting = 3
3527exec zadatak4 @kredRejting = 5
3528
3529--rj: 151
3530
3531--rj: 50
3532--10 bodova
3533
3534
3535
3536
3537-----------------------------------------------
3538/*
35395.
3540a) U tabeli radnik kreirati neklasterirani indeks nad kolonom drzavaID. Uključiti kolone sati_god_odmora i sati_bolovanja.
3541b) Izvršiti testiranje kreiranog indeksa.
3542c) Obrisati prethodno kreirani indeks.
3543*/
3544create nonclustered index IX_ukupnoSati on radnik
3545(
3546 drzavaID asc
3547)
3548include (satiGodisnjegOdmora, satiBolovanja)
3549
3550
3551select*
3552from radnik
3553where drzavaID < 50000000 and satiGodisnjegOdmora > 80 and satiBolovanja > 40
3554
3555drop index IX_ukupnoSati on radnik
3556--rj: 3
3557/*
355853 9659517 adventure-works\diane0 87 63
3559210 20244403 adventure-works\belinda0 83 61
3560230 28414965 adventure-works\stuart1 88 64
3561*/
3562
3563--5 bodova
3564-----------------------------------------------
3565/*
35666.
3567a) Dati pregled kojim će se prebrojati zapisi u kojima je broj sati bolovanja veći od broja sati godišnjeg odmora,
3568uz uslov da je ta razlika veća od 10. Pregled treba da sadrži razliku sati i ukupan broj. Sortirati prema razlici sati.
3569b) Dati pregled svih zapisa kojim će se prebrojati broj država po prodajnim kvotama.
3570*/
3571--a
3572
3573select (satiBolovanja - satiGodisnjegOdmora) as razlikaSati, count(satiBolovanja - satiGodisnjegOdmora) as UkupanBroj
3574from radnik
3575where (satiBolovanja - satiGodisnjegOdmora) > 10
3576group by (satiBolovanja - satiGodisnjegOdmora)
3577order by (satiBolovanja - satiGodisnjegOdmora)
3578
3579select *
3580from radnik
3581
3582--rj: 12
3583
3584--b
3585select count(r.drzavaID), p.prodKvota
3586from radnik as r inner join prodaja as p
3587on r.radnikID = p.prodavacID
3588group by p.prodKvota
3589
3590select*
3591from radnik as r inner join prodaja as p
3592on r.radnikID = p.prodavacID
3593
3594--rj: 2
3595/*
3596250000.00 11
3597300000.00 3
3598*/
3599--10 bodova
3600
3601-------------------------------------------
3602/*
36037.
3604a) Kreirati pogled dobavljaci_radnici koji će se sastojati od kolona naziv dobavljača i ukupan broj radnika.
3605Ukupan broj je podatak kojim se prebrojava broj radnika s kojima je dobavljač poslovao. Obavezno napisati kod kojim će se izvršiti pregled sadržaja pogleda sortiran po ukupnom broju.
3606b) Kreirati pregled kojim će se izvršiti prebrojavanje po ukupnom broju prebrojanih radnika.
3607c) Kreirati proceduru kojom će se iz pogleda kreiranog pod a) preuzeti zapisi u kojima je ukupan broj manji od 50. Voditi računa o tipovima podataka.
3608Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Pokrenuti proceduru za vrijednosti ukupan broj = 1, 2 i 50.
3609*/
3610--a
3611go
3612create view dobavljaci_radnici
3613as
3614select nazivDobavljaca, count(radnikID) as UkupanBrojRadnika
3615from kupovina
3616group by nazivDobavljaca
3617go
3618
3619
3620select *
3621from dobavljaci_radnici
3622
3623--rj: 86
3624
3625--b
3626select UkupanBrojRadnika, count(UkupanBrojRadnika)
3627from dobavljaci_radnici
3628group by UkupanBrojRadnika
3629order by UkupanBrojRadnika
3630
3631--5
3632/*
36331 4
36342 2
36354 1
363650 29
363751 50
3638*/
3639
3640--c
3641
3642--c) Kreirati proceduru kojom će se iz pogleda kreiranog pod a) preuzeti zapisi u kojima je ukupan broj manji od 50. Voditi računa o tipovima podataka.
3643--Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti).
3644--Pokrenuti proceduru za vrijednosti ukupan broj = 1, 2 i 50.
3645go
3646create procedure dobavljaci
3647(
3648 @nazivDobavljaca nvarchar (50) = null,
3649 @UkupanBrojRadnika int = null
3650)
3651as
3652begin
3653select nazivDobavljaca, UkupanBrojRadnika
3654from dobavljaci_radnici
3655where UkupanBrojRadnika < 51 and
3656 (
3657 @nazivDobavljaca = nazivDobavljaca or
3658 @UkupanBrojRadnika = UkupanBrojRadnika
3659 )
3660end
3661
3662drop procedure dobavljaci
3663exec dobavljaci @UkupanBrojRadnika = 1
3664exec dobavljaci @UkupanBrojRadnika = 2
3665exec dobavljaci @UkupanBrojRadnika = 50
3666
3667
3668
3669--rj: 1
3670--15 bodova
3671
3672---------------------------------------
3673/*
36748.
3675a) Iz tabela kupovina i radnik kreirati pogled view_sifra_transakc koja će se sastojati od sljedećih kolona:
3676 - naziv dobavljača,
3677 - ID države (odnosi se na radnika),
3678 - sifra_transakc
3679Podaci u koloni sifra_transakc će se formirati spajanjem karaktera koji se dobiju kada se iz kolone loginID tabele radnik ukloni dio 'adventure-works\' i posljednja 4 karaktera iz kolone br_racuna tabele kupovina, između kojih je potrebno umetnuti donju crtu (_).
3680Obavezno napisati kod za pregled sadržaja pogleda.
3681b) Iz prethodno kreiranog pogleda prebrojati sve zapise u kojima su i drzavaID i šifra transkacije parni brojevi .*/
3682*/
3683
3684create view view_sifra_transakc
3685as
3686select k.nazivDobavljaca, r.drzavaID, SUBSTRING(r.loginID, 17, 15) + +'-' + right(k.brRacuna,4) as SifraTRansakcije, r.loginID
3687from kupovina as k inner join radnik as r
3688on k.radnikID = r.radnikID
3689
3690select *
3691from view_sifra_transakc
3692order by 1
3693
3694--4012
3695select count (*)
3696from view_sifra_transakc
3697where right (drzavaID,1) in (0,2,4,6,8) and right (SifraTRansakcije,1) in (0,2,4,6,8)
3698
3699--rj: count = 93
3700--10 bodova
3701
3702
3703--------------------------------------------
3704/*
37059.
3706a) U tabeli kupovina broj računa se sastoji od slovnog i brojčanog dijela. Kreirati pogled view_slovni kojim će se izvršiti prebrojavanje prema slovnom dijelu broja računa.
3707b) Koristeći prethodno kreirani pogled izvršiti prebrojavanje prema početnom slovu
3708c) Koristeći pogled kreiran pod a) izvršiti prebrojavanje ukupnog broj prebrojanih slovnih dijelova koji nisu jednocifreni.
3709*/
3710create view view_slovni
3711as
3712select left (brRacuna,LEN (brRacuna)-4) as slovni, COUNT (left (brRacuna,LEN (brRacuna)-4)) as count_slovni
3713from kupovina
3714group by left (brRacuna,LEN (brRacuna)-4)
3715--80
3716
3717select LEFT (slovni,1), COUNT (LEFT (slovni,1))
3718from view_slovni
3719group by LEFT (slovni,1)
3720--18
3721
3722select count_slovni, COUNT (count_slovni)
3723from view_slovni
3724where count_slovni > 9
3725group by count_slovni
3726--4
3727/*
372850 29
372951 41
3730102 3
3731154 1
3732*/
3733--15 bodova
3734
3735
3736
3737--------------------------------------------
3738/*
373910.
3740Kreirati upit kojim će dati prikaz kolone loginID nakon što se iz nje izbaci sve osim karaktera koji slijede nakon znaka \,
3741uz uslov da se prikažu samo oni zapisi u kojima je dužina novonastalog stringa kraća od 6 znakova.
3742*/
3743select substring (loginID,17,15)
3744from radnik
3745where LEN (substring (loginID,17,15)) < 6
3746--82
3747--5 bodova
3748
3749--1.
3750/*
3751a) Kreirati bazu podataka pod vlastitim brojem indeksa.
3752*/
3753
3754create database IspitniZadatak7
3755go
3756use IspitniZadatak7
3757
3758
3759
3760--b) Kreiranje tabela. Prilikom kreiranja tabela voditi računa o spojnim poljima između tabela.
3761/*
3762I. Kreirati tabelu TipProizv koja se sastoji od polja:
3763 - potkatID - cjelobrojna varijabla, primarni ključ
3764 - katID - cjelobrojna varijabla, obavezan unos
3765 - kat_naziv - 50 unicode karaktera, obavezan unos
3766 - potkat_naziv - 50 unicode karaktera, obavezan unos
3767*/
3768create table TipProizvodnje
3769(
3770 potkatID int constraint PK_tipProizvodnje primary key not null,
3771 katID int not null,
3772 katNaziv nvarchar (50) not null,
3773 potkatNaziv nvarchar (50) not null
3774)
3775
3776/*
3777II. Kreirati tabelu proizvod koja se sastoji od polja:
3778 - proizvodID - cjelobrojna varijabla, primarni ključ
3779 - naziv - 50 UNICODE karaktera, obavezan unos
3780 - boja - 15 UNICODE karaktera
3781 - tezina - decimalni broj decimal(8, 2),
3782 - dana_za_proiz - cjelobrojna varijabla, obavezan unos
3783 - klasa - 2 unicode karaktera
3784 - potkat_ID cjelobrojna varijabla, obavezan unos
3785*/
3786create table proizvod
3787(
3788 proizvodID int constraint PK_proizvod primary key not null,
3789 naziv nvarchar(50) not null,
3790 boja nvarchar (15),
3791 tezina decimal (8,2),
3792 danaZaProizvodnju int not null,
3793 klasa nvarchar (2),
3794 potkatID int not null,
3795 constraint FK_potkat foreign key (potkatID) references TipProizvodnje (potkatID)
3796)
3797
3798/*
3799III. Kreirati tabelu nalog koja se sastoji od polja:
3800 - nalogID - cjelobrojna varijabla, primarni ključ
3801 - proizvodID - cjelobrojna varijabla, obavezan unos
3802 - naruc_kol - cjelobrojna varijabla, obavezan unos
3803 - stanje_kol - cjelobrojna varijabla, obavezan unos
3804 - dtm_zaduz - datumska varijabla samo za unos datuma (bez vremena)
3805 - oznaka_greske - 50 unicode karaktera, obavezan unos
3806*/
3807create table nalog
3808(
3809 nalogID int constraint PK_nalog primary key not null,
3810 proizvodID int not null,
3811 constraint FK_proizvod foreign key (nalogID) references proizvod (proizvodID),
3812 narucenaKolicina int not null,
3813 stanjeKolicina int not null,
3814 datumZaduzivanja date,
3815 oznakaGreske nvarchar (50) not null
3816)
3817
3818create table nalozi
3819(
3820 nalogID int,
3821 proizvodID int not null,
3822 constraint PK_proizvoda primary key (proizvodID, nalogID),
3823 narucenaKolicina int not null,
3824 stanjeKolicine int not null,
3825 datumZaduzivanja date,
3826 oznakaGreske nvarchar (50) not null
3827)
3828
3829drop table nalog
3830--15 bodova
3831
3832-----------------------------------------------------------------------------------------------
3833--2. Importovanje podataka
3834/*
3835a) U tabelu TipProizv importovati podatke iz tabela ProductSubcategory i ProductCategory baze AdventureWorks2014 koje se nalaze u šemi Production na sljedeći način:
3836 - ProductSubcategoryID -> potkatID
3837 - ProductCategoryID -> katID
3838 - Name -> kat_naziv
3839 - Name -> potkat_naziv
3840Voditi računa o pripadnosti polja tabelama iz kojih se importuju podaci.
3841*/
3842
3843insert into TipProizvodnje
3844select ps.ProductSubcategoryID, pc.ProductCategoryID, ps.name, pc.Name
3845from AdventureWorks2014.Production.ProductSubcategory as ps inner join AdventureWorks2014.Production.ProductCategory as pc
3846on ps.ProductCategoryID = pc.ProductCategoryID
3847
3848--37
3849
3850/*
3851b) U tabelu proizvod importovati podatke iz tabele Product baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
3852 - ProductID -> proizvodID
3853 - Name -> naziv
3854 - Color -> boja
3855 - Weight -> tezina
3856 - DaysToManufacture -> dana_za_proiz
3857 - Class -> klasa
3858 - ProductSubcategoryID -> potkatID
3859uz uslov da je ProductSubcategoryID sadrži vrijednost.
3860*/
3861insert into proizvod
3862select ProductID, name, color, Weight, DaysToManufacture, Class, ProductSubcategoryID
3863from AdventureWorks2014.Production.Product
3864where ProductSubcategoryID is not null
3865--295
3866
3867/*
3868c) U tabelu nalog importovati podatke iz tabela WorkOrder i ScrapReason baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
3869 - WorkOrderID -> nalogID
3870 - ProductID -> proizvodID
3871 - OrderQty -> naruc_kol
3872 - StockedQty -> stanje_kol
3873 - DueDate -> dtm_zaduz
3874 - Name -> oznaka_greske
3875uz uslov da je ProductID veći ili jednak 680.
3876*/
3877
3878insert into nalozi
3879select wo.WorkOrderID, wo.ProductID, wo.OrderQty, wo.StockedQty, wo.DueDate, sr.name
3880from AdventureWorks2014.Production.WorkOrder as wo inner join AdventureWorks2014.Production.ScrapReason as sr
3881on wo.ScrapReasonID = sr.ScrapReasonID
3882where wo.ProductID >= 680
3883
3884--332
3885-- 15 bodova
3886
3887-----------------------------------------------------------------------------------------------
3888--3.
3889/*
3890Iz tabele nalog dati pregled koji će se sastojati od polja:
3891 - godina - godina zaduženja proizvoda
3892 - uk_broj_po_god - ukupan broj zapisa po godinama
3893uz uslov da je proizvod zadužen u prvom polugodištu bilo koje godine.
3894Primjer za uk_broj: U tabeli se nalazi 5 zapisa kod kojih je datum zaduženja iz prvog polugodišta 2015. godine
3895*/
3896
3897select year(datumZaduzivanja) as godina, count(datumZaduzivanja) as ukupanBrojPoGodinama
3898from nalog
3899where MONTH(datumZaduzivanja) < 7
3900group by year(datumZaduzivanja)
3901
3902--4
3903/*
39042011 2
39052012 49
39062013 72
39072014 51
3908*/
3909--5 bodova
3910
3911-----------------------------------------------------------------------------------------------
3912--4.
3913/*
3914Iz tabele nalog kreirati pogled view_razlika koji će se sastojati od polja:
3915 - razlika_stanja - razlika između naručene količine i količine na stanju
3916 - uk_broj_po_razlici - ukupan broj zapisa po vrijednosti razlike, npr. u tabeli se nalazi 5 zapisa kod kojih je razlika 10
3917uz uslov da je proizvod zadužen u 10. mjesecu bilo koje godine prije 2013.
3918Obavezno napisati naredbu za pregled sadržaja pogleda.
3919*/
3920
3921go
3922create view view_Razlika
3923as
3924select narucenaKolicina - stanjeKolicine as razlikaStanja, count(narucenaKolicina - stanjeKolicine) as UkupanBrojPoRazlici
3925from nalog
3926where MONTH(datumZaduzivanja) = 10 and year(datumZaduzivanja) < 2013
3927group by narucenaKolicina - stanjeKolicine
3928go
3929
3930
3931select *
3932from view_Razlika
3933
3934
3935--6
3936/*
39371 8
39382 7
39393 1
394010 1
394130 1
394232 1
3943*/
3944--12 bodova
3945
3946-----------------------------------------------------------------------------------------------
3947/*
39485. Koristeći tabelu proizvod kreirati proceduru proc_proizvod kojom će se definirati sljedeći ulazni parametri:
3949- proizvodID
3950- boja
3951- tezina
3952- dana_za_proiz
3953Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijetog parametra).
3954
3955Proceduru pokrenuti za sljedeće vrijednosti parametara:
39561. @boja = Black
39572. @dana_za_proiz = 1
3958
3959*/
3960go
3961create procedure proc_proizvod
3962(
3963 @proizvodID int = null,
3964 @boja nvarchar(15) = null,
3965 @tezina decimal(8,2) = null,
3966 @danaZaProizvodnju int = null
3967)
3968as
3969begin
3970select proizvodID, boja, tezina, danaZaProizvodnju
3971from proizvod
3972where (
3973 @proizvodID = proizvodID or
3974 @boja = boja or
3975 @tezina = tezina or
3976 @danaZaProizvodnju = danaZaProizvodnju
3977 )
3978end
3979go
3980
3981exec proc_proizvod @boja = 'Black'
3982exec proc_proizvod @danaZaProizvodnju = 1
3983
3984--89
3985--127
3986
3987--8 bodova
3988
3989
3990-----------------------------------------------------------------------------------------------
3991/*
39926. Kreirati pregled koji će sadržavati polja:
3993 - potkatID
3994 - suma_tez u kojem će se nalaziti suma težina
3995Uslov je da naziv proizvoda počinje slovima HL, da se ne preuzimaju zapisi u kojima se nalaze vrijednosti u kolonama boja i tezina, te da je proizvod zaduzen u 2011. ili 2012. godini.
3996*/
3997
3998select p.potkatID, sum(p.tezina) as sumaTezina
3999from proizvod as p inner join nalog as n
4000on p.proizvodID = n.proizvodID
4001where p.naziv like '%HL%' and p.boja is not null and p.tezina is not null and year(datumZaduzivanja) in (2011, 2012)
4002group by p.potkatID
4003
4004
4005
4006--10 bodova
4007--3
4008/*
400917 5270.00
401012 27.56
401114 6.52
4012*/
4013
4014-----------------------------------------------------------------------------------------------
4015/*
40167.
4017Kreirati pogled view_potkat_boja koji će se sastojati od polja:
4018 - potkatID
4019 - boja
4020 - uk_broj_po_oznaka_greske kojim će se prebrojati ukupan broj pojedinog naziva greške
4021Napisati naredbu za pregled sadržaja pogleda pri čemu će se izostaviti svi zapisi u kojima nije unijeta vrijednost za boju i uk_broj_po_oznaka_greske je neparan broj.
4022*/
4023go
4024create view view_potkatBoja
4025as
4026select p.potkatID, p.boja, count(oznakaGreske) as UkupanBrojGresaka
4027from nalog as n inner join proizvod as p
4028on n.proizvodID = p.proizvodID
4029group by p.potkatID, p.boja
4030go
4031
4032select *
4033from view_potkatBoja
4034where boja is not null and right(UkupanBrojGresaka, 1) in (0,2,4,6,8)
4035
4036--21
4037
4038--7
4039--10 bodova
4040
4041
4042-----------------------------------------------------------------------------------------------
4043/*
40448. Kreirati pregled koji će sadržavati polja:
4045- naziv potkategorije
4046- sr_vr_tez - srednja vrijednost težine zaokružena na 2 decimalna mjesta (treća i ostale decimale su 0)
4047pri čemu se ne prikazuju zapisi u kojima ne postoji srednja vrijednost.
4048*/
4049select potkatNaziv, round (avg(p.tezina), 2) as srednjaVrijednost
4050from tipProizvodnje as tp inner join proizvod as p
4051on tp.potkatID = p.potkatID
4052group by tp.potkatNaziv
4053having avg(p.tezina) is not null
4054
4055
4056--12
4057/*
4058Bottom Brackets 187.000000
4059Brakes 317.000000
4060Cranksets 603.330000
4061Derailleurs 151.500000
4062Mountain Bikes 25.060000
4063Mountain Frames 2.840000
4064Pedals 187.330000
4065Road Bikes 17.450000
4066Road Frames 2.310000
4067Touring Bikes 27.680000
4068Touring Frames 3.080000
4069Wheels 890.000000
4070*/
4071--10 bodova
4072
4073
4074-----------------------------------------------------------------------------------------------
4075/*
40769.
4077Kreirati pogled kojim će se dati prikaz ID naloga, ID proizvoda, broja godina razlike u odnosu na aktivnu godinu,
4078oznaku boje koju će predstavljati prvo slovo naziva (npr. Purple -> P), klase i naziva potkategorije.
4079Izraz za izračunavanje broja godina razlike treba biti općeg karaktera. Uslov je da naziv potkategorije sadrži riječ Bikes, te da boja nije crna. Obavezno napisati kod za pregled sadržaja pogleda.
4080*/
4081--a
4082go
4083create view view_zadatak9
4084as
4085select n.nalogID, p.proizvodID, datediff(year, n.datumZaduzivanja, getdate()) as GodinaRazlike, left(p.boja, 1) as OznakaBoje, p.klasa, tp.potkatNaziv
4086from nalog as n inner join proizvod as p
4087on n.proizvodID = p.proizvodID
4088inner join tipProizvodnje as tp
4089on p.potkatID = tp.potkatID
4090where tp.potkatNaziv like '%Bike%' and p.boja not like 'Black'
4091go
4092
4093select *
4094from view_zadatak9
4095
4096--59
4097--15 bodova
4098
4099
4100--1.
4101/*
4102a) Kreirati bazu podataka pod vlastitim brojem indeksa.
4103*/
4104
4105create database IspitniZadatak7
4106go
4107use IspitniZadatak7
4108
4109
4110
4111--b) Kreiranje tabela. Prilikom kreiranja tabela voditi računa o spojnim poljima između tabela.
4112/*
4113I. Kreirati tabelu TipProizv koja se sastoji od polja:
4114 - potkatID - cjelobrojna varijabla, primarni ključ
4115 - katID - cjelobrojna varijabla, obavezan unos
4116 - kat_naziv - 50 unicode karaktera, obavezan unos
4117 - potkat_naziv - 50 unicode karaktera, obavezan unos
4118*/
4119create table TipProizvodnje
4120(
4121 potkatID int constraint PK_tipProizvodnje primary key not null,
4122 katID int not null,
4123 katNaziv nvarchar (50) not null,
4124 potkatNaziv nvarchar (50) not null
4125)
4126
4127/*
4128II. Kreirati tabelu proizvod koja se sastoji od polja:
4129 - proizvodID - cjelobrojna varijabla, primarni ključ
4130 - naziv - 50 UNICODE karaktera, obavezan unos
4131 - boja - 15 UNICODE karaktera
4132 - tezina - decimalni broj decimal(8, 2),
4133 - dana_za_proiz - cjelobrojna varijabla, obavezan unos
4134 - klasa - 2 unicode karaktera
4135 - potkat_ID cjelobrojna varijabla, obavezan unos
4136*/
4137create table proizvod
4138(
4139 proizvodID int constraint PK_proizvod primary key not null,
4140 naziv nvarchar(50) not null,
4141 boja nvarchar (15),
4142 tezina decimal (8,2),
4143 danaZaProizvodnju int not null,
4144 klasa nvarchar (2),
4145 potkatID int not null,
4146 constraint FK_potkat foreign key (potkatID) references TipProizvodnje (potkatID)
4147)
4148
4149/*
4150III. Kreirati tabelu nalog koja se sastoji od polja:
4151 - nalogID - cjelobrojna varijabla, primarni ključ
4152 - proizvodID - cjelobrojna varijabla, obavezan unos
4153 - naruc_kol - cjelobrojna varijabla, obavezan unos
4154 - stanje_kol - cjelobrojna varijabla, obavezan unos
4155 - dtm_zaduz - datumska varijabla samo za unos datuma (bez vremena)
4156 - oznaka_greske - 50 unicode karaktera, obavezan unos
4157*/
4158create table nalog
4159(
4160 nalogID int constraint PK_nalog primary key not null,
4161 proizvodID int not null,
4162 constraint FK_proizvod foreign key (nalogID) references proizvod (proizvodID),
4163 narucenaKolicina int not null,
4164 stanjeKolicina int not null,
4165 datumZaduzivanja date,
4166 oznakaGreske nvarchar (50) not null
4167)
4168
4169create table nalozi
4170(
4171 nalogID int,
4172 proizvodID int not null,
4173 constraint PK_proizvoda primary key (proizvodID, nalogID),
4174 narucenaKolicina int not null,
4175 stanjeKolicine int not null,
4176 datumZaduzivanja date,
4177 oznakaGreske nvarchar (50) not null
4178)
4179
4180drop table nalog
4181--15 bodova
4182
4183-----------------------------------------------------------------------------------------------
4184--2. Importovanje podataka
4185/*
4186a) U tabelu TipProizv importovati podatke iz tabela ProductSubcategory i ProductCategory baze AdventureWorks2014 koje se nalaze u šemi Production na sljedeći način:
4187 - ProductSubcategoryID -> potkatID
4188 - ProductCategoryID -> katID
4189 - Name -> kat_naziv
4190 - Name -> potkat_naziv
4191Voditi računa o pripadnosti polja tabelama iz kojih se importuju podaci.
4192*/
4193
4194insert into TipProizvodnje
4195select ps.ProductSubcategoryID, pc.ProductCategoryID, ps.name, pc.Name
4196from AdventureWorks2014.Production.ProductSubcategory as ps inner join AdventureWorks2014.Production.ProductCategory as pc
4197on ps.ProductCategoryID = pc.ProductCategoryID
4198
4199--37
4200
4201/*
4202b) U tabelu proizvod importovati podatke iz tabele Product baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
4203 - ProductID -> proizvodID
4204 - Name -> naziv
4205 - Color -> boja
4206 - Weight -> tezina
4207 - DaysToManufacture -> dana_za_proiz
4208 - Class -> klasa
4209 - ProductSubcategoryID -> potkatID
4210uz uslov da je ProductSubcategoryID sadrži vrijednost.
4211*/
4212insert into proizvod
4213select ProductID, name, color, Weight, DaysToManufacture, Class, ProductSubcategoryID
4214from AdventureWorks2014.Production.Product
4215where ProductSubcategoryID is not null
4216--295
4217
4218/*
4219c) U tabelu nalog importovati podatke iz tabela WorkOrder i ScrapReason baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
4220 - WorkOrderID -> nalogID
4221 - ProductID -> proizvodID
4222 - OrderQty -> naruc_kol
4223 - StockedQty -> stanje_kol
4224 - DueDate -> dtm_zaduz
4225 - Name -> oznaka_greske
4226uz uslov da je ProductID veći ili jednak 680.
4227*/
4228
4229insert into nalozi
4230select wo.WorkOrderID, wo.ProductID, wo.OrderQty, wo.StockedQty, wo.DueDate, sr.name
4231from AdventureWorks2014.Production.WorkOrder as wo inner join AdventureWorks2014.Production.ScrapReason as sr
4232on wo.ScrapReasonID = sr.ScrapReasonID
4233where wo.ProductID >= 680
4234
4235--332
4236-- 15 bodova
4237
4238-----------------------------------------------------------------------------------------------
4239--3.
4240/*
4241Iz tabele nalog dati pregled koji će se sastojati od polja:
4242 - godina - godina zaduženja proizvoda
4243 - uk_broj_po_god - ukupan broj zapisa po godinama
4244uz uslov da je proizvod zadužen u prvom polugodištu bilo koje godine.
4245Primjer za uk_broj: U tabeli se nalazi 5 zapisa kod kojih je datum zaduženja iz prvog polugodišta 2015. godine
4246*/
4247
4248
4249select year (datumZaduzivanja) as GodinaZaduzivanja, count(datumZaduzivanja) as UkupanBrojZapisaPoGodinama
4250from nalozi
4251where MONTH(datumZaduzivanja) < 7
4252group by year (datumZaduzivanja)
4253
4254select *
4255from nalozi
4256
4257--4
4258/*
42592011 2
42602012 49
42612013 72
42622014 51
4263*/
4264--5 bodova
4265
4266-----------------------------------------------------------------------------------------------
4267--4.
4268/*
4269Iz tabele nalog kreirati pogled view_razlika koji će se sastojati od polja:
4270 - razlika_stanja - razlika između naručene količine i količine na stanju
4271 - uk_broj_po_razlici - ukupan broj zapisa po vrijednosti razlike, npr. u tabeli se nalazi 5 zapisa kod kojih je razlika 10
4272uz uslov da je proizvod zadužen u 10. mjesecu bilo koje godine prije 2013.
4273Obavezno napisati naredbu za pregled sadržaja pogleda.
4274*/
4275
4276go
4277create view viewRazlika
4278as
4279select narucenaKolicina - stanjeKolicine as RazlikaStanja, count(narucenaKolicina - stanjeKolicine) as UkupanBrojZapisaPoVrijednostiRazlike
4280from nalozi
4281where year(datumZaduzivanja) < 2013 and MONTH(datumZaduzivanja) = 10
4282group by narucenaKolicina - stanjeKolicine
4283go
4284
4285select*
4286from nalozi
4287
4288select*
4289from viewRazlika
4290
4291
4292
4293--6
4294/*
42951 8
42962 7
42973 1
429810 1
429930 1
430032 1
4301*/
4302--12 bodova
4303
4304-----------------------------------------------------------------------------------------------
4305/*
43065. Koristeći tabelu proizvod kreirati proceduru proc_proizvod kojom će se definirati sljedeći ulazni parametri:
4307- proizvodID
4308- boja
4309- tezina
4310- dana_za_proiz
4311Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijetog parametra).
4312
4313Proceduru pokrenuti za sljedeće vrijednosti parametara:
43141. @boja = Black
43152. @dana_za_proiz = 1
4316
4317*/
4318go
4319create procedure proceduraProizvod
4320(
4321 @proizvodID int = null,
4322 @boja nvarchar (15) = null,
4323 @tezina decimal (8,2) = null,
4324 @danaZaProizvodnju int = null
4325)
4326as
4327begin
4328select proizvodID, boja, tezina, danaZaProizvodnju
4329from proizvod
4330where (
4331 @proizvodID = proizvodID or
4332 @boja = boja or
4333 @tezina = tezina or
4334 @danaZaProizvodnju = danaZaProizvodnju
4335 )
4336end
4337go
4338
4339exec proceduraProizvod @danaZaProizvodnju = 1
4340exec proceduraProizvod @boja = 'Black'
4341
4342--89
4343--127
4344
4345--8 bodova
4346
4347
4348-----------------------------------------------------------------------------------------------
4349/*
43506. Kreirati pregled koji će sadržavati polja:
4351 - potkatID
4352 - suma_tez u kojem će se nalaziti suma težina
4353Uslov je da naziv proizvoda počinje slovima HL, da se ne preuzimaju zapisi u kojima se nalaze vrijednosti u kolonama boja i tezina, te da je proizvod zaduzen u 2011. ili 2012. godini.
4354*/
4355
4356select p.potkatID, sum(p.tezina) as sumaTezina
4357from proizvod as p inner join nalozi as n
4358on p.proizvodID = n.proizvodID
4359where p.naziv like '%HL%' and p.boja is not null and p.tezina is not null and year(datumZaduzivanja) in (2011, 2012)
4360group by p.potkatID
4361order by sum(p.tezina) desc
4362
4363select p.naziv
4364from proizvod as p inner join nalozi as n
4365on p.proizvodID = n.proizvodID
4366
4367
4368--10 bodova
4369--3
4370/*
437117 5270.00
437212 27.56
437314 6.52
4374*/
4375
4376-----------------------------------------------------------------------------------------------
4377/*
43787.
4379Kreirati pogled view_potkat_boja koji će se sastojati od polja:
4380 - potkatID
4381 - boja
4382 - uk_broj_po_oznaka_greske kojim će se prebrojati ukupan broj pojedinog naziva greške
4383Napisati naredbu za pregled sadržaja pogleda pri čemu će se izostaviti svi zapisi u kojima nije unijeta vrijednost za boju i uk_broj_po_oznaka_greske je neparan broj.
4384*/
4385go
4386create view viewPotkatBoja
4387as
4388select p.potkatID, p.boja, count(n.oznakaGreske) as ukupanBrojGresaka
4389from proizvod as p inner join nalozi as n
4390on p.proizvodID = n.proizvodID
4391group by p.potkatID, p.boja
4392go
4393
4394--21
4395
4396select*
4397from viewPotkatBoja
4398where boja is not null and right(ukupanBrojGresaka, 1) in (0,2,4,6,8)
4399
4400--7
4401--10 bodova
4402
4403
4404-----------------------------------------------------------------------------------------------
4405/*
44068. Kreirati pregled koji će sadržavati polja:
4407- naziv potkategorije
4408- sr_vr_tez - srednja vrijednost težine zaokružena na 2 decimalna mjesta (treća i ostale decimale su 0)
4409pri čemu se ne prikazuju zapisi u kojima ne postoji srednja vrijednost.
4410*/
4411
4412select tp.potkatNaziv, round(avg(p.tezina),2) as SrednjaVrijednost
4413from TipProizvodnje as tp inner join proizvod as p
4414on tp.potkatID = p.potkatID
4415group by tp.potkatNaziv
4416having avg(p.tezina) is not null
4417
4418select tp.potkatNaziv
4419from TipProizvodnje as tp inner join proizvod as p
4420on tp.potkatID = p.potkatID
4421
4422
4423--12
4424/*
4425Bottom Brackets 187.000000
4426Brakes 317.000000
4427Cranksets 603.330000
4428Derailleurs 151.500000
4429Mountain Bikes 25.060000
4430Mountain Frames 2.840000
4431Pedals 187.330000
4432Road Bikes 17.450000
4433Road Frames 2.310000
4434Touring Bikes 27.680000
4435Touring Frames 3.080000
4436Wheels 890.000000
4437*/
4438--10 bodova
4439
4440
4441-----------------------------------------------------------------------------------------------
4442/*
44439.
4444Kreirati pogled kojim će se dati prikaz ID naloga, ID proizvoda, broja godina razlike u odnosu na aktivnu godinu,
4445oznaku boje koju će predstavljati prvo slovo naziva (npr. Purple -> P), klase i naziva potkategorije.
4446Izraz za izračunavanje broja godina razlike treba biti općeg karaktera. Uslov je da naziv potkategorije sadrži riječ Bikes, te da boja nije crna. Obavezno napisati kod za pregled sadržaja pogleda.
4447*/
4448--a
4449
4450go
4451create view viewZadatak9
4452as
4453select n.nalogID, p.proizvodID, datediff(year, n.datumZaduzivanja, getdate()) as GodinaRazlike, left(p.boja, 1) as OznakaBoje, p.klasa, tp.potkatNaziv
4454from nalozi as n inner join proizvod as p
4455on n.proizvodID = p.proizvodID
4456inner join TipProizvodnje as tp
4457on p.potkatID = tp.potkatID
4458where tp.potkatNaziv like '%Bikes%' and p.boja not like 'Black'
4459go
4460
4461select*
4462from viewZadatak9
4463
4464
4465
4466--59
4467--15 bodova
4468
4469
4470--1.
4471/*
4472a) Kreirati bazu podataka pod vlastitim brojem indeksa.
4473*/
4474
4475
4476
4477create database IspitniZadatak6
4478go
4479use IspitniZadatak6
4480
4481
4482
4483--b) Kreiranje tabela. Prilikom kreiranja tabela voditi računa o spojnim poljima između tabela.
4484/*
4485I. Kreirati tabelu TipProizv koja se sastoji od polja:
4486 - potkatID - cjelobrojna varijabla, primarni ključ
4487 - katID - cjelobrojna varijabla, obavezan unos
4488 - kat_naziv - 50 unicode karaktera, obavezan unos
4489 - potkat_naziv - 50 unicode karaktera, obavezan unos
4490*/
4491
4492create table TipProizvodnje
4493(
4494 potkatID int constraint PK_tipProizvodnje primary key not null,
4495 katID int not null,
4496 katNaziv nvarchar (50) not null,
4497 potkatNaziv nvarchar (50) not null
4498)
4499
4500/*
4501II. Kreirati tabelu proizvod koja se sastoji od polja:
4502 - proizvodID - cjelobrojna varijabla, primarni ključ
4503 - naziv - 50 UNICODE karaktera, obavezan unos
4504 - boja - 15 UNICODE karaktera
4505 - tezina - decimalni broj decimal(8, 2),
4506 - dana_za_proiz - cjelobrojna varijabla, obavezan unos
4507 - klasa - 2 unicode karaktera
4508 - potkat_ID cjelobrojna varijabla, obavezan unos
4509*/
4510create table proizvod
4511(
4512 proizvodID int constraint PK_proizvod primary key not null,
4513 naziv nvarchar (50) not null,
4514 boja nvarchar (15),
4515 tezina decimal (8,2),
4516 danaZaProizvodnju int not null,
4517 klasa nvarchar (2),
4518 potkatID int not null,
4519 constraint FK_potkatID foreign key (potkatID) references TipProizvodnje (potkatID)
4520)
4521
4522/*
4523III. Kreirati tabelu nalog koja se sastoji od polja:
4524 - nalogID - cjelobrojna varijabla, primarni ključ
4525 - proizvodID - cjelobrojna varijabla, obavezan unos
4526 - naruc_kol - cjelobrojna varijabla, obavezan unos
4527 - stanje_kol - cjelobrojna varijabla, obavezan unos
4528 - dtm_zaduz - datumska varijabla samo za unos datuma (bez vremena)
4529 - oznaka_greske - 50 unicode karaktera, obavezan unos
4530*/
4531
4532create table nalog
4533(
4534 nalogID int,
4535 proizvodID int not null,
4536 constraint PK_proizvoda primary key (proizvodID, nalogID),
4537 narucenaKolicina int not null,
4538 stanjeKolicine int not null,
4539 datumZaduzivanja date,
4540 oznakaGreske nvarchar (50) not null
4541)
4542
4543drop table nalog
4544--15 bodova
4545
4546-----------------------------------------------------------------------------------------------
4547--2. Importovanje podataka
4548/*
4549a) U tabelu TipProizv importovati podatke iz tabela ProductSubcategory i ProductCategory baze AdventureWorks2014 koje se nalaze u šemi Production na sljedeći način:
4550 - ProductSubcategoryID -> potkatID
4551 - ProductCategoryID -> katID
4552 - Name -> kat_naziv
4553 - Name -> potkat_naziv
4554Voditi računa o pripadnosti polja tabelama iz kojih se importuju podaci.
4555*/
4556insert into TipProizvodnje
4557select ps.ProductSubcategoryID, pc.ProductCategoryID, ps.name, pc.Name
4558from AdventureWorks2014.Production.ProductSubcategory as ps inner join AdventureWorks2014.Production.ProductCategory as pc
4559on ps.ProductCategoryID = pc.ProductCategoryID
4560
4561--37
4562
4563/*
4564b) U tabelu proizvod importovati podatke iz tabele Product baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
4565 - ProductID -> proizvodID
4566 - Name -> naziv
4567 - Color -> boja
4568 - Weight -> tezina
4569 - DaysToManufacture -> dana_za_proiz
4570 - Class -> klasa
4571 - ProductSubcategoryID -> potkatID
4572uz uslov da je ProductSubcategoryID sadrži vrijednost.
4573*/
4574insert into proizvod
4575select ProductID, name, color, Weight, DaysToManufacture, Class, ProductSubcategoryID
4576from AdventureWorks2014.Production.Product
4577where ProductSubcategoryID is not null
4578--295
4579
4580/*
4581c) U tabelu nalog importovati podatke iz tabela WorkOrder i ScrapReason baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
4582 - WorkOrderID -> nalogID
4583 - ProductID -> proizvodID
4584 - OrderQty -> naruc_kol
4585 - StockedQty -> stanje_kol
4586 - DueDate -> dtm_zaduz
4587 - Name -> oznaka_greske
4588uz uslov da je ProductID veći ili jednak 680.
4589*/
4590
4591insert into nalog
4592select wo.WorkOrderID, wo.ProductID, wo.OrderQty, wo.StockedQty, wo.DueDate, sr.name
4593from AdventureWorks2014.Production.WorkOrder as wo inner join AdventureWorks2014.Production.ScrapReason as sr
4594on wo.ScrapReasonID = sr.ScrapReasonID
4595where wo.ProductID >= 680
4596
4597--332
4598-- 15 bodova
4599
4600-----------------------------------------------------------------------------------------------
4601--3.
4602/*
4603Iz tabele nalog dati pregled koji će se sastojati od polja:
4604 - godina - godina zaduženja proizvoda
4605 - uk_broj_po_god - ukupan broj zapisa po godinama
4606uz uslov da je proizvod zadužen u prvom polugodištu bilo koje godine.
4607Primjer za uk_broj: U tabeli se nalazi 5 zapisa kod kojih je datum zaduženja iz prvog polugodišta 2015. godine
4608*/
4609
4610select year(datumZaduzivanja) as godina, count(datumZaduzivanja) as ukupanBrojPoGodinama
4611from nalog
4612where MONTH(datumZaduzivanja) < 7
4613group by year(datumZaduzivanja)
4614
4615--4
4616/*
46172011 2
46182012 49
46192013 72
46202014 51
4621*/
4622--5 bodova
4623
4624-----------------------------------------------------------------------------------------------
4625--4.
4626/*
4627Iz tabele nalog kreirati pogled view_razlika koji će se sastojati od polja:
4628 - razlika_stanja - razlika između naručene količine i količine na stanju
4629 - uk_broj_po_razlici - ukupan broj zapisa po vrijednosti razlike, npr. u tabeli se nalazi 5 zapisa kod kojih je razlika 10
4630uz uslov da je proizvod zadužen u 10. mjesecu bilo koje godine prije 2013.
4631Obavezno napisati naredbu za pregled sadržaja pogleda.
4632*/
4633
4634go
4635create view view_Razlika
4636as
4637select narucenaKolicina - stanjeKolicine as razlikaStanja, count(narucenaKolicina - stanjeKolicine) as UkupanBrojPoRazlici
4638from nalog
4639where MONTH(datumZaduzivanja) = 10 and year(datumZaduzivanja) < 2013
4640group by narucenaKolicina - stanjeKolicine
4641go
4642
4643
4644select *
4645from view_Razlika
4646
4647
4648--6
4649/*
46501 8
46512 7
46523 1
465310 1
465430 1
465532 1
4656*/
4657--12 bodova
4658
4659-----------------------------------------------------------------------------------------------
4660/*
46615. Koristeći tabelu proizvod kreirati proceduru proc_proizvod kojom će se definirati sljedeći ulazni parametri:
4662- proizvodID
4663- boja
4664- tezina
4665- dana_za_proiz
4666Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijetog parametra).
4667
4668Proceduru pokrenuti za sljedeće vrijednosti parametara:
46691. @boja = Black
46702. @dana_za_proiz = 1
4671
4672*/
4673go
4674create procedure proc_proizvod
4675(
4676 @proizvodID int = null,
4677 @boja nvarchar(15) = null,
4678 @tezina decimal(8,2) = null,
4679 @danaZaProizvodnju int = null
4680)
4681as
4682begin
4683select proizvodID, boja, tezina, danaZaProizvodnju
4684from proizvod
4685where (
4686 @proizvodID = proizvodID or
4687 @boja = boja or
4688 @tezina = tezina or
4689 @danaZaProizvodnju = danaZaProizvodnju
4690 )
4691end
4692go
4693
4694exec proc_proizvod @boja = 'Black'
4695exec proc_proizvod @danaZaProizvodnju = 1
4696
4697--89
4698--127
4699
4700--8 bodova
4701
4702
4703-----------------------------------------------------------------------------------------------
4704/*
47056. Kreirati pregled koji će sadržavati polja:
4706 - potkatID
4707 - suma_tez u kojem će se nalaziti suma težina
4708Uslov je da naziv proizvoda počinje slovima HL, da se ne preuzimaju zapisi u kojima se nalaze vrijednosti u kolonama boja i tezina, te da je proizvod zaduzen u 2011. ili 2012. godini.
4709*/
4710
4711select p.potkatID, sum(p.tezina) as sumaTezina
4712from proizvod as p inner join nalog as n
4713on p.proizvodID = n.proizvodID
4714where p.naziv like '%HL%' and p.boja is not null and p.tezina is not null and year(datumZaduzivanja) in (2011, 2012)
4715group by p.potkatID
4716
4717
4718
4719--10 bodova
4720--3
4721/*
472217 5270.00
472312 27.56
472414 6.52
4725*/
4726
4727-----------------------------------------------------------------------------------------------
4728/*
47297.
4730Kreirati pogled view_potkat_boja koji će se sastojati od polja:
4731 - potkatID
4732 - boja
4733 - uk_broj_po_oznaka_greske kojim će se prebrojati ukupan broj pojedinog naziva greške
4734Napisati naredbu za pregled sadržaja pogleda pri čemu će se izostaviti svi zapisi u kojima nije unijeta vrijednost za boju i uk_broj_po_oznaka_greske je neparan broj.
4735*/
4736go
4737create view view_potkatBoja
4738as
4739select p.potkatID, p.boja, count(oznakaGreske) as UkupanBrojGresaka
4740from nalog as n inner join proizvod as p
4741on n.proizvodID = p.proizvodID
4742group by p.potkatID, p.boja
4743go
4744
4745select *
4746from view_potkatBoja
4747where boja is not null and right(UkupanBrojGresaka, 1) in (0,2,4,6,8)
4748
4749--21
4750
4751--7
4752--10 bodova
4753
4754
4755-----------------------------------------------------------------------------------------------
4756/*
47578. Kreirati pregled koji će sadržavati polja:
4758- naziv potkategorije
4759- sr_vr_tez - srednja vrijednost težine zaokružena na 2 decimalna mjesta (treća i ostale decimale su 0)
4760pri čemu se ne prikazuju zapisi u kojima ne postoji srednja vrijednost.
4761*/
4762select potkatNaziv, round (avg(p.tezina), 2) as srednjaVrijednost
4763from TipProizvodnje as tp inner join proizvod as p
4764on tp.potkatID = p.potkatID
4765group by tp.potkatNaziv
4766having avg(p.tezina) is not null
4767
4768
4769--12
4770/*
4771Bottom Brackets 187.000000
4772Brakes 317.000000
4773Cranksets 603.330000
4774Derailleurs 151.500000
4775Mountain Bikes 25.060000
4776Mountain Frames 2.840000
4777Pedals 187.330000
4778Road Bikes 17.450000
4779Road Frames 2.310000
4780Touring Bikes 27.680000
4781Touring Frames 3.080000
4782Wheels 890.000000
4783*/
4784--10 bodova
4785
4786
4787-----------------------------------------------------------------------------------------------
4788/*
47899.
4790Kreirati pogled kojim će se dati prikaz ID naloga, ID proizvoda, broja godina razlike u odnosu na aktivnu godinu,
4791oznaku boje koju će predstavljati prvo slovo naziva (npr. Purple -> P), klase i naziva potkategorije.
4792Izraz za izračunavanje broja godina razlike treba biti općeg karaktera. Uslov je da naziv potkategorije sadrži riječ Bikes, te da boja nije crna. Obavezno napisati kod za pregled sadržaja pogleda.
4793*/
4794--a
4795go
4796create view view_zadatak9
4797as
4798select n.nalogID, p.proizvodID, datediff(year, n.datumZaduzivanja, getdate()) as GodinaRazlike, left(p.boja, 1) as OznakaBoje, p.klasa, tp.potkatNaziv
4799from nalog as n inner join proizvod as p
4800on n.proizvodID = p.proizvodID
4801inner join TipProizvodnje as tp
4802on p.potkatID = tp.potkatID
4803where tp.potkatNaziv like '%Bike%' and p.boja not like 'Black'
4804go
4805
4806select *
4807from view_zadatak9
4808
4809--59
4810--15 bodova
4811
4812
4813/*
4814Napomena:
4815A.
4816Prilikom bodovanja rješenja prioritet ima rezultat koji upit treba da vrati (broj zapisa, vrijednosti agregatnih funkcija...).
4817U sluèaju da rezultat upita nije taèan, a pogled, tabela... koji su rezultat tog upita se koriste u narednim zadacima,
4818tada se rješenja narednih zadataka, bez obzira na taènost koda, ne boduju punim brojem bodova,
4819jer ni ta rješenja ne mogu vratiti taèan rezultat (broj zapisa, vrijednosti agregatnih funkcija...).
4820B.
4821Tokom pisanja koda obratiti posebnu pažnju na tekst zadatka i ono što se traži zadatkom.
4822Prilikom pregleda rada pokreæe se kod koji se nalazi u sql skripti i
4823sve ono što nije uraðeno prema zahtjevima zadatka ili je pogrešno uraðeno predstavlja grešku.
4824*/
4825
4826------------------------------------------------
4827--1
4828/*
4829Kreirati bazu podataka pod vlastitim brojem indeksa.
4830*/
4831
4832create database IspitniZadatak4
4833go
4834use IspitniZadatak4
4835
4836
4837
4838/*Prilikom kreiranja tabela voditi raèuna o meðusobnom odnosu izmeðu tabela.
4839a) Kreirati tabelu radnik koja æe imati sljedeæu strukturu:
4840 - radnikID, cjelobrojna varijabla, primarni kljuè
4841 - drzavaID, 15 unicode karaktera
4842 - loginID, 256 unicode karaktera
4843 - sati_god_odmora, cjelobrojna varijabla
4844 - sati_bolovanja, cjelobrojna varijabla
4845*/
4846create table radnik
4847(
4848 radnikID int constraint PK_radnik primary key not null,
4849 drzavaID nvarchar (15),
4850 loginID nvarchar (256),
4851 satiGodisnjegOdmora int,
4852 satiBolovanja int
4853)
4854
4855/*
4856b) Kreirati tabelu nabavka koja æe imati sljedeæu strukturu:
4857 - nabavkaID, cjelobrojna varijabla, primarni kljuè
4858 - status, cjelobrojna varijabla
4859 - nabavaljacID, cjelobrojna varijabla
4860 - br_racuna, 15 unicode karaktera
4861 - naziv_nabavljaca, 50 unicode karaktera
4862 - kred_rejting, cjelobrojna varijabla
4863*/
4864create table nabavka
4865(
4866 nabavkaID int constraint PK_nabavka primary key not null,
4867 status int,
4868 nabavljacID int,
4869 brojRacuna nvarchar (15),
4870 nazivDobavljaca nvarchar (50),
4871 kreditniRejting int,
4872 constraint FK_radnikID foreign key (nabavljacID) references radnik(radnikID)
4873)
4874
4875/*
4876c) Kreirati tabelu prodaja koja æe imati sljedeæu strukturu:
4877 - prodavacID, cjelobrojna varijabla, primarni kljuè
4878 - prod_kvota, novèana varijabla
4879 - bonus, novèana varijabla
4880 - proslogod_prodaja, novèana varijabla
4881 - naziv_terit, 50 unicode karaktera
4882*/
4883--10 bodova
4884
4885create table prodaja
4886(
4887 prodavacID int constraint PK_prodaja primary key not null,
4888 prodKvota money,
4889 bonus money,
4890 proslogodisnjaProdaja money,
4891 nazivTeritorije nvarchar (50)
4892 constraint FK_prodaja foreign key (prodavacID) references radnik (radnikID)
4893)
4894
4895
4896
4897--------------------------------------------
4898--2. Import podataka
4899/*
4900a) Iz tabele HumanResources.Employee AdventureWorks2017 u tabelu radnik importovati podatke po sljedeæem pravilu:
4901 - BusinessEntityID -> radnikID
4902 - NationalIDNumber -> drzavaID
4903 - LoginID -> loginID
4904 - VacationHours -> sati_god_odmora
4905 - SickLeaveHours -> sati_bolovanja
4906*/
4907insert into radnik
4908select BusinessEntityID, NationalIDNumber, LoginID, VacationHours, SickLeaveHours
4909from AdventureWorks2014.HumanResources.Employee
4910
4911
4912
4913
4914/*
4915b) Iz tabela Purchasing.PurchaseOrderHeader i Purchasing.Vendor baze AdventureWorks2017 u tabelu nabavka importovati podatke po sljedeæem pravilu:
4916 - PurchaseOrderID -> nabavkaID
4917 - Status -> status
4918 - EmployeeID -> radnikID
4919 - AccountNumber -> br_racuna
4920 - Name -> naziv_nabavljaca
4921 - CreditRating -> kred_rejting
4922*/
4923
4924insert into nabavka
4925select poh.PurchaseOrderID, poh.Status, poh.EmployeeID, v.AccountNumber, v.Name, v.CreditRating
4926from AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh inner join AdventureWorks2014.Purchasing.Vendor as v
4927on poh.VendorID = v.BusinessEntityID
4928
4929select *
4930from nabavka
4931
4932
4933/*
4934c) Iz tabela Sales.SalesPerson i Sales.SalesTerritory baze AdventureWorks2017 u tabelu prodaja importovati podatke po sljedeæem pravilu:
4935 - BusinessEntityID -> prodavacID
4936 - SalesQuota -> prod_kvota
4937 - Bonus -> bonus
4938 - SalesLastYear iz Sales.SalesPerson -> proslogod_prodaja
4939 - Name -> naziv_terit
4940*/
4941
4942insert into prodaja
4943select sp.BusinessEntityID, sp.SalesQuota, sp.bonus, sp.SalesLastYear, st.name
4944from AdventureWorks2014.sales.SalesPerson as sp inner join AdventureWorks2014.Sales.SalesTerritory as st
4945on sp.TerritoryID = st.TerritoryID
4946
4947
4948select * from prodaja
4949select * from radnik
4950
4951--10 bodova
4952
4953------------------------------------------
4954/*
49553.
4956a) Iz tabela radnik i nabavka kreirati pogled view_drzavaID koji æe imati sljedeæu strukturu:
4957 - nabavkaID,
4958 - loginID,
4959 - status
4960 - naziv nabavljaèa,
4961 - kreditni rejting
4962Uslov je da u pogledu budu zapisi u kojima je kreditni rejting veæi od 1.
4963b) Koristeæi prethodno kreirani pogled prebrojati broj obavljenih nabavki prema kreditnom rejtingu.
4964Npr. kreditni rejting 8 se pojavljuje 20 puta. Pregled treba da sadrži oznaku kreditnog rejtinga i ukupan broj obavljenih nabavki.
4965*/
4966--10 bodova
4967
4968--a
4969go
4970create view viweDrzavaID
4971as
4972select n.nabavkaID, r.loginID, n.status, n.nazivDobavljaca, n.kredRejting
4973from nabavka as n inner join radnik as r
4974on n.nabavljacID = r.radnikID
4975where n.kredRejting > 1
4976
4977
4978select * from viweDrzavaID
4979
4980
4981--b
4982select count(kredRejting)
4983from viweDrzavaID
4984group by kredRejting
4985
4986-----------------------------------------------
4987/*
49884.
4989Kreirati proceduru koja æe imati istu strukturu kao pogled kreiran u prethodnom zadatku. Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti
4990bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti), uz uslov da je status veæi od 2. Pokrenuti proceduru za kreditni rejting 3 i 5.
4991*/
4992--10 bodova
4993
4994go
4995create procedure zadatak4
4996(
4997 @nabavkaID int = null,
4998 @loginID nvarchar (2) = null,
4999 @status int = null,
5000 @nazivDobavljaca nvarchar (50) = null,
5001 @kredRejting int = null
5002)
5003as
5004begin
5005 select n.nabavkaID, r.loginID, n.status, n.nazivDobavljaca, n.kredRejting
5006 from radnik as r inner join nabavka as n
5007 on r.radnikID = n.nabavkaID
5008 where (
5009 @nabavkaID = n.nabavkaID or
5010 @loginID = r.loginID or
5011 @status = n.status or
5012 @nazivDobavljaca = n.nazivDobavljaca or
5013 @kredRejting = n.kredRejting
5014 ) and n.status > 2
5015end
5016
5017exec zadatak4 @kredRejting = 3
5018exec zadatak4 @kredRejting = 5
5019
5020
5021-------------------------------------------
5022/*
50235.
5024a) Kreirati pogled nabavljaci_radnici koji æe se sastojati od kolona naziv dobavljaèa i prebrojani_broj radnika. prebrojani_broj je podatak kojim se prebrojava broj
5025radnika s kojima je dobavljaè poslovao. Obavezno napisati kod kojim æe se izvršiti pregled sadržaja pogleda sortiran po ukupnom broju.
5026b) Kreirati proceduru kojom æe se iz pogleda kreiranog pod a) preuzeti zapisi u kojima je prebrojani_broj manji od 50. Proceduru kreirati tako da je prilikom izvršavanja
5027moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Pokrenuti proceduru za vrijednosti prebrojani_broj = 1 i 2.
5028*/
5029--15 bodova
5030
5031--a
5032go
5033create view viewNabavljaciRadnici
5034as
5035select n.nazivDobavljaca, count (r.radnikID) as prebrojaniBrojRadnika
5036from radnik as r inner join nabavka as n
5037on r.radnikID = n.nabavkaID
5038group by n.nazivDobavljaca
5039
5040select *
5041from viewNabavljaciRadnici
5042order by prebrojaniBrojRadnika
5043
5044--b
5045
5046create procedure zadatak5
5047(
5048 @nazivDobavljaca nvarchar (50) = null,
5049 @prebrojaniBrojRadnika int = null
5050)
5051as
5052begin
5053 select *
5054 from viewNabavljaciRadnici
5055 where (
5056 @nazivDobavljaca = nazivDobavljaca or
5057 @prebrojaniBrojRadnika = prebrojaniBrojRadnika)
5058 and prebrojaniBrojRadnika < 50
5059end
5060exec zadatak5 @prebrojaniBrojRadnika = 1
5061exec zadatak5 @prebrojaniBrojRadnika = 2
5062
5063exec zad5b @prebrojani_broj = 1
5064exec zad5b @prebrojani_broj = 2
5065
5066
5067--------------------------------------------
5068/*
50696.
5070a) U tabeli radnik dodati kolonu razlika_sati kao cjelobrojnu varijablu sa obaveznom default vrijednošæu 0.
5071b) U koloni razlika_sati ostaviti 0 ako su sati bolovanja veæi od godišnjeg odmora, inaèe u kolonu smjestiti vrijednost razlike izmeðu sato_bolovanja i sati_god_odmora.
5072c) Kreirati pogled view_sati u kojem æe biti poruka da li radnik ima više sati godišnjeg odmora ili bolovanja.
5073Ako je više bolovanja daje se poruka "bolovanje", inaèe "godisnji". Pogled treba da sadrži ID radnika i poruku.
5074*/
5075--10 bodova
5076
5077--a
5078alter table radnik
5079add razlikaSati int default(0)
5080
5081--b
5082update radnik
5083set razlikaSati =
5084 case
5085 when satiBolovanja > satiGodOdmora then 0
5086 when satiBolovanja <= satiGodOdmora then satiBolovanja - satiGodOdmora
5087 end
5088
5089select * from radnik
5090
5091--c
5092create view viewSati
5093as
5094select radnikID, 'bolovanje' bolovanjeGodisnji
5095from radnik
5096where satiBolovanja > satiGodOdmora
5097union
5098select radnikID, 'godisnji' bolovanjeGodisnji
5099from radnik
5100where satiBolovanja < satiGodOdmora
5101
5102select * from viewSati
5103
5104-----------------------------------------------
5105/*
51067.
5107Koristeæi tabelu prodaja kreirati pogled view_prodaja sljedeæe strukture:
5108 - prodavacID
5109 - naziv_terit
5110 - razlika prošlogodišnje prodaje i srednje vrijednosti prošlogodišnje prodaje.
5111Uslov je da se dohvate zapisi u kojima je bonus bar za 1000 veæi od minimalne vrijednosti bonusa
5112*/
5113--10 bodova
5114create view viewProdaja
5115as
5116select prodavacID, nazivTeritorije, proslogodProdaja - (select avg (proslogodProdaja) from prodaja) as razlika
5117from prodaja
5118where (bonus - 1000) > (select min(bonus) from prodaja)
5119
5120select * from viewProdaja
5121
5122------------------------------------------
5123/*
51248.
5125U koloni drzavaID tabele radnik izvršiti promjenu svih vrijednosti u kojima je broj cifara neparan broj. Promjenu izvršiti tako što æe se u umjesto postojeæih
5126vrijednosti unijeti sluèajno generisani niz znakova.
5127*/
5128--10 bodova
5129update radnik
5130set drzavaID = cast (left(newid(), 15) as nvarchar)
5131where len(drzavaID)%2 != 0
5132
5133select drzavaID
5134from radnik
5135
5136---------------------------------------
5137/*
51389.
5139Iz tabela nabavka i radnik kreirati pogled view_sifra_transakc koja æe se sastojati od sljedeæih kolona:
5140 - naziv dobavljaèa,
5141 - sifra_transakc
5142Podaci u koloni sifra_transakc æe se formirati spajanjem karaktera imena iz kolone loginID tabele radnik (ime je npr. ken, NE ken0) i rijeèi iz kolone
5143br_racuna (npr. u LITWARE0001 rijeè je LITWARE) tabele nabavka, izmeðu kojih je potrebno umetnuti donju crtu (_).
5144Uslov je da se ne dohvataju duplikati (prikaz jedinstvenih vrijednosti) u koloni sifre_transaks.
5145Obavezno napisati kod za pregled sadržaja pogleda.
5146*/
5147--13 bodova
5148create view viewSifraTransakcije
5149as
5150select distinct n.nazivDobavljaca, SUBSTRING(loginID, CHARINDEX ('\', loginID) + 1, len (substring(loginID, charindex ('\', loginID) + 1, len(loginID)) ) - 1) + '_' +
5151 left(n.brRacuna, charindex ('0', brRacuna) - 1) as sifraTransakcije
5152from radnik as r inner join nabavka as n
5153on r.radnikID =n.nabavkaID
5154
5155select loginID
5156from radnik
5157
5158-----------------------------------------------
5159--10.
5160/*
5161Kreirati backup baze na default lokaciju, obrisati bazu, a zatim izvršiti restore baze.
5162Uslov prihvatanja koda je da se može izvršiti.
5163*/
5164
5165BACKUP DATABASE BP2_2020_09_11
5166TO DISK = 'BP2_2020_09_11.bak'
5167GO
5168
5169USE master
5170DROP DATABASE BP2_2020_09_11
5171
5172RESTORE DATABASE BP2_2020_09_11 FROM DISK = 'BP2_2020_09_11.bak'
5173USE BP2_2020_09_11
5174
5175--2 boda
5176
5177
5178/*
5179Napomena:
5180A.
5181Prilikom bodovanja rješenja prioritet ima rezultat koji upit treba da vrati (broj zapisa, vrijednosti agregatnih funkcija...).
5182U sluèaju da rezultat upita nije taèan, a pogled, tabela... koji su rezultat tog upita se koriste u narednim zadacima,
5183tada se rješenja narednih zadataka, bez obzira na taènost koda, ne boduju punim brojem bodova,
5184jer ni ta rješenja ne mogu vratiti taèan rezultat (broj zapisa, vrijednosti agregatnih funkcija...).
5185B.
5186Tokom pisanja koda obratiti posebnu pažnju na tekst zadatka i ono što se traži zadatkom.
5187Prilikom pregleda rada pokreæe se kod koji se nalazi u sql skripti i
5188sve ono što nije uraðeno prema zahtjevima zadatka ili je pogrešno uraðeno predstavlja grešku.
5189*/
5190
5191------------------------------------------------
5192--1
5193/*
5194Kreirati bazu podataka pod vlastitim brojem indeksa.
5195*/
5196
5197create database IspitniZadatak3
5198go
5199use IspitniZadatak3
5200
5201
5202
5203/*Prilikom kreiranja tabela voditi raèuna o meðusobnom odnosu izmeðu tabela.
5204a) Kreirati tabelu radnik koja æe imati sljedeæu strukturu:
5205 - radnikID, cjelobrojna varijabla, primarni kljuè
5206 - drzavaID, 15 unicode karaktera
5207 - loginID, 256 unicode karaktera
5208 - sati_god_odmora, cjelobrojna varijabla
5209 - sati_bolovanja, cjelobrojna varijabla
5210*/
5211create table radnik
5212(
5213 radnikID int constraint PK_radnik primary key not null,
5214 drzavaID nvarchar (15),
5215 loginID nvarchar (256),
5216 satiGodisnjegOdmora int,
5217 satiBolovanja int
5218)
5219
5220
5221/*
5222b) Kreirati tabelu nabavka koja æe imati sljedeæu strukturu:
5223 - nabavkaID, cjelobrojna varijabla, primarni kljuè
5224 - status, cjelobrojna varijabla
5225 - nabavaljacID, cjelobrojna varijabla
5226 - br_racuna, 15 unicode karaktera
5227 - naziv_nabavljaca, 50 unicode karaktera
5228 - kred_rejting, cjelobrojna varijabla
5229*/
5230create table nabavka
5231(
5232 nabavkaID int constraint PK_nabavka primary key not null,
5233 status int,
5234 nabavljacID int,
5235 brojRacuna nvarchar (15),
5236 nazivDobavljaca nvarchar (50),
5237 kreditniRejting int,
5238 constraint FK_radnik foreign key (nabavljacID) references radnik (radnikID)
5239)
5240
5241
5242
5243drop table nabavka
5244/*
5245c) Kreirati tabelu prodaja koja æe imati sljedeæu strukturu:
5246 - prodavacID, cjelobrojna varijabla, primarni kljuè
5247 - prod_kvota, novèana varijabla
5248 - bonus, novèana varijabla
5249 - proslogod_prodaja, novèana varijabla
5250 - naziv_terit, 50 unicode karaktera
5251*/
5252--10 bodova
5253create table prodaja
5254(
5255 prodavacID int constraint PK_prodaja primary key not null,
5256 prodKvota money,
5257 bonus money,
5258 proslogodisnjaProdaja money,
5259 nazivteritorije nvarchar (50)
5260 constraint FK_prodajaRadnik foreign key (prodavacID) references radnik (radnikID)
5261)
5262
5263drop table prodaja
5264--------------------------------------------
5265--2. Import podataka
5266/*
5267a) Iz tabele HumanResources.Employee AdventureWorks2017 u tabelu radnik importovati podatke po sljedeæem pravilu:
5268 - BusinessEntityID -> radnikID
5269 - NationalIDNumber -> drzavaID
5270 - LoginID -> loginID
5271 - VacationHours -> sati_god_odmora
5272 - SickLeaveHours -> sati_bolovanja
5273*/
5274insert into radnik
5275select BusinessEntityID, NationalIDNumber, LoginID, VacationHours, SickLeaveHours
5276from AdventureWorks2014.HumanResources.Employee
5277
5278
5279
5280
5281/*
5282b) Iz tabela Purchasing.PurchaseOrderHeader i Purchasing.Vendor baze AdventureWorks2017 u tabelu nabavka importovati podatke po sljedeæem pravilu:
5283 - PurchaseOrderID -> nabavkaID
5284 - Status -> status
5285 - EmployeeID -> radnikID
5286 - AccountNumber -> br_racuna
5287 - Name -> naziv_nabavljaca
5288 - CreditRating -> kred_rejting
5289*/
5290
5291insert into nabavka
5292select poh.PurchaseOrderID, poh.Status, poh.EmployeeID, v.AccountNumber, v.Name, v.CreditRating
5293from AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh inner join AdventureWorks2014.Purchasing.Vendor as v
5294on poh.VendorID = v.BusinessEntityID
5295
5296select *
5297from nabavka
5298
5299
5300/*
5301c) Iz tabela Sales.SalesPerson i Sales.SalesTerritory baze AdventureWorks2017 u tabelu prodaja importovati podatke po sljedeæem pravilu:
5302 - BusinessEntityID -> prodavacID
5303 - SalesQuota -> prod_kvota
5304 - Bonus -> bonus
5305 - SalesLastYear iz Sales.SalesPerson -> proslogod_prodaja
5306 - Name -> naziv_terit
5307*/
5308
5309insert into prodaja
5310select
5311from ad
5312
5313insert into prodaja
5314select sp.BusinessEntityID, sp.SalesQuota, sp.bonus, sp.SalesLastYear, st.name
5315from AdventureWorks2014.sales.SalesPerson as sp inner join AdventureWorks2014.Sales.SalesTerritory as st
5316on sp.TerritoryID = st.TerritoryID
5317
5318
5319select * from prodaja
5320select * from radnik
5321
5322--10 bodova
5323
5324------------------------------------------
5325/*
53263.
5327a) Iz tabela radnik i nabavka kreirati pogled view_drzavaID koji æe imati sljedeæu strukturu:
5328 - nabavkaID,
5329 - loginID,
5330 - status
5331 - naziv nabavljaèa,
5332 - kreditni rejting
5333Uslov je da u pogledu budu zapisi u kojima je kreditni rejting veæi od 1.
5334b) Koristeæi prethodno kreirani pogled prebrojati broj obavljenih nabavki prema kreditnom rejtingu.
5335Npr. kreditni rejting 8 se pojavljuje 20 puta. Pregled treba da sadrži oznaku kreditnog rejtinga i ukupan broj obavljenih nabavki.
5336*/
5337--10 bodova
5338
5339--a
5340go
5341create view viweDrzavaID
5342as
5343select n.nabavkaID, r.loginID, n.status, n.nazivDobavljaca, n.kredRejting
5344from nabavka as n inner join radnik as r
5345on n.nabavljacID = r.radnikID
5346where n.kredRejting > 1
5347
5348
5349select * from viweDrzavaID
5350
5351
5352--b
5353select count(kredRejting)
5354from viweDrzavaID
5355group by kredRejting
5356
5357-----------------------------------------------
5358/*
53594.
5360Kreirati proceduru koja æe imati istu strukturu kao pogled kreiran u prethodnom zadatku. Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti
5361bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti), uz uslov da je status veæi od 2. Pokrenuti proceduru za kreditni rejting 3 i 5.
5362*/
5363--10 bodova
5364
5365go
5366create procedure zadatak4
5367(
5368 @nabavkaID int = null,
5369 @loginID nvarchar (2) = null,
5370 @status int = null,
5371 @nazivDobavljaca nvarchar (50) = null,
5372 @kredRejting int = null
5373)
5374as
5375begin
5376 select n.nabavkaID, r.loginID, n.status, n.nazivDobavljaca, n.kredRejting
5377 from radnik as r inner join nabavka as n
5378 on r.radnikID = n.nabavkaID
5379 where (
5380 @nabavkaID = n.nabavkaID or
5381 @loginID = r.loginID or
5382 @status = n.status or
5383 @nazivDobavljaca = n.nazivDobavljaca or
5384 @kredRejting = n.kredRejting
5385 ) and n.status > 2
5386end
5387
5388exec zadatak4 @kredRejting = 3
5389exec zadatak4 @kredRejting = 5
5390
5391
5392-------------------------------------------
5393/*
53945.
5395a) Kreirati pogled nabavljaci_radnici koji æe se sastojati od kolona naziv dobavljaèa i prebrojani_broj radnika. prebrojani_broj je podatak kojim se prebrojava broj
5396radnika s kojima je dobavljaè poslovao. Obavezno napisati kod kojim æe se izvršiti pregled sadržaja pogleda sortiran po ukupnom broju.
5397b) Kreirati proceduru kojom æe se iz pogleda kreiranog pod a) preuzeti zapisi u kojima je prebrojani_broj manji od 50. Proceduru kreirati tako da je prilikom izvršavanja
5398moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Pokrenuti proceduru za vrijednosti prebrojani_broj = 1 i 2.
5399*/
5400--15 bodova
5401
5402--a
5403go
5404create view viewNabavljaciRadnici
5405as
5406select n.nazivDobavljaca, count (r.radnikID) as prebrojaniBrojRadnika
5407from radnik as r inner join nabavka as n
5408on r.radnikID = n.nabavkaID
5409group by n.nazivDobavljaca
5410
5411select *
5412from viewNabavljaciRadnici
5413order by prebrojaniBrojRadnika
5414
5415--b
5416
5417create procedure zadatak5
5418(
5419 @nazivDobavljaca nvarchar (50) = null,
5420 @prebrojaniBrojRadnika int = null
5421)
5422as
5423begin
5424 select *
5425 from viewNabavljaciRadnici
5426 where (
5427 @nazivDobavljaca = nazivDobavljaca or
5428 @prebrojaniBrojRadnika = prebrojaniBrojRadnika)
5429 and prebrojaniBrojRadnika < 50
5430end
5431exec zadatak5 @prebrojaniBrojRadnika = 1
5432exec zadatak5 @prebrojaniBrojRadnika = 2
5433
5434exec zad5b @prebrojani_broj = 1
5435exec zad5b @prebrojani_broj = 2
5436
5437
5438--------------------------------------------
5439/*
54406.
5441a) U tabeli radnik dodati kolonu razlika_sati kao cjelobrojnu varijablu sa obaveznom default vrijednošæu 0.
5442b) U koloni razlika_sati ostaviti 0 ako su sati bolovanja veæi od godišnjeg odmora, inaèe u kolonu smjestiti vrijednost razlike izmeðu sato_bolovanja i sati_god_odmora.
5443c) Kreirati pogled view_sati u kojem æe biti poruka da li radnik ima više sati godišnjeg odmora ili bolovanja.
5444Ako je više bolovanja daje se poruka "bolovanje", inaèe "godisnji". Pogled treba da sadrži ID radnika i poruku.
5445*/
5446--10 bodova
5447
5448--a
5449alter table radnik
5450add razlikaSati int default(0)
5451
5452--b
5453update radnik
5454set razlikaSati =
5455 case
5456 when satiBolovanja > satiGodOdmora then 0
5457 when satiBolovanja <= satiGodOdmora then satiBolovanja - satiGodOdmora
5458 end
5459
5460select * from radnik
5461
5462--c
5463create view viewSati
5464as
5465select radnikID, 'bolovanje' bolovanjeGodisnji
5466from radnik
5467where satiBolovanja > satiGodOdmora
5468union
5469select radnikID, 'godisnji' bolovanjeGodisnji
5470from radnik
5471where satiBolovanja < satiGodOdmora
5472
5473select * from viewSati
5474
5475-----------------------------------------------
5476/*
54777.
5478Koristeæi tabelu prodaja kreirati pogled view_prodaja sljedeæe strukture:
5479 - prodavacID
5480 - naziv_terit
5481 - razlika prošlogodišnje prodaje i srednje vrijednosti prošlogodišnje prodaje.
5482Uslov je da se dohvate zapisi u kojima je bonus bar za 1000 veæi od minimalne vrijednosti bonusa
5483*/
5484--10 bodova
5485create view viewProdaja
5486as
5487select prodavacID, nazivTeritorije, proslogodProdaja - (select avg (proslogodProdaja) from prodaja) as razlika
5488from prodaja
5489where (bonus - 1000) > (select min(bonus) from prodaja)
5490
5491select * from viewProdaja
5492
5493------------------------------------------
5494/*
54958.
5496U koloni drzavaID tabele radnik izvršiti promjenu svih vrijednosti u kojima je broj cifara neparan broj. Promjenu izvršiti tako što æe se u umjesto postojeæih
5497vrijednosti unijeti sluèajno generisani niz znakova.
5498*/
5499--10 bodova
5500update radnik
5501set drzavaID = cast (left(newid(), 15) as nvarchar)
5502where len(drzavaID)%2 != 0
5503
5504select drzavaID
5505from radnik
5506
5507---------------------------------------
5508/*
55099.
5510Iz tabela nabavka i radnik kreirati pogled view_sifra_transakc koja æe se sastojati od sljedeæih kolona:
5511 - naziv dobavljaèa,
5512 - sifra_transakc
5513Podaci u koloni sifra_transakc æe se formirati spajanjem karaktera imena iz kolone loginID tabele radnik (ime je npr. ken, NE ken0) i rijeèi iz kolone
5514br_racuna (npr. u LITWARE0001 rijeè je LITWARE) tabele nabavka, izmeðu kojih je potrebno umetnuti donju crtu (_).
5515Uslov je da se ne dohvataju duplikati (prikaz jedinstvenih vrijednosti) u koloni sifre_transaks.
5516Obavezno napisati kod za pregled sadržaja pogleda.
5517*/
5518--13 bodova
5519create view viewSifraTransakcije
5520as
5521select distinct n.nazivDobavljaca, SUBSTRING(loginID, CHARINDEX ('\', loginID) + 1, len (substring(loginID, charindex ('\', loginID) + 1, len(loginID)) ) - 1) + '_' +
5522 left(n.brRacuna, charindex ('0', brRacuna) - 1) as sifraTransakcije
5523from radnik as r inner join nabavka as n
5524on r.radnikID =n.nabavkaID
5525
5526select loginID
5527from radnik
5528
5529-----------------------------------------------
5530--10.
5531/*
5532Kreirati backup baze na default lokaciju, obrisati bazu, a zatim izvršiti restore baze.
5533Uslov prihvatanja koda je da se može izvršiti.
5534*/
5535
5536BACKUP DATABASE BP2_2020_09_11
5537TO DISK = 'BP2_2020_09_11.bak'
5538GO
5539
5540USE master
5541DROP DATABASE BP2_2020_09_11
5542
5543RESTORE DATABASE BP2_2020_09_11 FROM DISK = 'BP2_2020_09_11.bak'
5544USE BP2_2020_09_11
5545
5546--2 boda
5547
5548
5549
5550/*
5551Napomena:
5552A.
5553Prilikom bodovanja rješenja prioritet ima rezultat koji upit treba da vrati (broj zapisa, vrijednosti agregatnih funkcija...).
5554U sluèaju da rezultat upita nije taèan, a pogled, tabela... koji su rezultat tog upita se koriste u narednim zadacima,
5555tada se rješenja narednih zadataka, bez obzira na taènost koda, ne boduju punim brojem bodova,
5556jer ni ta rješenja ne mogu vratiti taèan rezultat (broj zapisa, vrijednosti agregatnih funkcija...).
5557B.
5558Tokom pisanja koda obratiti posebnu pažnju na tekst zadatka i ono što se traži zadatkom.
5559Prilikom pregleda rada pokreæe se kod koji se nalazi u sql skripti i
5560sve ono što nije uraðeno prema zahtjevima zadatka ili je pogrešno uraðeno predstavlja grešku.
5561*/
5562
5563------------------------------------------------
5564--1
5565/*
5566Kreirati bazu podataka pod vlastitim brojem indeksa.
5567*/
5568
5569create database FIT_ispitniZadatak5
5570go
5571
5572use FIT_ispitniZadatak5
5573go
5574
5575
5576/*Prilikom kreiranja tabela voditi raèuna o meðusobnom odnosu izmeðu tabela.
5577a) Kreirati tabelu radnik koja æe imati sljedeæu strukturu:
5578 - radnikID, cjelobrojna varijabla, primarni kljuè
5579 - drzavaID, 15 unicode karaktera
5580 - loginID, 256 unicode karaktera
5581 - sati_god_odmora, cjelobrojna varijabla
5582 - sati_bolovanja, cjelobrojna varijabla
5583*/
5584
5585create table radnik
5586(
5587 radnikID int constraint PK_radnik primary key not null,
5588 drzavaID nvarchar (15),
5589 loginID nvarchar(256),
5590 satiGodOdmora int,
5591 satiBolovanja int
5592)
5593
5594
5595/*
5596b) Kreirati tabelu nabavka koja æe imati sljedeæu strukturu:
5597 - nabavkaID, cjelobrojna varijabla, primarni kljuè
5598 - status, cjelobrojna varijabla
5599 - nabavaljacID, cjelobrojna varijabla
5600 - br_racuna, 15 unicode karaktera
5601 - naziv_nabavljaca, 50 unicode karaktera
5602 - kred_rejting, cjelobrojna varijabla
5603*/
5604create table nabavka
5605(
5606 nabavkaID int constraint PK_nabavka primary key not null,
5607 status int,
5608 nabavljacID int,
5609 brRacuna nvarchar (15),
5610 nazivDobavljaca nvarchar (50),
5611 kredRejting int
5612 constraint FK_radnikID foreign key (nabavljacID) references radnik(radnikID)
5613)
5614
5615drop table nabavka
5616/*
5617c) Kreirati tabelu prodaja koja æe imati sljedeæu strukturu:
5618 - prodavacID, cjelobrojna varijabla, primarni kljuè
5619 - prod_kvota, novèana varijabla
5620 - bonus, novèana varijabla
5621 - proslogod_prodaja, novèana varijabla
5622 - naziv_terit, 50 unicode karaktera
5623*/
5624--10 bodova
5625create table prodaja
5626(
5627 prodavacID int constraint PK_prodaja primary key not null,
5628 prodKvota money,
5629 bonus money,
5630 proslogodProdaja money,
5631 nazivTeritorije nvarchar(50)
5632 constraint FK_prodaja foreign key (prodavacID) references radnik (radnikID)
5633)
5634
5635
5636drop table prodaja
5637--------------------------------------------
5638--2. Import podataka
5639/*
5640a) Iz tabele HumanResources.Employee AdventureWorks2017 u tabelu radnik importovati podatke po sljedeæem pravilu:
5641 - BusinessEntityID -> radnikID
5642 - NationalIDNumber -> drzavaID
5643 - LoginID -> loginID
5644 - VacationHours -> sati_god_odmora
5645 - SickLeaveHours -> sati_bolovanja
5646*/
5647insert into radnik
5648select BusinessEntityID, NationalIDNumber, LoginID, VacationHours, SickLeaveHours
5649from AdventureWorks2014.HumanResources.Employee
5650
5651/*
5652b) Iz tabela Purchasing.PurchaseOrderHeader i Purchasing.Vendor baze AdventureWorks2017 u tabelu nabavka importovati podatke po sljedeæem pravilu:
5653 - PurchaseOrderID -> nabavkaID
5654 - Status -> status
5655 - EmployeeID -> radnikID
5656 - AccountNumber -> br_racuna
5657 - Name -> naziv_nabavljaca
5658 - CreditRating -> kred_rejting
5659*/
5660
5661insert into nabavka
5662select poh.PurchaseOrderID, poh.Status, poh.EmployeeID, v.AccountNumber, v.Name, v.CreditRating
5663from AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh inner join AdventureWorks2014.Purchasing.Vendor as v
5664on poh.VendorID = v.BusinessEntityID
5665
5666select *
5667from nabavka
5668
5669
5670/*
5671c) Iz tabela Sales.SalesPerson i Sales.SalesTerritory baze AdventureWorks2017 u tabelu prodaja importovati podatke po sljedeæem pravilu:
5672 - BusinessEntityID -> prodavacID
5673 - SalesQuota -> prod_kvota
5674 - Bonus -> bonus
5675 - SalesLastYear iz Sales.SalesPerson -> proslogod_prodaja
5676 - Name -> naziv_terit
5677*/
5678
5679insert into prodaja
5680select sp.BusinessEntityID, sp.SalesQuota, sp.bonus, sp.SalesLastYear, st.name
5681from AdventureWorks2014.sales.SalesPerson as sp inner join AdventureWorks2014.Sales.SalesTerritory as st
5682on sp.TerritoryID = st.TerritoryID
5683
5684
5685select * from prodaja
5686select * from radnik
5687
5688--10 bodova
5689
5690------------------------------------------
5691/*
56923.
5693a) Iz tabela radnik i nabavka kreirati pogled view_drzavaID koji æe imati sljedeæu strukturu:
5694 - nabavkaID,
5695 - loginID,
5696 - status
5697 - naziv nabavljaèa,
5698 - kreditni rejting
5699Uslov je da u pogledu budu zapisi u kojima je kreditni rejting veæi od 1.
5700b) Koristeæi prethodno kreirani pogled prebrojati broj obavljenih nabavki prema kreditnom rejtingu.
5701Npr. kreditni rejting 8 se pojavljuje 20 puta. Pregled treba da sadrži oznaku kreditnog rejtinga i ukupan broj obavljenih nabavki.
5702*/
5703--10 bodova
5704
5705--a
5706go
5707create view viweDrzavaID
5708as
5709select n.nabavkaID, r.loginID, n.status, n.nazivDobavljaca, n.kredRejting
5710from nabavka as n inner join radnik as r
5711on n.nabavljacID = r.radnikID
5712where n.kredRejting > 1
5713
5714
5715select * from viweDrzavaID
5716
5717
5718--b
5719select count(kredRejting)
5720from viweDrzavaID
5721group by kredRejting
5722
5723-----------------------------------------------
5724/*
57254.
5726Kreirati proceduru koja æe imati istu strukturu kao pogled kreiran u prethodnom zadatku. Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti
5727bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti), uz uslov da je status veæi od 2. Pokrenuti proceduru za kreditni rejting 3 i 5.
5728*/
5729--10 bodova
5730
5731go
5732create procedure zadatak4
5733(
5734 @nabavkaID int = null,
5735 @loginID nvarchar (2) = null,
5736 @status int = null,
5737 @nazivDobavljaca nvarchar (50) = null,
5738 @kredRejting int = null
5739)
5740as
5741begin
5742 select n.nabavkaID, r.loginID, n.status, n.nazivDobavljaca, n.kredRejting
5743 from radnik as r inner join nabavka as n
5744 on r.radnikID = n.nabavkaID
5745 where (
5746 @nabavkaID = n.nabavkaID or
5747 @loginID = r.loginID or
5748 @status = n.status or
5749 @nazivDobavljaca = n.nazivDobavljaca or
5750 @kredRejting = n.kredRejting
5751 ) and n.status > 2
5752end
5753
5754exec zadatak4 @kredRejting = 3
5755exec zadatak4 @kredRejting = 5
5756
5757
5758-------------------------------------------
5759/*
57605.
5761a) Kreirati pogled nabavljaci_radnici koji æe se sastojati od kolona naziv dobavljaèa i prebrojani_broj radnika. prebrojani_broj je podatak kojim se prebrojava broj
5762radnika s kojima je dobavljaè poslovao. Obavezno napisati kod kojim æe se izvršiti pregled sadržaja pogleda sortiran po ukupnom broju.
5763b) Kreirati proceduru kojom æe se iz pogleda kreiranog pod a) preuzeti zapisi u kojima je prebrojani_broj manji od 50. Proceduru kreirati tako da je prilikom izvršavanja
5764moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Pokrenuti proceduru za vrijednosti prebrojani_broj = 1 i 2.
5765*/
5766--15 bodova
5767
5768--a
5769go
5770create view viewNabavljaciRadnici
5771as
5772select n.nazivDobavljaca, count (r.radnikID) as prebrojaniBrojRadnika
5773from radnik as r inner join nabavka as n
5774on r.radnikID = n.nabavkaID
5775group by n.nazivDobavljaca
5776
5777select *
5778from viewNabavljaciRadnici
5779order by prebrojaniBrojRadnika
5780
5781--b
5782
5783create procedure zadatak5
5784(
5785 @nazivDobavljaca nvarchar (50) = null,
5786 @prebrojaniBrojRadnika int = null
5787)
5788as
5789begin
5790 select *
5791 from viewNabavljaciRadnici
5792 where (
5793 @nazivDobavljaca = nazivDobavljaca or
5794 @prebrojaniBrojRadnika = prebrojaniBrojRadnika)
5795 and prebrojaniBrojRadnika < 50
5796end
5797exec zadatak5 @prebrojaniBrojRadnika = 1
5798exec zadatak5 @prebrojaniBrojRadnika = 2
5799
5800exec zad5b @prebrojani_broj = 1
5801exec zad5b @prebrojani_broj = 2
5802
5803
5804--------------------------------------------
5805/*
58066.
5807a) U tabeli radnik dodati kolonu razlika_sati kao cjelobrojnu varijablu sa obaveznom default vrijednošæu 0.
5808b) U koloni razlika_sati ostaviti 0 ako su sati bolovanja veæi od godišnjeg odmora, inaèe u kolonu smjestiti vrijednost razlike izmeðu sato_bolovanja i sati_god_odmora.
5809c) Kreirati pogled view_sati u kojem æe biti poruka da li radnik ima više sati godišnjeg odmora ili bolovanja.
5810Ako je više bolovanja daje se poruka "bolovanje", inaèe "godisnji". Pogled treba da sadrži ID radnika i poruku.
5811*/
5812--10 bodova
5813
5814--a
5815alter table radnik
5816add razlikaSati int default(0)
5817
5818--b
5819update radnik
5820set razlikaSati =
5821 case
5822 when satiBolovanja > satiGodOdmora then 0
5823 when satiBolovanja <= satiGodOdmora then satiBolovanja - satiGodOdmora
5824 end
5825
5826select * from radnik
5827
5828--c
5829create view viewSati
5830as
5831select radnikID, 'bolovanje' bolovanjeGodisnji
5832from radnik
5833where satiBolovanja > satiGodOdmora
5834union
5835select radnikID, 'godisnji' bolovanjeGodisnji
5836from radnik
5837where satiBolovanja < satiGodOdmora
5838
5839select * from viewSati
5840
5841-----------------------------------------------
5842/*
58437.
5844Koristeæi tabelu prodaja kreirati pogled view_prodaja sljedeæe strukture:
5845 - prodavacID
5846 - naziv_terit
5847 - razlika prošlogodišnje prodaje i srednje vrijednosti prošlogodišnje prodaje.
5848Uslov je da se dohvate zapisi u kojima je bonus bar za 1000 veæi od minimalne vrijednosti bonusa
5849*/
5850--10 bodova
5851create view viewProdaja
5852as
5853select prodavacID, nazivTeritorije, proslogodProdaja - (select avg (proslogodProdaja) from prodaja) as razlika
5854from prodaja
5855where (bonus - 1000) > (select min(bonus) from prodaja)
5856
5857select * from viewProdaja
5858
5859------------------------------------------
5860/*
58618.
5862U koloni drzavaID tabele radnik izvršiti promjenu svih vrijednosti u kojima je broj cifara neparan broj. Promjenu izvršiti tako što æe se u umjesto postojeæih
5863vrijednosti unijeti sluèajno generisani niz znakova.
5864*/
5865--10 bodova
5866update radnik
5867set drzavaID = cast (left(newid(), 15) as nvarchar)
5868where len(drzavaID)%2 != 0
5869
5870select drzavaID
5871from radnik
5872
5873---------------------------------------
5874/*
58759.
5876Iz tabela nabavka i radnik kreirati pogled view_sifra_transakc koja æe se sastojati od sljedeæih kolona:
5877 - naziv dobavljaèa,
5878 - sifra_transakc
5879Podaci u koloni sifra_transakc æe se formirati spajanjem karaktera imena iz kolone loginID tabele radnik (ime je npr. ken, NE ken0) i rijeèi iz kolone
5880br_racuna (npr. u LITWARE0001 rijeè je LITWARE) tabele nabavka, izmeðu kojih je potrebno umetnuti donju crtu (_).
5881Uslov je da se ne dohvataju duplikati (prikaz jedinstvenih vrijednosti) u koloni sifre_transaks.
5882Obavezno napisati kod za pregled sadržaja pogleda.
5883*/
5884--13 bodova
5885create view viewSifraTransakcije
5886as
5887select distinct n.nazivDobavljaca, SUBSTRING(loginID, CHARINDEX ('\', loginID) + 1, len (substring(loginID, charindex ('\', loginID) + 1, len(loginID)) ) - 1) + '_' +
5888 left(n.brRacuna, charindex ('0', brRacuna) - 1) as sifraTransakcije
5889from radnik as r inner join nabavka as n
5890on r.radnikID =n.nabavkaID
5891
5892select loginID
5893from radnik
5894
5895-----------------------------------------------
5896--10.
5897/*
5898Kreirati backup baze na default lokaciju, obrisati bazu, a zatim izvršiti restore baze.
5899Uslov prihvatanja koda je da se može izvršiti.
5900*/
5901
5902BACKUP DATABASE BP2_2020_09_11
5903TO DISK = 'BP2_2020_09_11.bak'
5904GO
5905
5906USE master
5907DROP DATABASE BP2_2020_09_11
5908
5909RESTORE DATABASE BP2_2020_09_11 FROM DISK = 'BP2_2020_09_11.bak'
5910USE BP2_2020_09_11
5911
5912--2 boda
5913
5914
5915
5916-------------------------------------------------------------
5917/*
5918Napomena:
5919A.
5920Prilikom bodovanja rješenja prioritet ima rezultat koji upit treba da vrati (broj zapisa, vrijednosti agregatnih funkcija...).
5921U sluèaju da rezultat upita nije taèan, a pogled, tabela... koji su rezultat tog upita se koriste u narednim zadacima,
5922tada se rješenja narednih zadataka, bez obzira na taènost koda, ne boduju punim brojem bodova,
5923jer ni ta rješenja ne mogu vratiti taèan rezultat (broj zapisa, vrijednosti agregatnih funkcija...).
5924B.
5925Tokom pisanja koda obratiti posebnu pažnju na tekst zadatka i ono što se traži zadatkom.
5926Prilikom pregleda rada pokreæe se kod koji se nalazi u sql skripti i
5927sve ono što nije uraðeno prema zahtjevima zadatka ili je pogrešno uraðeno predstavlja grešku.
5928*/
5929
5930
5931--1.
5932/*
5933Kreirati bazu podataka pod vlastitim brojem indeksa.
5934*/
5935create database FIT_ispitniZadatak4
5936go
5937use FIT_ispitniZadatak4
5938
5939
5940/*Prilikom kreiranja tabela voditi raèuna o meðusobnom odnosu izmeðu tabela.
5941a) Kreirati tabelu osoba sljedeæe strukture:
5942 - osoba_id cjelobrojna varijabla, primarni kljuè
5943 - ime 50 UNICODE karaktera
5944 - prezime 50 UNICODE karaktera
5945 - tip_osobe 2 UNICODE karaktera
5946 - kreditna_id cjelobrojna varijabla
5947 - tip_kreditne 50 UNICODE karaktera
5948 - broj_kartice 50 UNICODE karaktera
5949 - dtm_izdav datumska varijabla
5950*/
5951
5952create table osoba
5953(
5954 osobaID int constraint PK_osoba primary key not null,
5955 ime nvarchar (50),
5956 prezime nvarchar (50),
5957 tipOsobe nvarchar (2),
5958 kreditnaID int,
5959 tipKreditne nvarchar (50),
5960 brojKartice nvarchar (50),
5961 datumIzdavanja date
5962)
5963
5964/*
5965c) Kreirati tabelu kupac sljedeæe strukture:
5966 - kupac_id cjelobrojna varijabla, primarni kljuè
5967 - osoba_id cjelobrojna varijabla
5968 - prodavnica_id cjelobrojna varijabla
5969 - br_racuna 10 unicode karaktera
5970*/
5971
5972create table kupac
5973(
5974 kupacID int constraint PK_kupac primary key not null,
5975 osobaID int,
5976 prodavnicaID int,
5977 brRacuna nvarchar (10),
5978 constraint FK_kupacOsoba foreign key (osobaID) references osoba (osobaID)
5979)
5980
5981/*
5982c) Kreirati tabelu kupovina sljedeæe strukture:
5983 - kupovina_id cjelobrojna varijabla, primarni kljuè
5984 - detalj_id cjelobrojna varijabla, primarni kljuè
5985 - narudzba_id 25 UNICODE karaktera
5986 - kreditna_id cjelobrojna varijabla
5987 - teritorija_id cjelobrojna varijabla
5988 - kupac_id cjelobrojna varijabla
5989 - kolicina cjelobrojna varijabla
5990 - cijena novèana varijabla
5991*/
5992create table kupovina
5993(
5994 kupovinaID int,
5995 detaljID int,
5996 narudzbaID nvarchar (25),
5997 kreditnaID int,
5998 teritorijaID int,
5999 kupacID int,
6000 kolicina int,
6001 cijena money,
6002 constraint PK_kupovina primary key (kupovinaID, detaljID),
6003 constraint FK_kupovinaKupac foreign key (kupacID) references kupac (kupacID)
6004)
6005
6006--10 bodova
6007-----------------------------------------------------------------------
6008--2.
6009/*
6010a) Koristeæi tabele Person.Person, Sales.PersonCreditCard i Sales.CreditCard baze AdventureWorks2017 izvršiti insert podataka prema sljedeæem pravilu:
6011 - BusinessEntityID -> osoba_id
6012 - FirstName -> ime
6013 - LastName -> prezime
6014 - CardType -> tip_kreditne
6015 - PersonType -> tip_osobe
6016 - CardNumber -> broj_kartice
6017 - CreditCardID -> kreditna_id
6018 - ModifiedDate -> dtm_izdav
6019*/
6020
6021insert into osoba
6022select pp.BusinessEntityID, pp.FirstName, pp.LastName, pp.PersonType, cc.CreditCardID, cc.CardType, cc.CardNumber, pcc.ModifiedDate
6023from AdventureWorks2014.Person.Person as pp inner join AdventureWorks2014.Sales.PersonCreditCard as pcc
6024on pp.BusinessEntityID = pcc.BusinessEntityID
6025inner join AdventureWorks2014.Sales.CreditCard as cc
6026on pcc.CreditCardID = cc.CreditCardID
6027
6028--19118
6029
6030/*
6031b) Koristeæi tabelu Sales.Customer baze AdventureWorks2017 izvršiti insert podataka prema sljedeæem pravilu:
6032 - CustomerID -> kupac_id
6033 - PersonID -> osoba_id
6034 - StoreID -> prodavnica_id
6035 - AccountNumber -> br_racuna
6036uz uslov da PersonID bude veæi od 300.
6037*/
6038insert into kupac
6039select CustomerID, PersonID, StoreID, AccountNumber
6040from AdventureWorks2014.Sales.Customer
6041where PersonID > 300
6042
6043--19114
6044
6045/*
6046c) Koristeæi tabele Sales.SalesOrderHeader i Sales.SalesOrderDetail baze AdventureWorks2017 izvršiti insert podataka u tabelu kupovina prema sljedeæem pravilu:
6047 - SalesOrderID -> kupovina_id
6048 - SalesOrderDetailID -> detalj_id
6049 - PurchaseOrderNumber -> narudzba_id
6050 - CreditCardID -> kreditna_id
6051 - TerritoryID -> teritorija_id
6052 - CustomerID -> kupac_id
6053 - OrderQty -> kolicina
6054 - UnitPrice -> cijena
6055uz uslov da CustomerID bude manji od 29000.
6056*/
6057insert into kupovina
6058select soh.SalesOrderID, sod.SalesOrderDetailID, soh.PurchaseOrderNumber, soh.CreditCardID, soh.TerritoryID, soh.CustomerID, sod.OrderQty, sod.UnitPrice
6059from AdventureWorks2014.sales.SalesOrderHeader as soh inner join AdventureWorks2014.Sales.SalesOrderDetail as sod
6060on soh.SalesOrderID = sod.SalesOrderID
6061where soh.CustomerID < 29000
6062
6063--59297
6064--10 bodova
6065
6066-----------------------------------------------------------------------
6067--3.
6068/*
6069a)
6070Kreirati pogled view_ukupno kojim æe se dati ukupna vrijednost svih kupovina koje je osoba ostvarila.
6071Pogled treba sadržavati kolone:
6072 - osoba_id
6073 - ukupno - ukupna svota svih kupovina
6074Napomena:
6075Vrijednost jedne kupovine predstavlja umnožak kolièine i cijene.
6076b)
6077Odrediti koliko je zapisa veæe, koliko jednako, a koliko manje od srednje vrijednosti kolone ukupno iz view_ukupno.
6078Rezultat upita treba da vrati prebrojane brojeve sa pripadajuæim oznakama (veæe, jednako, manje).
6079Ne prihvata se rješenje koje ne vraæa oznake.
6080*/
6081--a
6082go
6083create view viewUkupno
6084as
6085select o.osobaID, sum(kup.kolicina * kup.cijena) as ukupno
6086from osoba as o inner join kupac as k
6087on o.osobaID = k.osobaID
6088inner join kupovina as kup
6089on k.kupacID = kup.kupacID
6090group by o.osobaID
6091go
6092
6093select *
6094from viewUkupno
6095--18000
6096
6097--b)
6098/*Odrediti koliko je zapisa veæe, koliko jednako, a koliko manje od srednje vrijednosti kolone ukupno iz view_ukupno.
6099Rezultat upita treba da vrati prebrojane brojeve sa pripadajuæim oznakama (veæe, jednako, manje).
6100Ne prihvata se rješenje koje ne vraæa oznake.*/
6101
6102select 'veæe', count (*)
6103from viewUkupno
6104where ukupno > (select avg(ukupno) from viewUkupno)
6105
6106select 'jednako', count (*)
6107from viewUkupno
6108where ukupno = (select avg(ukupno) from viewUkupno)
6109
6110select 'manje', count (*)
6111from viewUkupno
6112where ukupno < (select avg(ukupno) from viewUkupno)
6113
6114/*
6115veæe 6509
6116jednako 0
6117manje 11491
6118*/
6119--10 bodova
6120
6121
6122-----------------------------------------------------------------------
6123--4.
6124/*
6125a)
6126U tabeli osoba dodati izraèunatu kolonu lozinka.
6127Podatak u koloni lozinka æe se sastojati od sljedeæih dijelova:
6128 - 2 znaka sluèajno generisani karakteri
6129 - bilo koja 3 karaktera iz kolona ime u obrnutom redoslijedu
6130 - bilo koja 3 karaktera iz kolone prezime u obrnutom redoslijedu
6131 - godina iz datuma izdavanja
6132 - dan iz datuma izdavanja
6133 - mjesec iz datuma izdavanja
6134Izmeðu svih dijelova lozinke OBAVEZNO treba biti donja crta.
6135b)
6136U tabeli kupac u koloni prodavnica_id umjesto NULL vrijednosti ubaciti vrijednost podatka iz kolone osoba_id uveæan za 1.
6137*/
6138alter table osoba
6139add lozinka as left (newid(), 2) + '_' + reverse (left(ime, 3)) + '_' + reverse (left(prezime, 3)) + '_' +
6140 cast (year (getdate()) as nvarchar) + '_' + cast (day(getdate()) as nvarchar) + '_' + cast (month (getdate()) as nvarchar)
6141
6142update kupac
6143set prodavnicaID = osobaID + 1
6144where prodavnicaID is null
6145
6146--18484
6147--10 bodova
6148
6149
6150
6151
6152-----------------------------------------------------------------------
6153--5.
6154/*
6155a)
6156Kreirati proceduru proc_narudzba kojom æe se smještati podaci u kolonu narudzba_id tabele kupovina.
6157Podatak u koloni narudzba_id æe se sastoji od sljedeæih dijelova:
6158 - 1. karakter je slovo n
6159 - kupovina_id
6160 - detalj_id
6161Izmeðu svih dijelova narudzba_id OBAVEZNO treba biti srednja crta.
6162OBAVEZNO pokrenuti proceduru.
6163b)
6164Nad kolonom narudzba_id kreirati ogranièenje kojim æe biti moguæe unijeti podatak koji ima najviše 20 karaktera.
6165*/
6166--a
6167go
6168create procedure proc_narudzba
6169as
6170begin
6171update kupovina
6172set narudzba_id = 'n' + '-' + CAST (kupovina_id as nvarchar) + '-' + CAST (detalj_id as nvarchar)
6173end
6174
6175exec proc_narudzba
6176--59297
6177
6178--b
6179alter table kupovina
6180add constraint CK_narudzba_id check (len (narudzba_id) <= 20)
6181--10 bodova
6182
6183
6184
6185-----------------------------------------------------------------------
6186--6.
6187/*
6188Neka su za cijene definirane sljedeæe 4 klase:
6189 - 0-999,99 => klasa 1
6190 - 1000-1999,99 => klasa 2
6191 - 2000-2999,99 => klasa 3
6192 - 3000-3999,99 => klasa 4
6193Kreirati proceduru proc_klasa kojom æe se izvršiti klasificiranje cijena prema navedenim klasama.
6194Procedura treba da vrati cijenu (njenu vrijednost) i oznaku klase kojoj pripada,
6195uz uslov da procedura ne vraæa duplikate cijena.
6196*/
6197go
6198create procedure proc_klasa
6199as
6200begin
6201select distinct cijena, 'klasa 1' as klasa
6202from kupovina
6203where cijena between 0 and 999.99
6204union
6205select distinct cijena, 'klasa 2' as klasa
6206from kupovina
6207where cijena between 1000 and 1999.99
6208union
6209select distinct cijena, 'klasa 3' as klasa
6210from kupovina
6211where cijena between 2000 and 2999.99
6212union
6213select distinct cijena, 'klasa 4' as klasa
6214from kupovina
6215where cijena between 3000 and 3999.99
6216order by 1
6217end
6218
6219exec proc_klasa
6220--42
6221--10 bodova
6222
6223
6224
6225
6226-----------------------------------------------------------------------
6227--7.
6228/*
6229a)
6230Koristeæi tabele baze kreirati pogled view_tip sljedeæe strukture:
6231 - tip kreditne kartice
6232 - ID prodavnice
6233 - prebrojano - prebrojani broj kupovina po tipu kreditne kartice i ID prodavnice
6234b)
6235Koristeæi pogled view_tip kreirati proceduru proc_tip koja æe imati parametar za kolonu prebrojano. Pokrenuti proceduru za vrijednosti paramtera 3 i 30.
6236*/
6237go
6238create view view_tip
6239as
6240SELECT osoba.tip_kreditne, kupac.prodavnica_id, COUNT(kupovina.kupovina_id) AS prebrojano
6241FROM kupac INNER JOIN kupovina
6242ON kupac.kupac_id = kupovina.kupac_id
6243 INNER JOIN osoba ON kupac.osoba_id = osoba.osoba_id
6244GROUP BY osoba.tip_kreditne, kupac.prodavnica_id
6245go
6246--18000
6247
6248--b
6249go
6250create procedure proc_prebrojano
6251(
6252 @prebrojano int = null
6253)
6254as
6255begin
6256select prebrojano, count (*)
6257from view_tip
6258where prebrojano = @prebrojano
6259group by prebrojano
6260end
6261
6262exec proc_prebrojano 3
6263exec proc_prebrojano 30
6264/*
62653 4505
626630 3
6267*/
6268--10 bodova
6269
6270
6271-----------------------------------------------------------------------
6272--8.
6273/*
6274Na osnovu tabele osoba kreirati proceduru nakon èijeg pokretanja æe se dobiti ukupan broj osoba èije prezime je jedinstveno.
6275*/
6276go
6277create view view_jedinstveno
6278as
6279select prezime, count(*) indikator
6280from osoba
6281group by prezime
6282having COUNT (*) = 1
6283go
6284
6285go
6286create procedure proc_jedinstveno
6287as
6288begin
6289select count (*)
6290from view_jedinstveno
6291end
6292
6293exec proc_jedinstveno
6294--585
6295--10 bodova
6296
6297
6298-----------------------------------------------------------------------
6299--9.
6300/*
6301a)
6302Koristeæi tabele baze kreirati globalnu privremenu tabelu temp sljedeæe strukture:
6303 - ID osobe
6304 - tip kreditne kartice
6305 - klasa - prve 4 cifre iz kolone broj_kartice
6306 - datum izdavanja
6307 - ID narudzbe
6308i u nju povuæi podatke iz odgovarajuæih tabela.
6309b)
6310Provjeriti da li je jednom tipu kreditne kartice u privremenoj tabeli pridružena jedna ili više klasa.
6311*/
6312SELECT osoba.osoba_id, osoba.tip_kreditne, left (osoba.broj_kartice,4) klasa, osoba.dtm_izdav, kupovina.narudzba_id
6313into temp
6314FROM kupac INNER JOIN kupovina
6315ON kupac.kupac_id = kupovina.kupac_id
6316 INNER JOIN osoba
6317 ON kupac.osoba_id = osoba.osoba_id
6318--52297
6319
6320--b
6321select distinct tip_kreditne, klasa
6322from ##temp
6323order by 1
6324--jedna
6325
6326--10 bodova
6327
6328
6329-----------------------------------------------------------------------
6330--10.
6331/*
6332a)
6333Prebrojati broj pojavljivanja dužina podatka u koloni narudzba_id,
6334uz uslov da se prikažu samo one vrijednosti dužina koja se pojavljaju više od 1000 puta.
6335b)
6336Svim zapisima èija dužina podatka se pojavljuje manje od 1000 puta promijeniti sadržaj
6337kolone narudzba_id tako što æe se na postojeæi podatak dodati tekuæi datum.
6338*/
6339--a
6340select LEN (narudzba_id), COUNT (*)
6341from kupovina
6342group by LEN (narudzba_id)
6343having COUNT (*) > 1000
6344/*
634512 1747
634613 42192
634714 15213
6348*/
6349
6350--b
6351alter table kupovina
6352drop constraint [CK_narudzba_id]
6353
6354alter table kupovina
6355alter column narudzba_id nvarchar (50)
6356
6357update kupovina
6358set narudzba_id = narudzba_id + cast (getdate () as nvarchar)
6359where LEN (narudzba_id) = 11
6360--145
6361--10 bodova
6362
6363
6364
6365
6366/*
6367Napomena:
6368A.
6369Prilikom bodovanja rješenja prioritet ima rezultat
6370koji upit treba da vrati (broj zapisa, vrijednosti agregatnih funkcija...).
6371U sluèaju da rezultat upita nije taèan, a rezultat tog upita se koristi
6372u narednim zadacima, tada se rješenja narednih zadataka,
6373bez obzira na taènost koda, ne boduju punim brojem bodova,
6374jer ni ta rješenja ne mogu vratiti taèan rezultat
6375(broj zapisa, vrijednosti agregatnih funkcija...).
6376B.
6377Tokom pisanja koda obratiti pažnju na tekst zadatka
6378i ono što se traži zadatkom. Prilikom pregleda rada pokreæe se
6379kod koji se nalazi u sql skripti i
6380sve ono što nije uraðeno prema zahtjevima zadatka
6381ili je pogrešno uraðeno predstavlja grešku.
6382*/
6383
6384------------------------------------------------
6385/*
6386BODOVANJE
6387 Maksimalni broj bodova: 80
6388 Prag prolaznosti: 44
6389RASPON OCJENA
6390 bodovi ocjena
6391 0 - 43 5
6392 44 - 58 6
6393 59 - 73 7
6394 74 - 80 8
6395*/
6396------------------------------------------------
6397
6398
6399
6400------------------------------------------------
6401--1.
6402/*
6403Kreirati bazu podataka pod vlastitim brojem indeksa
6404i aktivirati je.
6405*/
6406
6407create database FIT_ispitniZadatak3
6408use FIT_ispitniZadatak3
6409
6410---------------------------------------------------------------------------
6411--Prilikom kreiranja tabela voditi raèuna o njihovom meðusobnom odnosu.
6412---------------------------------------------------------------------------
6413/*
6414a)
6415Kreirati tabelu prodavac koja æe imati sljedeæu strukturu:
6416 - prodavac_id, cjelobrojni tip, primarni kljuè
6417 - naziv_posla, 50 unicode karaktera
6418 - dtm_rodj, datumski tip
6419 - bracni_status, 1 karakter
6420 - prod_kvota, novèani tip
6421 - bonus, novèani tip
6422*/
6423create table prodavac
6424(
6425 prodavacID int constraint PK_prodavac primary key not null,
6426 nazivPosla nvarchar (50),
6427 datumRodjenja date,
6428 bracniStatus char (1),
6429 prodKvota money,
6430 bonus money
6431)
6432/*
6433b)
6434Kreirati tabelu prodavnica koja æe imati sljedeæu strukturu:
6435 - prodavnica_id, cjelobrojni tip, primarni kljuè
6436 - naziv_prodavnice, 50 unicode karaktera
6437 - prodavac_id, cjelobrojni tip
6438*/
6439create table prodavnica
6440(
6441 prodavnicaID int constraint PK_prodavnica primary key not null,
6442 nazivProdavnice nvarchar (50),
6443 prodavacID int,
6444 constraint FK_prodavac foreign key (prodavacID) references prodavac (prodavacID)
6445)
6446
6447/*
6448c)
6449Kreirati tabelu kupac_detalji koja æe imati sljedeæu strukturu:
6450 - detalj_id, cjelobrojni tip, primarni kljuè, automatsko punjenje sa poèetnom vrijednošæu 1 i inkrementom 1
6451 - kupac_id, cjelobrojni tip, primarni kljuè
6452 - prodavnica_id, cjelobrojni tip
6453 - br_rac, 10 karaktera
6454 - dtm_narudz, datumski tip
6455 - kolicina, skraæeni cjelobrojni tip
6456 - cijena, novèani tip
6457 - popust, realni tip
6458*/
6459create table kupacDetalj
6460(
6461 detaljID int identity (1,1),
6462 kupacID int,
6463 prodavnicaID int,
6464 brojRacuna nvarchar (10),
6465 datumNarudzbe date,
6466 kolicina smallint,
6467 cijena money,
6468 popust real,
6469 constraint PK_detaljiKupac primary key (detaljID, kupacID),
6470 constraint FK_prodavnicaID foreign key (prodavnicaID) references prodavnica (prodavnicaID)
6471)
6472
6473
6474--10 bodova
6475--2.
6476/*
6477a)
6478Koristeæi tabele HumanResources.Employee i Sales.SalesPerson
6479baze AdventureWorks2017 zvršiti insert podataka u
6480tabelu prodavac prema sljedeæem pravilu:
6481 - BusinessEntityID -> prodavac_id
6482 - JobTitle -> naziv_posla
6483 - BirthDate -> dtm_rodj
6484 - MaritalStatus -> bracni_status
6485 - SalesQuota -> prod_kvota
6486 - Bonus -> nžbonus
6487*/
6488insert into prodavac
6489select sp.BusinessEntityID, e.JobTitle, e.BirthDate, e.MaritalStatus, sp.SalesQuota, sp.Bonus
6490from AdventureWorks2014.HumanResources.Employee as e inner join AdventureWorks2014.Sales.SalesPerson as sp
6491on e.BusinessEntityID = sp.BusinessEntityID
6492
6493select *
6494from prodavac
6495
6496/*
6497b)
6498Koristeæi tabelu Sales.Store baze AdventureWorks2017
6499izvršiti insert podataka u tabelu prodavnica
6500prema sljedeæem pravilu:
6501 - BusinessEntityID -> prodavnica_id
6502 - Name -> naziv_prodavnice
6503 - SalesPersonID -> prodavac_id
6504*/
6505
6506insert into prodavnica
6507select BusinessEntityID, name, SalesPersonID
6508from AdventureWorks2014.Sales.Store
6509
6510select *
6511from prodavnica
6512
6513/*
6514b)
6515Koristeæi tabele Sales.Customer, Sales.SalesOrderHeader i SalesOrderDetail
6516baze AdventureWorks2017 izvršiti insert podataka u tabelu kupac_detalji
6517prema sljedeæem pravilu:
6518 - CustomerID -> kupac_id
6519 - StoreID -> prodavnica_id
6520 - AccountNumber -> br_rac
6521 - OrderDate -> dtm_narudz
6522 - OrderQty -> kolicina
6523 - UnitPrice -> cijena
6524 - UnitPriceDiscount -> popust
6525Uslov je da se ne dohvataju zapisi u kojima su
6526StoreID i PersonID NULL vrijednost
6527*/
6528insert into kupacDetalj
6529select c.CustomerID, c.StoreID, c.AccountNumber, soh.OrderDate, sod.OrderQty, sod.UnitPrice, sod.UnitPriceDiscount
6530from AdventureWorks2014.Sales.Customer as c inner join AdventureWorks2014.Sales.SalesOrderHeader as soh
6531on c.CustomerID = soh.CustomerID
6532inner join AdventureWorks2014.Sales.SalesOrderDetail as sod
6533on soh.SalesOrderID = sod.SalesOrderID
6534where c.StoreID is not null and c.PersonID is not null
6535
6536select*
6537from kupacDetalj
6538
6539--10 bodova
6540
6541
6542
6543--3.
6544/*
6545a)
6546U tabeli prodavac dodati izraèunatu kolonu god_rodj
6547u koju æe se smještati godina roðenja prodavca.
6548*/
6549
6550select *
6551from prodavac
6552
6553alter table prodavac
6554add godinaRodjenja as year(datumRodjenja)
6555
6556select * from prodavac
6557
6558
6559
6560/*
6561b)
6562U tabeli kupac_detalji promijeniti tip podatka
6563kolone cijena iz novèanog u decimalni tip oblika (8,2)
6564*/
6565
6566alter table kupacDetalj
6567alter column cijena decimal(8,2)
6568
6569/*
6570c)
6571U tabeli kupac_detalji dodati standardnu kolonu
6572lozinka tipa 20 unicode karaktera.
6573*/
6574
6575alter table kupacDetalj
6576add lozinka nvarchar(20)
6577
6578select * from kupacDetalj
6579
6580/*
6581d)
6582Kolonu lozinka popuniti tako da bude spojeno
658310 sluèajno generisanih znakova i
6584numerièki dio (bez vodeæih nula) iz kolone br_rac
6585*/
6586update kupacDetalj
6587set lozinka = left(newid(), 10) + right(brojRacuna, 5)
6588
6589select *
6590from kupacDetalj
6591
6592--10 bodova
6593
6594
6595
6596
6597
6598
6599--4.
6600/*
6601Koristeæi tabele prodavnica i kupac_detalji
6602dati pregled sumiranih kolièina po
6603nazivu prodavnice i godini naruèivanja.
6604Sortirati po nazivu prodavnice.
6605*/
6606
6607select p.nazivProdavnice, sum(kd.kolicina) as kolicinaSumirano, year(kd.datumNarudzbe) as godina
6608from prodavnica as p inner join kupacDetalj as kd
6609on p.prodavnicaID = kd.prodavnicaID
6610group by p.nazivProdavnice, year(kd.datumNarudzbe)
6611order by 1
6612
6613--6 bodova
6614
6615
6616--5.
6617/*
6618Kreirati pogled v_prodavac_cijena sljedeæe strukture:
6619 - prodavac_id
6620 - bracni_status
6621 - sum_cijena
6622Uslov je da se u pogled dohvate samo oni zapisi u
6623kojima je sumirana vrijednost veæa od 1000000.
6624*/
6625
6626go
6627create view view_prodavacCijena
6628as
6629select p.prodavacID, p.bracniStatus, sum(kd.cijena) as cijenaSumirano
6630from prodavac as p inner join prodavnica as pr
6631on p.prodavacID = pr.prodavacID
6632inner join kupacDetalj as kd
6633on pr.prodavnicaID = kd.prodavnicaID
6634group by p.prodavacID, p.bracniStatus
6635having sum(kd.cijena) > 1000000
6636
6637select*
6638from view_prodavacCijena
6639
6640
6641--8 bodova
6642
6643--6.
6644/*
6645Koristeæi pogled v_prodavac_cijena
6646kreirati proceduru p_prodavac_cijena sa parametrom
6647bracni_status èija je zadata (default) vrijednost M.
6648Uslov je da se procedurom dohvataju zapisi u kojima je
6649vrijednost u koloni sum_cijena veæa od srednje vrijednosti kolone sum_cijena.
6650Obavezno napisati kod za pokretanje procedure.
6651*/
6652
6653go
6654create procedure procProdavacCijena
6655(
6656 @bracni_status char(1) = 'M'
6657)
6658as
6659begin
6660select *
6661from view_prodavacCijena
6662where bracniStatus = @bracni_status and
6663 cijenaSumirano > (select avg(cijenaSumirano) from view_prodavacCijena)
6664end
6665
6666exec procProdavacCijena;
6667--8 bodova
6668
6669
6670--7.
6671/*
6672Iz tabele kupac_detalji prikazati zapise u kojima je
6673vrijednost u koloni cijena jednaka
6674minimalnoj, odnosno, maksimalnoj vrijednosti u ovoj koloni.
6675Upit treba da vraæa kolone kupac_id, prodavnica_id i cijena.
6676Sortirati u rastuæem redoslijedu prema koloni cijena.
6677*/
6678select kupacID, prodavnicaID, cijena
6679from kupacDetalj
6680where cijena = (select min(cijena) from kupacDetalj) or cijena = (select max(cijena) from kupacDetalj)
6681
6682--8 bodova
6683
6684--8.
6685/*
6686a)
6687U tabeli kupac_detalji kreirati kolonu
6688cijena_sa_popustom tipa decimal (8,2).
6689*/
6690select *
6691from kupacDetalj
6692alter table kupacDetalj
6693add cijenaSaPopustom decimal(8,2)
6694
6695select *
6696from kupacDetalj
6697
6698/*
6699b)
6700Koristeæi tabelu kupac_detalji
6701kreirati proceduru p_popust sa parametrom
6702godina koji æe odgovarati godini iz datum naruèivanja.
6703Procedura æe vršiti update kolone cijena_sa_popustom
6704ako je vrijednost parametra veæa od 2013,
6705inaèe se daje poruka 'transakcija nije izvršena'.
6706Testirati funkcionisanje procedure za vrijednost
6707parametra godina 2014.
6708Obavezno napisati kod za provjeru sadržaja tabele
6709nakon što se pokrene procedura.
6710*/
6711go
6712create procedure procPopust
6713(
6714 @godina int
6715)
6716as
6717begin
6718 begin transaction
6719 update kupacDetalj
6720 set cijenaSaPopustom = cijena * (1 - popust)
6721 where YEAR(datumNarudzbe) = @godina
6722 if (@godina > 2013)
6723 begin
6724 commit transaction
6725 print('Transakcija uspjesna!')
6726 end
6727 else
6728 begin
6729 print ('Transankcija nije izvrsena!')
6730 rollback transaction
6731 end
6732end
6733exec procPopust @godina = 2014;
6734exec procPopust @godina = 2010;
6735--testiranje
6736
6737select *
6738from kupacDetalj
6739--8 bodova
6740
6741--9.
6742/*
6743a)
6744U tabeli prodavac kreirati kolonu min_kvota tipa decimal (8,2).
6745i na njoj postaviti ogranièenje da se
6746ne može unijeti negativna vrijednost.
6747*/
6748
6749alter table prodavac
6750add minimalnaKvota decimal (8,2) constraint CK_minimalnaKvota check (minimalnaKvota >=0)
6751
6752select *
6753from prodavac
6754
6755/*
6756b)
6757Kreirati skalarnu funkciju f_kvota sa parametrom prod_kvota.
6758Funkcija æe vraæati rezultat tipa decimal (8,2)
6759koji æe se raèunati po pravilu:
6760 10% od prod_kvota
6761*/
6762go
6763create function f_Kvota(@prod_Kvota money)
6764returns decimal (8,2)
6765as
6766begin
6767 return @prod_Kvota * 0.10
6768end
6769
6770
6771--testiranje
6772
6773/*
6774c)
6775Koristeæi funkciju f_kvota izvršiti update
6776kolone min_kvota u tabeli prodavac
6777*/
6778update prodavac
6779set minimalnaKvota = dbo.f_Kvota(prodKvota)
6780
6781
6782select * from prodavac
6783--8 bodova
6784
6785--10.
6786/*
6787a)
6788Kreirati tabelu prodavac_log strukture:
6789 - log_id, primarni kljuè, automatsko punjenje sa poèetnom vrijednošæu 1 i inkrementom 1
6790 - prodavac_id int
6791 - min_kvota decimal (8,2)
6792 - dogadjaj varchar (3)
6793 - mod_date datetime
6794*/
6795create table prodavacLog
6796(
6797 logID int constraint PK_logID primary key identity (1,1),
6798 prodavacID int,
6799 min_kvota decimal (8,2),
6800 dogadjaj varchar(3),
6801 mod_date datetime
6802)
6803
6804
6805/*
6806b)
6807Nad tabelom prodavac kreirati okidaè t_ins_prod
6808kojim æe se prilikom inserta podataka u
6809tabelu prodavac izvršiti insert podataka u
6810tabelu prodavac_log sa naznakom aktivnosti
6811(insert, update ili delete).
6812*/
6813go
6814create trigger triggerInsProd
6815on prodavac
6816after insert
6817as
6818begin
6819 insert into prodavacLog
6820 select i.prodavacID, i.minimalnaKvota, 'ins', getdate()
6821 from inserted as i
6822end
6823
6824
6825/*
6826c)
6827U tabelu prodavac insertovati zapis
6828291, Sales Manager, 1985-09-30, M, 250000.00, 985.00, -20000.00
6829Ako je potrebno izvršiti podešavanja
6830koja æe omoguæiti insrt zapisa.
6831*/
6832
6833--da bi mogli izvrsiti insert potrebno je dropati constraint
6834alter table prodavac
6835drop constraint CK_minimalnaKvota
6836
6837insert into prodavac
6838values (291, 'Sales Manager', '1985-09-30', 'M', 250000.00, 985.00, -20000.00)
6839
6840insert into prodavac
6841values(291, 'Sales Manager', '1985-09-30','M', 250000.00, 985.00, -20000.00)
6842
6843/*
6844d)
6845Obavezno napisati kod za pregled sadržaja
6846tabela prodavac i prodavac_log.
6847*/
6848select * from prodavac
6849select * from prodavacLog
6850--4 boda
6851
6852
6853
6854--29.06.2022.
6855
6856--BAZE PODATAKA II � ISPIT
6857
6858--***Prilikom izrade zadataka, OBAVEZNO iznad svakog zadatka napisati redni broj zadatka npr (4c). Zadaci koji ne budu ozna�eni na prethodno definisan na�in ne�e biti evaluirani.
6859
6860--1. Kroz SQL kod kreirati bazu podataka sa imenom va�eg broja indeksa.
6861CREATE DATABASE FIT_ispitniZadatak1
6862GO
6863USE FIT_ispitniZadatak1
6864GO
6865--2. U kreiranoj bazi podataka kreirati tabele sa sljede�om strukturom:
6866--a) Proizvodi
6867--� ProizvodID, cjelobrojna vrijednost i primarni klju�, autoinkrement
6868--� Naziv, 50 UNICODE karaktera (obavezan unos)
6869--� SifraProizvoda, 25 UNICODE karaktera (obavezan unos)
6870--� Boja, 15 UNICODE karaktera
6871--� NazivKategorije, 50 UNICODE (obavezan unos)
6872--� Tezina, decimalna vrijednost sa 2 znaka iza zareza
6873
6874create table proizvodi
6875(
6876 proizvodID int constraint PK_proizvod primary key identity(1,1),
6877 naziv nvarchar(50) not null,
6878 sifraProizvoda nvarchar (25) not null,
6879 boja nvarchar (15),
6880 nazivKategorije nvarchar (50) not null,
6881 tezina decimal (8,2)
6882)
6883--b) ZaglavljeNarudzbe
6884--� NarudzbaID, cjelobrojna vrijednost i primarni klju�, autoinkrement
6885--� DatumNarudzbe, polje za unos datuma i vremena (obavezan unos)
6886--� DatumIsporuke, polje za unos datuma i vremena
6887--� ImeKupca, 50 UNICODE (obavezan unos)
6888--� PrezimeKupca, 50 UNICODE (obavezan unos)
6889--� NazivTeritorije, 50 UNICODE (obavezan unos)
6890--� NazivRegije, 50 UNICODE (obavezan unos)
6891--� NacinIsporuke, 50 UNICODE (obavezan unos)
6892create table zaglavljeNarudzbe
6893(
6894 narudzbaID int constraint PK_zaglavljeNaruzdbe primary key identity (1,1),
6895 datumNarudzbe datetime not null,
6896 datumIsporuke datetime,
6897 imeKupca nvarchar (50) not null,
6898 prezimeKupca nvarchar (50) not null,
6899 nazivTeritorije nvarchar (50) not null,
6900 nazivRegije nvarchar (50) not null,
6901 nacinIsporuke nvarchar (50) not null
6902)
6903--c) DetaljiNarudzbe
6904--� NarudzbaID, cjelobrojna vrijednost, strani klju�
6905--� ProizvodID, cjelobrojna vrijednost, strani klju�
6906--� Cijena, nov�ani tip (obavezan unos),
6907--� Kolicina, skra�eni cjelobrojni tip (obavezan unos),
6908--� Popust, nov�ani tip (obavezan unos)
6909create table detaljiNarudzbe
6910(
6911 narudzbaID int not null constraint FK_zaglavljeNarudzbe foreign key references zaglavljeNarudzbe(narudzbaID),
6912 proizvodID int not null constraint FK_proizvodi foreign key references proizvodi(proizvodID),
6913 cijena money not null,
6914 kolicina smallint not null,
6915 popust money not null,
6916 detaljiNarudzbe int constraint PK_detaljiNarudzbe primary key identity (1,1)
6917 --primarni kljuc se mora pratiti, ukoliko ga nema mozemo iskoristiti naziv same tabele da nam bude primarni kljuc
6918)
6919--**Jedan proizvod se mo�e vi�e puta naru�iti, dok jedna narud�ba mo�e sadr�avati vi�e proizvoda. U okviru jedne narud�be jedan proizvod se mo�e naru�iti vi�e puta.
6920--7 bodova
6921
6922
6923--3. Iz baze podataka AdventureWorks u svoju bazu podataka prebaciti sljede�e podatke:
6924--a) U tabelu Proizvodi dodati sve proizvode, na mjestima gdje nema pohranjenih podataka o te�ini zamijeniti vrijednost sa 0
6925--� ProductID -> ProizvodID
6926--� Name -> Naziv
6927--� ProductNumber -> SifraProizvoda
6928--� Color -> Boja
6929--� Name (ProductCategory) -> NazivKategorije
6930--� Weight -> Tezina
6931SET IDENTITY_INSERT proizvodi ON
6932
6933insert into proizvodi (proizvodID, naziv, sifraProizvoda, boja, nazivKategorije, tezina)
6934select p.ProductID, p.name, p.ProductNumber, p.Color, pc.name, isnull(p.weight, 0)
6935from AdventureWorks2014.Production.Product as p inner join AdventureWorks2014.Production.ProductSubcategory as ps
6936on p.ProductSubcategoryID = ps.ProductSubcategoryID
6937inner join AdventureWorks2014.Production.ProductCategory as pc
6938on ps.ProductCategoryID = pc.ProductCategoryID
6939
6940select*
6941from proizvodi
6942
6943--b) U tabelu ZaglavljeNarudzbe dodati sve narud�be
6944--� SalesOrderID -> NarudzbaID
6945--� OrderDate -> DatumNarudzbe
6946--� ShipDate -> DatumIsporuke
6947--� FirstName (Person) -> ImeKupca
6948--� LastName (Person) -> PrezimeKupca
6949--� Name (SalesTerritory) -> NazivTeritorije
6950--� Group (SalesTerritory) -> NazivRegije
6951--� Name (ShipMethod) -> NacinIsporuke
6952
6953SET IDENTITY_INSERT zaglavljeNarudzbe ON
6954
6955insert into zaglavljeNarudzbe(narudzbaID, datumNarudzbe, datumIsporuke, imeKupca, prezimeKupca, nazivTeritorije, nazivRegije, nacinIsporuke)
6956select soh.SalesOrderID, soh.OrderDate, soh.ShipDate, pp.FirstName, pp.LastName, st.name, st.[Group], sm.name
6957from AdventureWorks2014.Sales.SalesOrderHeader as soh inner join AdventureWorks2014.sales.Customer as sc
6958on soh.CustomerID = sc.CustomerID
6959inner join AdventureWorks2014.Person.Person as pp
6960on sc.PersonID = pp.BusinessEntityID
6961inner join AdventureWorks2014.Sales.SalesTerritory as st
6962on st.TerritoryID = soh.TerritoryID
6963inner join AdventureWorks2014.Purchasing.ShipMethod as sm
6964on soh.ShipMethodID = sm.ShipMethodID
6965
6966SET IDENTITY_INSERT zaglavljeNarudzbe OFF
6967go
6968
6969select*
6970from zaglavljeNarudzbe
6971
6972
6973--c) U tabelu DetaljiNarudzbe dodati sve stavke narud�be
6974--� SalesOrderID -> NarudzbaID
6975--� ProductID -> ProizvodID
6976--� UnitPrice -> Cijena
6977--� OrderQty -> Kolicina
6978--� UnitPriceDiscount -> Popust
6979--8 bodova
6980
6981
6982INSERT INTO detaljiNarudzbe
6983SELECT SOD.SalesOrderID, SOD.ProductID, SOD.UnitPrice, SOD.OrderQty, SOD.UnitPriceDiscount
6984FROM AdventureWorks2014.Sales.SalesOrderDetail AS SOD
6985GO
6986
6987
6988
6989--4.
6990--a) (6 bodova) Kreirati upit koji �e prikazati ukupan broj uposlenika po odjelima.
6991--Potrebno je prebrojati samo one uposlenike koji su trenutno aktivni, odnosno rade na datom odjelu.
6992--Tako�er, samo uzeti u obzir one uposlenike koji imaju vi�e od 10 godina radnog sta�a (ne uklju�uju�i grani�nu vrijednost).
6993--Rezultate sortirati preba broju uposlenika u opadaju�em redoslijedu.(AdventureWorks2017)
6994USE AdventureWorks2017
6995SELECT
6996 D.Name,
6997 COUNT(*) 'Broj uposlenika'
6998FROM HumanResources.Employee AS E
6999 INNER JOIN HumanResources.EmployeeDepartmentHistory AS EDH ON E.BusinessEntityID = EDH.BusinessEntityID
7000 INNER JOIN HumanResources.Department AS D ON EDH.DepartmentID = D.DepartmentID
7001WHERE EDH.EndDate IS NULL AND DATEDIFF(YEAR, E.HireDate, GETDATE()) > 10
7002GROUP BY D.Name
7003ORDER BY 'Broj uposlenika' DESC
7004GO
7005--, SUM(IIF(POD.RejectedQty>100,1,0)) 'Broj stavki'
7006--b) Kreirati upit koji prikazuje po mjesecima ukupnu vrijednost poru�ene robe za skladi�te, te ukupnu koli�inu primljene robe, isklju�ivo u 2012 godini. Uslov je da su tro�kovi prevoza bili izme�u 500 i 2500, a da je dostava izvr�ena CARGO transportom. Tako�er u rezultatima upita je potrebno prebrojati stavke narud�be na kojima je odbijena koli�ina ve�a od 100.(AdventureWorks2017)
7007
7008USE AdventureWorks2017
7009--1. NA�IN
7010SELECT
7011 MONTH(POH.OrderDate) 'Mjesec',
7012 SUM(POD.LineTotal),
7013 SUM(POD.ReceivedQty),
7014 SUM(IIF(POD.RejectedQty > 100, 1, 0)) 'Broj stavki'
7015FROM Purchasing.PurchaseOrderHeader AS POH
7016 INNER JOIN Purchasing.PurchaseOrderDetail AS POD ON POH.PurchaseOrderID = POD.PurchaseOrderID
7017 INNER JOIN Purchasing.ShipMethod AS SM ON POH.ShipMethodID = SM.ShipMethodID
7018WHERE YEAR(POH.OrderDate)=2012
7019 AND POH.Freight BETWEEN 500 AND 2500
7020 AND SM.Name LIKE '%CARGO%'
7021GROUP BY MONTH(POH.OrderDate)
7022GO
7023--2. NA�IN
7024SELECT
7025 MONTH(POH.OrderDate) 'Mjesec',
7026 SUM(POD.LineTotal),
7027 SUM(POD.ReceivedQty),
7028 (SELECT COUNT(*)
7029 FROM Purchasing.PurchaseOrderHeader AS POH1
7030 INNER JOIN Purchasing.PurchaseOrderDetail AS POD1 ON POH1.PurchaseOrderID = POD1.PurchaseOrderID
7031 INNER JOIN Purchasing.ShipMethod AS SM1 ON POH1.ShipMethodID = SM1.ShipMethodID
7032 WHERE MONTH(POH.OrderDate) = MONTH(POH1.OrderDate)
7033 AND POD1.RejectedQty > 100
7034 AND YEAR(POH1.OrderDate) = 2012
7035 AND POH1.Freight BETWEEN 500 AND 2500
7036 AND SM1.Name LIKE '%CARGO%')
7037FROM Purchasing.PurchaseOrderHeader AS POH
7038 INNER JOIN Purchasing.PurchaseOrderDetail AS POD ON POH.PurchaseOrderID = POD.PurchaseOrderID
7039 INNER JOIN Purchasing.ShipMethod AS SM ON POH.ShipMethodID = SM.ShipMethodID
7040WHERE YEAR(POH.OrderDate)=2012
7041 AND POH.Freight BETWEEN 500 AND 2500
7042 AND SM.Name LIKE '%CARGO%'
7043GROUP BY MONTH(POH.OrderDate)
7044
7045GO
7046
7047--3. NA�IN
7048SELECT
7049 Q.Mjesec,
7050 SUM(Q.[Ukupna vrijednost]) 'Ukupna vrijednost',
7051 SUM(Q.[Ukupna koli�ina]) 'Ukupna koli�ina',
7052 SUM(Q.[Stavke narudzbe]) 'Stavke narudzbe'
7053FROM (SELECT
7054 MONTH(POH.OrderDate) 'Mjesec',
7055 SUM(POD.LineTotal) 'Ukupna vrijednost',
7056 SUM(POD.ReceivedQty) 'Ukupna koli�ina',
7057 (SELECT COUNT(*)
7058 FROM AdventureWorks2017.Purchasing.PurchaseOrderDetail AS POD1
7059 WHERE POD1.RejectedQty > 100 AND POD.PurchaseOrderID = POD1.PurchaseOrderID) 'Stavke narudzbe'
7060FROM Purchasing.PurchaseOrderDetail AS POD
7061 INNER JOIN Purchasing.PurchaseOrderHeader AS POH ON POD.PurchaseOrderID = POH.PurchaseOrderID
7062 INNER JOIN Purchasing.ShipMethod AS SM ON POH.ShipMethodID = SM.ShipMethodID
7063WHERE YEAR(POH.OrderDate) = 2012
7064 AND (POH.Freight BETWEEN 500 AND 2500)
7065 AND SM.Name LIKE '%CARGO%'
7066GROUP BY MONTH(POH.OrderDate), POD.PurchaseOrderID) AS Q
7067GROUP BY Q.Mjesec
7068
7069GO
7070--PROVJERA
7071SELECT
7072 POH.OrderDate,
7073 POD.RejectedQty,
7074 POD.PurchaseOrderDetailID,
7075 POH.PurchaseOrderID
7076FROM Purchasing.PurchaseOrderHeader AS POH
7077 INNER JOIN Purchasing.PurchaseOrderDetail AS POD ON POH.PurchaseOrderID = POD.PurchaseOrderID
7078 INNER JOIN Purchasing.ShipMethod AS SM ON POH.ShipMethodID = SM.ShipMethodID
7079WHERE YEAR(POH.OrderDate)=2012
7080 AND POH.Freight BETWEEN 500 AND 2500
7081 AND SM.Name LIKE '%CARGO%'
7082 AND MONTH(POH.OrderDate) = 1
7083 --GROUP BY MONTH(POH.OrderDate), POD.RejectedQty
7084GO
7085--c) (11 bodova) Prikazati ukupan broj narud�bi koje su obradili uposlenici, za svakog uposlenika pojedina�no. Uslov je da su narud�be kreirane u 2011 ili 2012 godini, te da je u okviru jedne narud�be odobren popust na dvije ili vi�e stavki. Tako�er uzeti u obzir samo one narud�be koje su isporu�ene u Veliku Britaniju, Kanadu ili Francusku. (AdventureWorks2017)
7086
7087SELECT
7088 PP.LastName,
7089 PP.FirstName,
7090 COUNT(*) BrojNarudzbi
7091FROM Person.Person AS PP
7092 INNER JOIN HumanResources.Employee AS E ON PP.BusinessEntityID = E.BusinessEntityID
7093 INNER JOIN Sales.SalesPerson AS SP ON SP.BusinessEntityID = E.BusinessEntityID
7094 INNER JOIN Sales.SalesOrderHeader AS SOH ON SOH.SalesPersonID = SP.BusinessEntityID
7095 INNER JOIN Sales.SalesTerritory AS ST ON ST.TerritoryID = SOH.TerritoryID
7096WHERE YEAR(SOH.OrderDate) IN (2011,2012)
7097 AND ST.Name IN ('United Kingdom', 'Canada', 'France')
7098 AND (SELECT COUNT(*)
7099 FROM Sales.SalesOrderDetail AS SOD
7100 WHERE SOD.SalesOrderID = SOH.SalesOrderID AND SOD.UnitPriceDiscount>0) >=2
7101GROUP BY PP.LastName, PP.FirstName
7102ORDER BY BrojNarudzbi DESC
7103
7104GO
7105
7106
7107
7108
7109--d) (11 bodova) Napisati upit koji �e prikazati sljede�e podatke o proizvodima: naziv proizvoda,
7110--naziv kompanije dobavlja�a, koli�inu na skladi�tu, te kreiranu �ifru proizvoda. �ifra se sastoji od sljede�ih vrijednosti: (Northwind)
7111--1) Prva dva slova naziva proizvoda
7112--2) Karakter /
7113--3) Prva dva slova druge rije�i naziva kompanije dobavlja�a, uzeti u obzir one kompanije koje u nazivu imaju 2 ili 3 rije�i
7114--4) ID proizvoda po pravilu ukoliko se radi o jednocifrenom broju na njega dodati slovo 'a', u ostalim slu�ajevima dodati obrnutu vrijednost broja
7115--Npr. Za proizvod sa nazivom Chai i sa dobavlja�em naziva Exotic Liquids, �ifra �e btiti Ch/Li1a.
7116
7117USE Northwind
7118GO
7119SELECT
7120 P.ProductName,
7121 S.CompanyName,
7122 P.UnitsInStock,
7123 CONCAT(
7124 LEFT(P.ProductName, 2),
7125 '/',
7126 LEFT(SUBSTRING(S.CompanyName, CHARINDEX(' ', S.CompanyName) + 1, LEN(S.CompanyName)), 2),
7127 IIF(P.ProductID BETWEEN 1 AND 9, 'a', REVERSE(P.ProductID))
7128 ),
7129 -- Moze i sa +, meni bolje izgleda kad je grupisano pod CONCAT
7130 -- LEFT(P.ProductName, 2)
7131 -- + '/'
7132 -- + LEFT(SUBSTRING(S.CompanyName, CHARINDEX(' ', S.CompanyName) + 1, LEN(S.CompanyName)), 2)
7133 -- + IIF(P.ProductID BETWEEN 1 AND 9, 'a', REVERSE(P.ProductID)),
7134 P.ProductID
7135FROM Products AS P
7136INNER JOIN Suppliers AS S ON P.SupplierID = S.SupplierID
7137WHERE LEN(S.CompanyName) - LEN(REPLACE(S.CompanyName, ' ', '')) IN (1, 2)
7138
7139GO
7140-- 37 bodova
7141--5.
7142--a) (3 boda) U kreiranoj bazi kreirati index kojim �e se ubrzati pretraga prema �ifri i nazivu proizvoda. Napisati upit za potpuno iskori�tenje indexa.
7143USE brojIndexa
7144GO
7145
7146CREATE INDEX IX_Search_Products
7147ON Proizvodi(SifraProizvoda, Naziv)
7148
7149SELECT P.SifraProizvoda, P.Naziv
7150FROM Proizvodi AS P
7151WHERE P.SifraProizvoda LIKE 'F%' AND P.Naziv LIKE 'H%'
7152--b) (7 bodova) U kreiranoj bazi kreirati proceduru sp_search_products kojom �e se vratiti podaci o proizvodima na osnovu kategorije kojoj pripadaju ili te�ini.
7153--Korisnici ne moraju unijeti niti jedan od parametara ali u tom slu�aju procedura ne vra�a niti jedan od zapisa.
7154--Korisnicima unosom ve� prvog slova kategorije se trebaju osvje�iti zapisi, a vrijednost unesenog parametra te�ina �e vratiti one proizvode �ija te�ina je ve�a od unesene vrijednosti.
7155GO
7156CREATE PROCEDURE sp_search_products
7157(
7158 @Kategorija NVARCHAR(50)=NULL,
7159 @Tezina DECIMAL(18,2)=NULL
7160)
7161AS
7162BEGIN
7163 SELECT *
7164 FROM Proizvodi AS P
7165 WHERE P.NazivKategorije LIKE @Kategorija + '%' OR P.Tezina > @Tezina
7166END
7167GO
7168
7169
7170EXEC sp_search_products 'Clothing'
7171EXEC sp_search_products @Tezina = 2.2
7172
7173--c) (18 bodova) Zbog progla�enja dobitnika nagradne igre odr�ane u prva dva mjeseca drugog kvartala 2013 godine potrebno je kreirati upit. Upitom �e se prikazati tre�a najve�a narud�ba (vrijednost bez popusta) za svaki mjesec pojedina�no. Obzirom da je u pravilima nagradne igre potrebno nagraditi 2 osobe (mu�karca i �enu) za svaki mjesec, potrebno je u rezultatima upita prikazati pored navedenih stavki i o kojem se kupcu radi odnosno ime i prezime, te koju je nagradu osvojio. Nagrade se dodjeljuju po sljede�em pravilu:
7174--� za �ene u prvom mjesecu drugog kvartala je stoni mikser, dok je za mu�karce usisiva�
7175--� za �ene u drugom mjesecu drugog kvartala je pegla, dok je za mu�karc multicooker
7176-- Obzirom da za kupce nije eksplicitno naveden spol, odre�ivat �e se po pravilu: Ako je zadnje slovo imena a, smatra se da je osoba �enskog spola u suprotnom radi se o osobi mu�kog spola. Rezultate u formiranoj tabeli dobitnika sortirati prema vrijednosti narud�be u opadaju�em redoslijedu. (AdventureWorks2017)
7177--28 bodova
7178--6. Dokument teorija_28_06_2022, preimenovati va�im brojem indeksa, te u tom dokumentu izraditi pitanja.
7179--20 bodova
7180--SQL skriptu (bila prazna ili ne) imenovati Va�im brojem indeksa npr IB200001.sql, te istu zajedno sa .docx dokumentom kompromitovati u jednu datoteku naziva npr IB200001.zip i upload-ovati na ftp u folder Upload.
7181--Maksimalan broj bodova:100
7182--Prag prolaznosti: 55
7183GO
7184USE AdventureWorks2017
7185
7186SELECT *
7187FROM
7188 (SELECT TOP 1
7189 T1.SalesOrderID,
7190 T1.FirstName,
7191 T1.LastName,
7192 T1.[Ukupna vrijednost],
7193 T1.Nagrada
7194 FROM
7195 (SELECT TOP 3
7196 SOH.SalesOrderID,
7197 PP.FirstName,
7198 PP.LastName,
7199 SUM(SOD.UnitPrice * SOD.OrderQty) 'Ukupna vrijednost',
7200 'Stoni mikser' Nagrada
7201 FROM Sales.SalesOrderHeader AS SOH
7202 INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
7203 INNER JOIN Sales.Customer AS SC ON SOH.CustomerID = SC.CustomerID
7204 INNER JOIN Person.Person AS PP ON SC.PersonID = PP.BusinessEntityID
7205 WHERE YEAR(SOH.OrderDate) = 2013 AND MONTH(SOH.OrderDate) = 4 AND RIGHT(PP.FirstName, 1) = 'a'
7206 GROUP BY SOH.SalesOrderID, PP.FirstName, PP.LastName
7207 ORDER BY 'Ukupna vrijednost' DESC) AS T1
7208 ORDER BY 'Ukupna vrijednost' ASC) AS T2
7209UNION
7210SELECT *
7211FROM
7212 (SELECT TOP 1
7213 T1.SalesOrderID,
7214 T1.FirstName,
7215 T1.LastName,
7216 T1.[Ukupna vrijednost],
7217 T1.Nagrada
7218 FROM
7219 (SELECT TOP 3
7220 SOH.SalesOrderID,
7221 PP.FirstName,
7222 PP.LastName,
7223 SUM(SOD.UnitPrice * SOD.OrderQty) 'Ukupna vrijednost',
7224 'Usisiva�' Nagrada
7225 FROM Sales.SalesOrderHeader AS SOH
7226 INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
7227 INNER JOIN Sales.Customer AS SC ON SOH.CustomerID = SC.CustomerID
7228 INNER JOIN Person.Person AS PP ON SC.PersonID = PP.BusinessEntityID
7229 WHERE YEAR(SOH.OrderDate) = 2013 AND MONTH(SOH.OrderDate) = 4 AND RIGHT(PP.FirstName, 1) <> 'a'
7230 GROUP BY SOH.SalesOrderID, PP.FirstName, PP.LastName
7231 ORDER BY 'Ukupna vrijednost' DESC) AS T1
7232 ORDER BY 'Ukupna vrijednost' ASC) AS T2
7233UNION
7234SELECT *
7235FROM
7236 (SELECT TOP 1
7237 T1.SalesOrderID,
7238 T1.FirstName,
7239 T1.LastName,
7240 T1.[Ukupna vrijednost],
7241 T1.Nagrada
7242 FROM
7243 (SELECT TOP 3
7244 SOH.SalesOrderID,
7245 PP.FirstName,
7246 PP.LastName,
7247 SUM(SOD.UnitPrice * SOD.OrderQty) 'Ukupna vrijednost',
7248 'Pegla' Nagrada
7249 FROM Sales.SalesOrderHeader AS SOH
7250 INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
7251 INNER JOIN Sales.Customer AS SC ON SOH.CustomerID = SC.CustomerID
7252 INNER JOIN Person.Person AS PP ON SC.PersonID = PP.BusinessEntityID
7253 WHERE YEAR(SOH.OrderDate) = 2013 AND MONTH(SOH.OrderDate) = 5 AND RIGHT(PP.FirstName, 1) = 'a'
7254 GROUP BY SOH.SalesOrderID, PP.FirstName, PP.LastName
7255 ORDER BY 'Ukupna vrijednost' DESC) AS T1
7256 ORDER BY 'Ukupna vrijednost' ASC) AS T2
7257UNION
7258SELECT *
7259FROM
7260 (SELECT TOP 1
7261 T1.SalesOrderID,
7262 T1.FirstName,
7263 T1.LastName,
7264 T1.[Ukupna vrijednost],
7265 T1.Nagrada
7266 FROM
7267 (SELECT TOP 3
7268 SOH.SalesOrderID,
7269 PP.FirstName,
7270 PP.LastName,
7271 SUM(SOD.UnitPrice * SOD.OrderQty) 'Ukupna vrijednost',
7272 'Multicooker' Nagrada
7273 FROM Sales.SalesOrderHeader AS SOH
7274 INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
7275 INNER JOIN Sales.Customer AS SC ON SOH.CustomerID = SC.CustomerID
7276 INNER JOIN Person.Person AS PP ON SC.PersonID = PP.BusinessEntityID
7277 WHERE YEAR(SOH.OrderDate) = 2013 AND MONTH(SOH.OrderDate) = 5 AND RIGHT(PP.FirstName, 1) <> 'a'
7278 GROUP BY SOH.SalesOrderID, PP.FirstName, PP.LastName
7279 ORDER BY 'Ukupna vrijednost' DESC) AS T1
7280 ORDER BY 'Ukupna vrijednost' ASC) AS T2
7281
7282
7283-- Naredni kod nije Elda pisala
7284-- Usrana alternativa
7285GO
7286CREATE PROCEDURE Nagradna_Igra
7287 @NagradaM nvarchar(max),
7288 @NagradaZ nvarchar(max),
7289 @Spol varchar(1),
7290 @Godina int,
7291 @Mjesec int
7292AS
7293SELECT
7294 SOH.SalesOrderID,
7295 PP.FirstName,
7296 PP.LastName,
7297 SUM(SOD.UnitPrice * SOD.OrderQty) 'Ukupna vrijednost',
7298 IIF(@Spol = 'M' AND RIGHT(PP.FirstName, 1) <> 'a', @NagradaM, @NagradaZ) Nagrada
7299FROM Sales.SalesOrderHeader AS SOH
7300 INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
7301 INNER JOIN Sales.Customer AS SC ON SOH.CustomerID = SC.CustomerID
7302 INNER JOIN Person.Person AS PP ON SC.PersonID = PP.BusinessEntityID
7303WHERE YEAR(SOH.OrderDate) = @Godina
7304 AND MONTH(SOH.OrderDate) = @Mjesec
7305 AND ((@Spol = 'M' AND RIGHT(PP.FirstName, 1) <> 'a') OR (@Spol = 'Z' AND RIGHT(PP.FirstName, 1) = 'a'))
7306GROUP BY SOH.SalesOrderID, PP.FirstName, PP.LastName
7307ORDER BY 'Ukupna vrijednost' DESC
7308OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
7309GO
7310
7311
7312CREATE TABLE #Dobitnici
7313(
7314 SalesOrderID INT,
7315 FirstName VARCHAR(MAX),
7316 LastName VARCHAR(MAX),
7317 UkupnaVrijednost MONEY,
7318 Nagrada VARCHAR(MAX)
7319)
7320
7321INSERT INTO #Dobitnici
7322EXECUTE Nagradna_Igra @NagradaM = 'Multicooker', @NagradaZ = 'Pegla', @Godina = 2013, @Mjesec = 4, @Spol = 'M'
7323
7324INSERT INTO #Dobitnici
7325EXECUTE Nagradna_Igra @NagradaM = 'Multicooker', @NagradaZ = 'Pegla', @Godina = 2013, @Mjesec = 4, @Spol = 'Z'
7326
7327INSERT INTO #Dobitnici
7328EXECUTE Nagradna_Igra @NagradaM = 'Stoni mikser', @NagradaZ = 'Usisiva�', @Godina = 2013, @Mjesec = 5, @Spol = 'M'
7329
7330INSERT INTO #Dobitnici
7331EXECUTE Nagradna_Igra @NagradaM = 'Stoni mikser', @NagradaZ = 'Usisiva�', @Godina = 2013, @Mjesec = 5, @Spol = 'Z'
7332
7333SELECT * FROM #Dobitnici
7334
7335DROP TABLE #Dobitnici
7336
7337
7338
7339
7340use pubs
7341
7342select a.au_fname, a.au_lname, count(ta.title_id) as 'Ukupan broj naslova'
7343from pubs.dbo.authors as a
7344inner join pubs.dbo.titleauthor as ta
7345on a.au_id = ta.au_id
7346group by a.au_fname, a.au_lname
7347having COUNT(ta.title_id) >=2
7348order by 3 desc
7349
7350create view view_2
7351as
7352select t.title, t.type, t.price, s.qty, YEAR(s.ord_date) 'Godina prodaje', MONTH(s.ord_date) 'Mjesec prodaje', st.stor_name
7353from titles as t
7354inner join sales as s
7355on t.title_id = s.title_id
7356inner join stores as st
7357on s.stor_id = st.stor_id
7358where YEAR(s.ord_date) = 1994 and t.price between 10 and 20
7359
7360select*
7361from view_2
7362
7363create procedure proc_3(
7364@au_id varchar(11),
7365@au_lname varchar(40),
7366@au_fname varchar(20),
7367@phone char(12),
7368@address varchar(40),
7369@city varchar(20),
7370@state char(2),
7371@zip char(5),
7372@contract bit
7373)
7374as
7375begin
7376insert into authors
7377values (@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract)
7378end
7379
7380select*
7381from authors
7382exec proc_3 @au_id = '222-55-6851',
7383@au_lname = 'Gološ',
7384@au_fname = 'Kemal',
7385@phone = '062 967-6080',
7386@address = 'Blagaj bb',
7387@city = 'Mostar',
7388@state = 'MO',
7389@zip = '88201',
7390@contract = '1'
7391
7392create procedure proc_4(
7393@au_id varchar(11)
7394)
7395as
7396begin
7397delete from authors
7398where au_id = @au_id
7399end
7400
7401exec proc_4 @au_id = '222-55-6851'
7402select *
7403from authors
7404where au_id = '222-55-6851'
7405
7406
7407
7408
7409
7410
7411
7412--1
7413create database indeks2
7414go
7415use indeks2
7416
7417--2
7418--2a
7419create table Proizvodi
7420(
7421 ProizvodID int constraint PK_proizvod primary key,
7422 Naziv nvarchar (50) not null,
7423 SifraProizvoda nvarchar (25) not null,
7424 Boja nvarchar (15),
7425 NazivKategorije nvarchar (50) not null,
7426 Tezina decimal (8,2)
7427)
7428
7429--2b
7430create table ZaglavljeNarudzbe
7431(
7432 NaruzdbaID int constraint PK_zaglavljeNarudzbe primary key,
7433 DatumNarudzbe datetime not null,
7434 DatumIsporuke datetime,
7435 ImeKupca nvarchar (50) not null,
7436 PrezimeKupca nvarchar (50) not null,
7437 NazivTeritorije nvarchar (50) not null,
7438 NazivRegije nvarchar (50) not null,
7439 NacinIsporuke nvarchar (50) not null
7440)
7441
7442--2c
7443create table DetaljiNarudzbe
7444(
7445 NarudzbaID int constraint FK_DetNar_ZagNar foreign key (NarudzbaID) references ZaglavljeNarudzbe (NaruzdbaID),
7446 ProizvodID int constraint FK_DetNar_Proizv foreign key (ProizvodID) references Proizvodi (ProizvodID),
7447 Cijena money not null,
7448 Kolicina smallint not null,
7449 Popust money not null,
7450 constraint PK_DetaljiNarudzbe primary key (NarudzbaID, ProizvodID)
7451)
7452
7453--3
7454--3a
7455insert into Proizvodi
7456select p.ProductID,p.Name, p.ProductNumber, p.Color, pc.Name, p.Weight
7457from AdventureWorks2014.Production.Product as p inner join AdventureWorks2014.Production.ProductSubcategory as ps
7458on p.ProductSubcategoryID = ps.ProductSubcategoryID
7459 inner join AdventureWorks2014.Production.ProductCategory as pc
7460 on ps.ProductCategoryID = pc.ProductCategoryID
7461
7462--3b
7463insert into ZaglavljeNarudzbe
7464select soh.SalesOrderID, soh.OrderDate, soh.ShipDate, p.FirstName, p.LastName, st.Name, st.[Group], sm.Name
7465from AdventureWorks2014.Sales.SalesTerritory as st inner join AdventureWorks2014.Sales.SalesOrderHeader as soh
7466on st.TerritoryID = soh.TerritoryID
7467 inner join AdventureWorks2014.Purchasing.ShipMethod as sm
7468 on soh.ShipMethodID = sm.ShipMethodID
7469 inner join AdventureWorks2014.Sales.Customer as c
7470 on soh.CustomerID = c.CustomerID
7471 inner join AdventureWorks2014.Person.Person as p
7472 on c.PersonID = p.BusinessEntityID
7473
7474--3c
7475insert into DetaljiNarudzbe
7476select sod.SalesOrderID, sod.ProductID, sod.UnitPrice, sod.OrderQty, sod.UnitPriceDiscount
7477from AdventureWorks2014.Sales.SalesOrderDetail as sod
7478
7479
7480--4
7481--4a
7482select COUNT(e.BusinessEntityID) as 'ukupan broj zaposlenih', d.GroupName, DATEDIFF(year, e.HireDate, getdate()) as 'god radnog staža'
7483from AdventureWorks2014.HumanResources.Employee as e inner join AdventureWorks2014.HumanResources.EmployeeDepartmentHistory as edh
7484on e.BusinessEntityID = edh.BusinessEntityID
7485 inner join AdventureWorks2014.HumanResources.Department as d
7486 on edh.DepartmentID = d.DepartmentID
7487where DATEDIFF(year, e.HireDate, getdate()) > 10 and edh.EndDate is not null
7488group by d.GroupName, e.HireDate
7489order by 1 desc
7490
7491--4b
7492select MONTH(poh.OrderDate) 'mjesec', SUM(pod.StockedQty * pod.UnitPrice) as 'ukupna vrijednost robe', SUM(pod.ReceivedQty) as 'ukupna kolicina', poh.Freight, sm.Name
7493from AdventureWorks2014.Purchasing.PurchaseOrderDetail as pod inner join AdventureWorks2014.Purchasing.PurchaseOrderHeader as poh
7494on pod.PurchaseOrderID = poh.PurchaseOrderID
7495 inner join AdventureWorks2014.Purchasing.ShipMethod as sm
7496 on poh.ShipMethodID = sm.ShipMethodID
7497where poh.Freight between 500 and 2500 and sm.Name like '%CARGO%' and YEAR(poh.OrderDate) > '2012'
7498group by poh.Freight, sm.Name, poh.OrderDate
7499
7500--5c
7501select count (soh.SalesOrderID) as 'ukupno narudzbe', sp.BusinessEntityID, sod.UnitPriceDiscount, st.Name
7502from AdventureWorks2014.Sales.SalesOrderDetail as sod inner join AdventureWorks2014.Sales.SalesOrderHeader as soh
7503on sod.SalesOrderID = soh.SalesOrderID inner join AdventureWorks2014.Sales.SalesPerson as sp
7504 on soh.SalesPersonID = sp.BusinessEntityID inner join AdventureWorks2014.Sales.SalesTerritory as st
7505 on sp.TerritoryID = st.TerritoryID inner join AdventureWorks2014.HumanResources.Employee as e
7506 on sp.BusinessEntityID = e.BusinessEntityID
7507where (YEAR(soh.OrderDate) = 2011 or year(soh.OrderDate) = 2012) and st.Name in ('Canada', 'United Kingdom', 'France')
7508group by sp.BusinessEntityID, sod.UnitPriceDiscount, st.Name
7509
7510--5c
7511select p.ProductName, s.CompanyName, p.UnitsInStock, left(p.ProductName,2) + '/' +
7512 left(SUBSTRING(s.CompanyName, charindex(' ', s.CompanyName) + 1, LEN(s.CompanyName)),2) +
7513 IIF (p.ProductID between 1 and 9, 'a', reverse(p.ProductID)) as 'SifraProizvoda'
7514from Northwind.dbo.Suppliers as s inner join Northwind.dbo.Products as p
7515on s.SupplierID = p.SupplierID
7516
7517--5
7518--5a
7519create nonclustered index IX_sifra_naziv on Proizvodi
7520(
7521 SifraProizvoda asc,
7522 Naziv asc
7523)
7524
7525--5b
7526create procedure sp_search
7527(
7528 @Kategorija nvarchar (50) = null,
7529 @Tezina decimal (8,2) = null
7530)
7531as
7532begin
7533 select *
7534 from Proizvodi as p
7535 where p.NazivKategorije like @Kategorija + '%' or p.Tezina > @Tezina
7536end
7537go
7538
7539exec sp_search @Tezina = 2.2
7540exec sp_search @Kategorija = 'C'
7541
7542
7543
7544
7545--1 ZADATAK
7546
7547CREATE DATABASE Indeks
7548GO
7549USE Indeks
7550GO
7551
7552CREATE TABLE Narudzba
7553(
7554 NarudzbaID INT NOT NULL PRIMARY KEY (NarudzbaID),
7555 DatumNarudzbe DATE NULL,
7556 DatumPrijema DATE NULL,
7557 DatumIsporuke DATE NULL,
7558 TrosakPrevoza MONEY NULL,
7559 PunaAdresa NVARCHAR (70) NULL
7560)
7561
7562CREATE TABLE Dobavljac
7563(
7564 DobavljacID INT NOT NULL PRIMARY KEY (DobavljacID),
7565 NazivDobavljaca nvarchar(40) NOT NULL,
7566 PunaAdresa nvarchar(60) NULL,
7567 Drzava nvarchar(15) NULL,
7568
7569)
7570
7571CREATE TABLE Proizvod
7572(
7573 NarudzbaID INT NOT NULL CONSTRAINT FK_Proizvod_Narudzba FOREIGN KEY (NarudzbaID) REFERENCES Narudzba (NarudzbaID),
7574 DobavljacID INT NOT NULL CONSTRAINT FK_Proizvod_Dobavljac FOREIGN KEY (DobavljacID) REFERENCES Dobavljac (DobavljacID),
7575 ProizvodID INT NOT NULL,
7576 NazivProizvoda NVARCHAR (40) NOT NULL,
7577 Cijena INT NOT NULL,
7578 Kolicina INT NOT NULL,
7579 Popust DECIMAL (3,2) NOT NULL,
7580 Raspolozivost BIT NOT NULL,
7581 CONSTRAINT PK_Proizvod PRIMARY KEY (NarudzbaID, DobavljacID, ProizvodID)
7582)
7583--2 ZADATAK
7584
7585--2a
7586INSERT INTO Narudzba
7587SELECT o.OrderID, o.OrderDate, o.RequiredDate, o.ShippedDate,o.Freight, o.ShipAddress + ' '+ ISNULL(o.ShipPostalCode,'0000')+ ' '+o.ShipCity
7588FROM Northwind.dbo.Orders as o
7589WHERE YEAR(o.OrderDate)>=1997 AND o.ShippedDate IS NOT NULL
7590ORDER BY o.Freight
7591--657
7592
7593--2b
7594INSERT INTO Dobavljac
7595SELECT S.SupplierID, S.CompanyName, S.Address + S.PostalCode + S.City, S.Country
7596FROM Northwind.dbo.Suppliers as S
7597--29
7598
7599--2c
7600INSERT INTO Proizvod
7601SELECT OD.OrderID, P.SupplierID, P.ProductID, P.ProductName, OD.UnitPrice,OD.Quantity,OD.Discount,P.Discontinued
7602FROM Northwind.dbo.Products as P
7603inner join Northwind.dbo.[Order Details] as OD
7604on P.ProductID=OD.ProductID
7605inner join Northwind.dbo.Orders as O
7606on O.OrderID=OD.OrderID
7607WHERE OD.UnitPrice>10 AND OD.Discount>0 AND YEAR(O.OrderDate)>=1997 AND O.ShippedDate IS NOT NULL
7608--512
7609
7610--3 ZADATAK
7611--Iz tabele Proizvod dati pregled ukupnog broja ostvarenih narudzbi po dobavljaèu i proizvodu.
7612
7613SELECT P.DobavljacID,P.ProizvodID,COUNT(P.DobavljacID) AS 'Broj narudzbi'
7614FROM Proizvod AS P
7615GROUP BY P.DobavljacID,P.ProizvodID
7616ORDER BY 1
7617--62
7618
7619--4 ZADATAK
7620--Iz tabele Proizvod dati pregled ukupnog prometa ostvarenog po dobavljaèu i narudžbi uz uslov da se prikažu samo oni zapisi
7621--kod kojih je vrijednost prometa manja od 1000 i odobreni popust veæi od 10%. Ukupni promet izraèunati uz uzimanje u obzir i odobrenog popusta.
7622
7623SELECT P.DobavljacID,P.NarudzbaID,SUM(P.Cijena*P.Kolicina*(1-P.Popust)) AS Promet
7624FROM Proizvod AS P
7625WHERE P.Popust>0.1
7626GROUP BY P.DobavljacID,P.NarudzbaID
7627HAVING SUM(P.Cijena*P.Kolicina*(1-P.Popust))<1000
7628
7629--5 ZADATAK
7630--Iz tabele Narudzba dati pregled svih narudzbi kod kojih je broj dana od datuma narudžbe do datuma isporuke manji od 10.
7631--Pregled æe se sastojati od ID narudžbe, broja dana razlike i kalendarske godine,
7632--pri èemu je razdvojiti pregled po godinama - 1997 i 1998 (prvo sve 1997, zatim sve 1998).
7633--Sortirati po broju dana isporuke u opadajuæem redoslijedu.
7634
7635SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, YEAR (DatumIsporuke) AS Godina
7636FROM Narudzba
7637WHERE DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) < 10
7638ORDER BY 3, 2
7639--495
7640
7641SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike', '1997' AS 'Godina'
7642FROM Narudzba AS N
7643WHERE DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke)<10 AND YEAR(N.DatumIsporuke)=1997
7644UNION
7645SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike', '1998' AS 'Godina'
7646FROM Narudzba AS N
7647WHERE DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke)<10 AND YEAR(N.DatumIsporuke)=1998
7648ORDER BY 2 DESC
7649--495
7650
7651
7652
7653--6 ZADATAK
7654--Iz tabele Narudzba dati pregled svih narudzbi kod kojih je isporuka izvršena u istom mjesecu.
7655--Pregled æe se sastojati od ID narudžbe, broja dana razlike, mjeseca narudžbe, mjeseca isporuke i kalendarske godine,
7656--pri èemu je potrebno razdvojiti pregled po godinama (1997 i 1998 - prvo sve 1997, zatim sve 1998).
7657--Sortirati po broju dana isporuke u opadajuæem redoslijedu.
7658
7659SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike',
7660 MONTH(N.DatumNarudzbe) AS 'Mjesec narudzbe',MONTH(N.DatumIsporuke) AS 'Mjesec isporuke','1997' AS 'Godina'
7661FROM Narudzba AS N
7662WHERE MONTH(N.DatumNarudzbe)=MONTH(N.DatumIsporuke) AND YEAR(N.DatumIsporuke)=1997
7663UNION
7664SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike',
7665 MONTH(N.DatumNarudzbe) AS 'Mjesec narudzbe',MONTH(N.DatumIsporuke) AS 'Mjesec isporuke','1998' AS 'Godina'
7666FROM Narudzba AS N
7667WHERE MONTH(N.DatumNarudzbe)=MONTH(N.DatumIsporuke) AND YEAR(N.DatumIsporuke)=1998
7668ORDER BY 2 DESC
7669--464
7670
7671SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, MONTH (DatumIsporuke) AS MjesecNarudzbe,
7672MONTH (DatumNarudzbe) AS MjesecIsporuke, YEAR (DatumIsporuke) AS Godina
7673FROM Narudzba
7674WHERE MONTH (DatumIsporuke) = MONTH (DatumNarudzbe)
7675ORDER BY 5, 2
7676
7677
7678
7679
7680--7 ZADATAK
7681--Iz tabele Narudzba dati pregled svih narudžbi koje su isporuèene u Graz ili Köln.
7682--Pregled æe se sastojati od ID narudžbe i naziva grada. Sortirati po nazivu grada.
7683
7684SELECT N.PunaAdresa, RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) AS 'Naziv grada'
7685FROM Narudzba AS N
7686WHERE RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) IN('Graz', 'Köln')
7687ORDER BY 2
7688
7689
7690--8 ZADATAK
7691--Iz tabela Narudzba, Dobavljac i Proizvod kreirati pregled koji æe se sastojati od polja NarudzbaID,
7692--GodNarudzbe kao godinu iz polja DatumNarudzbe, NazivProizvoda, NazivDobavljaca, Drzava, TrosakPrevoza,
7693--Ukupno kao ukupna vrijednost narudžbe koja æe se raèunati uz uzimanje u obzir i popusta i postotak koji æe
7694--davati informaciju o vrijednosti postotka troška prevoza u odnosu na ukupnu vrijenost narudžbe. Uslov je da
7695--postotak bude veæi od 30% i da je ukupna vrijednost veæa od troška prevoza. Sortirati po vrijednosti postotka u opadajuæem redoslijedu.
7696
7697SELECT N.NarudzbaID,YEAR(N.DatumNarudzbe) AS 'GodNarudzbe', P.NazivProizvoda,D.NazivDobavljaca,D.Drzava,N.TrosakPrevoza,
7698P.Cijena*P.Kolicina*(1-P.Popust) AS 'Ukupna vrijednost',
7699LEFT (ROUND (N.TrosakPrevoza / (P.Cijena * P.Kolicina * (1 - P.Popust)) * 100, 2),5) AS Postotak
7700FROM Proizvod AS P INNER JOIN
7701 Narudzba AS N
7702 ON P.NarudzbaID=N.NarudzbaID
7703 JOIN Dobavljac AS D
7704 ON D.DobavljacID=P.DobavljacID
7705WHERE N.TrosakPrevoza / (P.Cijena * P.Kolicina * (1 - P.Popust)) * 100>30 AND P.Cijena*P.Kolicina*(1-p.Popust)>N.TrosakPrevoza
7706ORDER BY 8 DESC
7707
7708
7709--9 ZADATAK
7710--Iz tabela Narudzba, Dobavljac i Proizvod kreirati pogled koji æe sadržavati ID narudžbe, dan iz datuma prijema,
7711--raspoloživost, naziv grada iz pune adrese naruèitelja i državu dobavljaèa.
7712--Uslov je da je datum prijema u 2. ili 3. dekadi mjeseca i da grad naruèitelja Bergamo.
7713
7714CREATE VIEW view_9
7715AS
7716SELECT N.NarudzbaID, DAY(N.DatumPrijema) AS 'Dan', P.Raspolozivost,
7717N.PunaAdresa ,RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) AS 'Naziv grada', d.Drzava
7718FROM Proizvod AS P
7719 INNER JOIN Narudzba AS N
7720 ON P.NarudzbaID=N.NarudzbaID
7721 INNER JOIN Dobavljac AS D
7722 ON D.DobavljacID=P.DobavljacID
7723--WHERE DAY(N.DatumPrijema) BETWEEN 11 AND 31 AND RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) = 'Bergamo'
7724SELECT*
7725FROM view_9
7726--7
7727
7728
7729--10 ZADATAK
7730--Iz tabela Proizvod i Dobavljac kreirati proceduru proc1 koja æe sadržavati ID i naziv dobavljaèa i ukupan broj proizvoda
7731--koji je realizirao dobavljaè. Pokrenuti proceduru za vrijednost ukupno realiziranog broja proizvoda 22 i 14.
7732
7733ALTER PROCEDURE proc1
7734(
7735 @DobavljacID int = NULL,
7736 @NazivDobavljaca nvarchar(40) = NULL,
7737 @UkBroj int = NULL
7738)
7739AS
7740BEGIN
7741SELECT P.DobavljacID, D.NazivDobavljaca, COUNT (P.ProizvodID) AS Broj
7742FROM Proizvod AS P INNER JOIN Dobavljac AS D
7743ON P.DobavljacID = D.DobavljacID
7744--WHERE P.DobavljacID = @DobavljacID OR
7745-- NazivDobavljaca = @NazivDobavljaca OR
7746-- P.ProizvodID >= 0
7747GROUP BY P.DobavljacID, D.NazivDobavljaca
7748HAVING COUNT (P.ProizvodID) = @UkBroj --OR @UkBroj IS NULL
7749END
7750
7751EXEC proc1 @UkBroj=22
7752
7753
7754
7755
7756--1.
7757create database DodatniRok
7758go
7759use DodatniRok
7760go
7761
7762drop table Proizvodi
7763drop table ZaglavljeNarudzbe
7764drop table DetaljiNarudzbe
7765
7766
7767--2.
7768--a)
7769create table Proizvodi(
7770ProizvodID int not null primary key,
7771Naziv nvarchar(50) not null,
7772SifraProizvoda nvarchar(50) not null,
7773Boja nvarchar(15),
7774NazivKategorije nvarchar(50) not null,
7775Tezina dec(8,2)
7776)
7777--b)
7778create table ZaglavljeNarudzbe(
7779NarudzbaID int not null primary key,
7780DatumNarudzbe datetime not null,
7781DatumIsporuke datetime,
7782NazivTeritorije nvarchar(50) not null,
7783NazivRegije nvarchar(50) not null,
7784NacinIsporuke nvarchar(50) not null
7785)
7786--c)
7787create table DetaljiNarudzbe(
7788NarudzbaID int not null constraint FK_DetaljiNarudzbe_ZaglavljeNarudzbe foreign key (NarudzbaID) references ZaglavljeNarudzbe(NarudzbaID),
7789ProizvodID int not null constraint FK_DetaljiNaruzbe_Proizvodi foreign key (ProizvodID) references Proizvodi(ProizvodID),
7790Cijena money not null,
7791Kolicina smallint not null,
7792Popust money not null,
7793Constraint PK_DetaljiNarudzbe primary key(NarudzbaID, ProizvodID)
7794)
7795
7796--3.
7797--a)
7798insert into Proizvodi
7799select P.ProductID, P.Name, P.ProductNumber, ISNULL(P.Color, 'nije naznaceno') as 'Boja', PC.Name, P.Weight
7800from AdventureWorks2019.Production.Product as P
7801inner join AdventureWorks2019.Production.ProductSubcategory as SC
7802on P.ProductSubcategoryID = SC.ProductSubcategoryID
7803inner join AdventureWorks2019.Production.ProductCategory as PC
7804on SC.ProductCategoryID = PC.ProductCategoryID
7805--b)
7806insert into ZaglavljeNarudzbe
7807select SOH.SalesOrderID, SOH.OrderDate, SOH.ShipDate, ST.Name, ST.[Group], SM.Name
7808from AdventureWorks2019.Sales.SalesTerritory as ST
7809inner join AdventureWorks2019.Sales.SalesOrderHeader as SOH
7810on ST.TerritoryID = SOH.TerritoryID
7811inner join AdventureWorks2019.Purchasing.ShipMethod as SM
7812on SOH.ShipMethodID = SM.ShipMethodID
7813--c)
7814insert into DetaljiNarudzbe
7815select SOD.SalesOrderID, SOD.ProductID, SOD.UnitPrice, SOD.OrderQty, SOD.UnitPriceDiscount
7816from AdventureWorks2019.Sales.SalesOrderDetail as SOD
7817
7818--4.
7819--a)
7820create view v_proizvodi
7821as
7822select P.Naziv, P.SifraProizvoda, COUNT(P.ProizvodID) as 'Broj prodanih stavki', SUM(DN.Cijena*DN.Kolicina*(1-DN.Popust)) as 'Ukupna vrijednost sa popustom'
7823from Proizvodi as P
7824inner join DetaljiNarudzbe as DN
7825on P.ProizvodID = DN.ProizvodID
7826group by P.Naziv, P.SifraProizvoda, (DN.Cijena*DN.Kolicina*(1-DN.Popust))
7827 select*
7828from v_proizvodi
7829order by 4 desc
7830
7831--b)
7832select COUNT(EDH.BusinessEntityID) as 'Ukupan broj uposlenika', D.Name, DATEDIFF(YEAR, EDH.StartDate, GETDATE()) as 'Radni staz'
7833from AdventureWorks2019.HumanResources.EmployeeDepartmentHistory as EDH
7834inner join AdventureWorks2019.HumanResources.Department as D
7835on EDH.DepartmentID = D.DepartmentID
7836where DATEDIFF(YEAR, EDH.StartDate, GETDATE()) > 10
7837group by D.Name, DATEDIFF(YEAR, EDH.StartDate, GETDATE())
7838order by 1 desc
7839
7840--c)
7841select SUM(POD.ReceivedQty) as 'Ukupna kolicina primljene robe', SUM(POD.UnitPrice*POD.ReceivedQty) as 'Vrijednost robe',
7842MONTH(POD.DueDate) as 'Mjesec', YEAR(POD.DueDate) as 'Godina', SM.Name
7843from AdventureWorks2019.Purchasing.ShipMethod as SM
7844inner join AdventureWorks2019.Purchasing.PurchaseOrderHeader as POH
7845on SM.ShipMethodID = POH.ShipMethodID
7846 inner join AdventureWorks2019.Purchasing.PurchaseOrderDetail as POD
7847on POH.PurchaseOrderID = POD.PurchaseOrderID
7848where YEAR(POD.DueDate) = 2012 and POH.Freight between 500 and 2500 and SM.Name like '%CARGO%'
7849group by MONTH(POD.DueDate), YEAR(POD.DueDate), SM.Name
7850
7851select*
7852from AdventureWorks2019.Sales.SalesTerritory
7853
7854--d)
7855select COUNT(SOH.SalesOrderID) 'Ukupan broj narudzbi', YEAR(SOH.OrderDate) as 'Godina narudzbe', ST.Name
7856from AdventureWorks2019.Sales.SalesOrderHeader as SOH
7857inner join AdventureWorks2019.Sales.SalesTerritory as ST
7858on SOH.TerritoryID = ST.TerritoryID
7859where YEAR(SOH.OrderDate) = 2011 or YEAR(SOH.OrderDate) = 2012 and ST.Name in('United Kingdom', 'France', 'Canada')
7860group by YEAR(SOH.OrderDate), ST.Name
7861order by 1 desc
7862
7863select*
7864from AdventureWorks2019.Sales.SalesTerritory
7865
7866--5.
7867--a)
7868create nonclustered index IX_Naziv_Sifra on Proizvodi(
7869Naziv asc,
7870SifraProizvoda asc
7871)
7872
7873--b)
7874create procedure sp_insert(
7875@NarudzbaID int = null,
7876@ProizvodID int = null,
7877@Cijena money = null,
7878@Kolicina smallint = null,
7879@Popust money = null
7880)
7881as
7882begin
7883insert into DetaljiNarudzbe
7884values(@NarudzbaID, @ProizvodID, @Cijena, @Kolicina, @Popust)
7885end
7886
7887select*
7888from DetaljiNarudzbe
7889
7890exec sp_insert
7891@NarudzbaID = '43661',
7892@ProizvodID = '833',
7893@Cijena = '129.00',
7894@Kolicina = '1',
7895@Popust = '50.00'
7896
7897--c)
7898create procedure sp_search_products(
7899
7900)
7901
7902
7903
7904-- TABLE
7905CREATE TABLE demo (ID integer primary key, Name varchar(20), Hint text );
7906CREATE TABLE Dobavljac (
7907 DobavljacID INT PRIMARY KEY,
7908 NazivDobavljaca NVARCHAR(40) NOT NULL,
7909 PunaAdresa NVARCHAR(60),
7910 Drzava NVARCHAR(15)
7911);
7912CREATE TABLE Narudzba (
7913 NarudzbaID INT PRIMARY KEY,
7914 DatumNarudzbe DATE,
7915 DatumPrijema DATE,
7916 DatumIsporuke DATE,
7917 TrosakPrevoza DECIMAL(10,2),
7918 PunaAdresa NVARCHAR(70)
7919);
7920CREATE TABLE Proizvod (
7921 NarudzbaID INT,
7922 DobavljacID INT NOT NULL,
7923 ProizvodID INT NOT NULL,
7924 NazivProizvoda NVARCHAR(40) NOT NULL,
7925 Cijena INT NOT NULL,
7926 Kolicina INT NOT NULL,
7927 Popust DECIMAL(5,2) NOT NULL,
7928 Raspolozivost BIT NOT NULL,
7929 PRIMARY KEY (NarudzbaID, DobavljacID, ProizvodID),
7930 FOREIGN KEY (NarudzbaID) REFERENCES Narudzba(NarudzbaID),
7931 FOREIGN KEY (DobavljacID) REFERENCES Dobavljac(DobavljacID)
7932);
7933-- INDEX
7934-- TRIGGER
7935-- VIEW
7936
7937
7938--1.
7939go
7940create database BB200001
7941go
7942use BB200001
7943
7944--2.
7945--a)
7946create table Proizvodi(
7947ProizvodID int not null primary key,
7948Naziv nvarchar(50) not null,
7949SifraProizvoda nvarchar(25) not null,
7950Boja nvarchar(15),
7951NazivKategorije nvarchar(50) not null,
7952Tezina decimal(8,2)
7953)
7954
7955--b)
7956create table ZaglavljeNarudzbe(
7957NarudzbaID int not null primary key,
7958DatumNarudzbe datetime not null,
7959DatumIsporuke datetime,
7960NazivTeritorije nvarchar(50) not null,
7961NazivRegije nvarchar(50) not null,
7962NacinIsporuke nvarchar(50) not null
7963)
7964
7965--c)
7966create table DetaljiNarudzbe(
7967NarudzbaID int not null constraint FK_DetaljiNarudzbe_ZaglavljeNarudzbe foreign key (NarudzbaID) references ZaglavljeNarudzbe(NarudzbaID),
7968ProizvodID int not null constraint FK_DetaljiNarudzbe_Proizvodi foreign key (ProizvodID) references Proizvodi(ProizvodID),
7969Cijena money not null,
7970Kolicina smallint not null,
7971Popust money not null
7972constraint PK_DetaljiNarudzbe primary key(NarudzbaID, ProizvodID)
7973)
7974
7975--3.
7976--a)
7977insert into Proizvodi
7978select P.ProductID, P.Name, P.ProductNumber, ISNULL(P.Color, 'nije naznaceno') as 'Boja', PC.Name, P.Weight
7979from AdventureWorks2019.Production.Product as P
7980inner join AdventureWorks2019.Production.ProductSubcategory as PS
7981on P.ProductSubcategoryID = PS.ProductSubcategoryID
7982inner join AdventureWorks2019.Production.ProductCategory as PC
7983on PS.ProductCategoryID = PC.ProductCategoryID
7984
7985--b)
7986insert into ZaglavljeNarudzbe
7987select SOH.SalesOrderID, SOH.OrderDate, SOH.ShipDate, ST.Name, ST.[Group], SM.Name
7988from AdventureWorks2019.Sales.SalesTerritory as ST
7989inner join AdventureWorks2019.Sales.SalesOrderHeader as SOH
7990on ST.TerritoryID = SOH.TerritoryID
7991inner join AdventureWorks2019.Purchasing.ShipMethod as SM
7992on SOH.ShipMethodID = SM.ShipMethodID
7993
7994--c)
7995insert into DetaljiNarudzbe
7996select SOD.SalesOrderID, SOD.ProductID, SOD.UnitPrice, SOD.OrderQty, SOD.UnitPriceDiscount
7997from AdventureWorks2019.Sales.SalesOrderDetail as SOD
7998
7999--4.
8000--a)
8001create view v_proizvodi
8002as
8003select P.Naziv, P.SifraProizvoda, COUNT(P.ProizvodID) as 'Ukupan broj stavki', SUM(DN.Cijena*DN.Kolicina*(1-DN.Popust)) as 'Ukupna vrijednost'
8004from Proizvodi as P
8005inner join DetaljiNarudzbe as DN
8006on P.ProizvodID = DN.ProizvodID
8007group by P.Naziv, P.SifraProizvoda
8008
8009select*
8010from v_proizvodi
8011order by 4 desc
8012
8013--b)
8014select COUNT(E.BusinessEntityID) as 'Ukupan broj uposlenika', D.Name, DATEDIFF(YEAR, EDH.StartDate, GETDATE()) as 'Radni staz'
8015from AdventureWorks2019.HumanResources.Employee as E
8016inner join AdventureWorks2019.HumanResources.EmployeeDepartmentHistory as EDH
8017on E.BusinessEntityID = EDH.BusinessEntityID
8018inner join AdventureWorks2019.HumanResources.Department as D
8019on EDH.DepartmentID = D.DepartmentID
8020where DATEDIFF(YEAR, EDH.StartDate, GETDATE()) > 10
8021group by D.Name, DATEDIFF(YEAR, EDH.StartDate, GETDATE())
8022order by 1 desc
8023
8024--c)
8025select MONTH(POD.DueDate) as 'Mjesec', SUM(POD.ReceivedQty) as 'Ukupna količina', SUM(POD.UnitPrice*POD.OrderQty) as 'Ukupna vrijednost'
8026from AdventureWorks2019.Purchasing.ShipMethod as SM
8027inner join AdventureWorks2019.Purchasing.PurchaseOrderHeader as POH
8028on SM.ShipMethodID = POH.ShipMethodID
8029inner join AdventureWorks2019.Purchasing.PurchaseOrderDetail as POD
8030on POH.PurchaseOrderID = POD.PurchaseOrderID
8031where YEAR(POD.DueDate) = 2012 and POH.Freight between 500 and 2500 and SM.Name like '%CARGO%'
8032group by MONTH(POD.DueDate)
8033
8034--d)
8035select COUNT(SOH.SalesOrderID) as 'Ukupan broj', P.FirstName as 'Ime uposlenika', ST.Name
8036from AdventureWorks2019.Sales.SalesTerritory as ST
8037inner join AdventureWorks2019.Sales.SalesOrderHeader as SOH
8038on ST.TerritoryID = SOH.TerritoryID
8039inner join AdventureWorks2019.Person.Person as P
8040on SOH.SalesPersonID = P.BusinessEntityID
8041where (YEAR(SOH.OrderDate) = 2011 or YEAR(SOH.OrderDate) = 2012) and ST.Name in('United Kingdom', 'France', 'Canada')
8042group by P.FirstName, ST.Name
8043order by 1 desc
8044
8045
8046
8047go
8048create database Agregatne
8049go
8050create schema Funkcije
8051
8052create table Funkcije.Odjel(
8053OdjelID smallint not null constraint PK_OdjelID primary key (OdjelID) identity (1,1),
8054Naziv nvarchar(50) not null,
8055NazivSektora nvarchar(50) not null,
8056DatumKreiranja date not null
8057)
8058
8059insert into Funkcije.Odjel
8060select D.Name, D.GroupName, LEFT(D.ModifiedDate, 11)
8061from AdventureWorks2019.HumanResources.Department as D
8062where D.GroupName like 'Sales and Marketing' or D.GroupName like 'Research and Development'
8063order by D.GroupName
8064
8065create table Funkcije.AgrOdjel(
8066NazivSektora nvarchar(50) not null,
8067UkupnoSektor int
8068)
8069
8070insert into Funkcije.AgrOdjel
8071select D.GroupName, COUNT(D.GroupName) as 'Ukupan broj odjela po sektorima'
8072from AdventureWorks2019.HumanResources.Department as D
8073group by D.GroupName
8074
8075select YEAR(E.BirthDate) as GodRodj, COUNT(YEAR(E.BirthDate)) BrojPoGodinama,
8076YEAR(E.HireDate) as GodZap, COUNT(YEAR(E.HireDate)) BrojPoGod
8077from AdventureWorks2019.HumanResources.Employee as E
8078group by YEAR(E.BirthDate), YEAR(E.HireDate)
8079
8080SELECT LEFT (BirthDate,4) AS GodRodj,
8081COUNT (LEFT (BirthDate,4)) BrojRodj,
8082LEFT (HireDate,4) AS GodZap,
8083COUNT (LEFT (HireDate,4)) BrojZapos
8084FROM AdventureWorks2019.HumanResources.Employee as E
8085GROUP BY LEFT (BirthDate,4), LEFT (HireDate,4)
8086
8087select E.JobTitle, COUNT(E.JobTitle) as 'Ukupan broj'
8088from AdventureWorks2019.HumanResources.Employee as E
8089where E.JobTitle like '%manager%'
8090group by E.JobTitle
8091
8092
8093--1.
8094create database vjezba13_zadaci
8095use vjezba13_zadaci
8096
8097--2.
8098--a)
8099create table Proizvodi(
8100ProizvodID int not null primary key,
8101Naziv nvarchar(40) not null,
8102Cijena money not null,
8103KolicinaNaSkladistu smallint,
8104NazivKompanijeDobavljaca nvarchar(40) not null,
8105Raspolozivost bit not null
8106)
8107
8108--b)
8109create table Narudzbe(
8110NarudzbaID int not null primary key,
8111DatumNarudzbe date,
8112DatumPrijema date,
8113DatumIsporuke date,
8114Drzava nvarchar(15),
8115Regija nvarchar(15),
8116Grad nvarchar(15),
8117Adresa nvarchar(60)
8118)
8119
8120--c)
8121create table StavkeNarudzbe(
8122NarudzbaID int not null constraint FK_StavkeNarudzbe_Narudzbe foreign key (NarudzbaID) references Narudzbe(NarudzbaID),
8123ProizvodID int not null constraint FK_StavkeNarudzbe_Proizvodi foreign key (ProizvodID) references Proizvodi(ProizvodID),
8124Cijena money not null,
8125Kolicina smallint not null,
8126Popust real not null
8127constraint PK_StavkeNarudzbe primary key(NarudzbaID, ProizvodID)
8128)
8129
8130--3.
8131--a)
8132insert into Proizvodi
8133select P.ProductID, P.ProductName, P.UnitPrice, P.UnitsInStock, S.CompanyName, P.Discontinued
8134from Northwind.dbo.Products as P
8135inner join Northwind.dbo.Suppliers as S
8136on P.SupplierID = S.SupplierID
8137--77
8138
8139--b)
8140insert into Narudzbe
8141select O.OrderID, O.OrderDate, O.RequiredDate, O.ShippedDate, O.ShipCountry, ISNULL(O.ShipRegion, 'nije naznaceno'), O.ShipCity,O.ShipAddress
8142from Northwind.dbo.Orders as O
8143--830
8144
8145--c)
8146insert into StavkeNarudzbe
8147select OD.OrderID, OD.ProductID, OD.UnitPrice, OD.Quantity, OD.Discount
8148from Northwind.dbo.[Order Details] as OD
8149where OD.Quantity > 4
8150--1985
8151
8152--4
8153--a)
8154select*
8155from Proizvodi as P
8156where (P.Naziv like 'A%' or P.Naziv like 'C%') and P.Raspolozivost = 0
8157--9
8158
8159--b)
8160select N.NarudzbaID, YEAR(N.DatumNarudzbe) as 'Godina narudzbe', SUM(SN.Cijena*SN.Kolicina) as 'Ukupna vrijednost'
8161from Narudzbe as N
8162inner join StavkeNarudzbe as SN
8163on N.NarudzbaID = SN.NarudzbaID
8164where YEAR(N.DatumNarudzbe) = 1996
8165group by N.NarudzbaID, YEAR(N.DatumNarudzbe)
8166having SUM(SN.Cijena*SN.Kolicina) > 500
8167--104
8168
8169--c)
8170SELECT ST.Name,round(SUM(SOD.LineTotal),2) 'Ukupni promet'
8171FROM AdventureWorks2019.Sales.SalesTerritory AS ST
8172INNER JOIN AdventureWorks2019.Sales.SalesOrderHeader AS SOH
8173ON ST.TerritoryID=SOH.TerritoryID
8174INNER JOIN AdventureWorks2019.Sales.SalesOrderDetail AS SOD
8175ON SOH.SalesOrderID=SOD.SalesOrderID
8176GROUP BY ST.Name
8177--10
8178
8179--d)
8180select SOH.SalesOrderID, COUNT(*) as 'Broj stavki'
8181from AdventureWorks2019.Sales.SalesOrderHeader as SOH
8182inner join AdventureWorks2019.Sales.SalesOrderDetail as SOD
8183on SOH.SalesOrderID = SOD.SalesOrderID
8184where MONTH(SOH.OrderDate) = 6 and DAY(SOH.OrderDate) between 1 and 10
8185group by SOH.SalesOrderID
8186having COUNT(*) > 1
8187order by 2 desc
8188--386
8189
8190--e)
8191select P.ProductID, P.Name, P.ProductNumber,
8192SUBSTRING(P.ProductNumber, CHARINDEX('-', P.ProductNumber) + 1, LEN(P.ProductNumber)) + '/'
8193+ CONVERT(nvarchar(50), P.ProductID) as 'Sifra'
8194from AdventureWorks2019.Production.Product as P
8195where P.ProductID = 716
8196
8197--5.
8198--a)
8199create procedure sp_search_proizvodi(
8200@Naziv nvarchar(40) = null,
8201@Dobavljac nvarchar(50) = null
8202)
8203as
8204begin
8205select*
8206from Proizvodi as P
8207where (Naziv like @Naziv + '%' or @Naziv is null) and (NazivKompanijeDobavljaca like @Dobavljac + '%' or @Dobavljac is null)
8208end
8209
8210exec sp_search_proizvodi
8211--@Naziv = 'R',
8212@Dobavljac = 'P'
8213
8214--b)
8215create procedure sp_insert_stavke(
8216@NarudzbaID int = null,
8217@ProizvodID int = null,
8218@Cijena money = null,
8219@Kolicina smallint = null,
8220@Popust money = null
8221)
8222as
8223begin
8224insert into StavkeNarudzbe
8225values(@NarudzbaID, @ProizvodID, @Cijena, @Kolicina, @Popust)
8226end
8227
8228select*
8229from StavkeNarudzbe
8230
8231exec sp_insert_stavke
8232@NarudzbaID = '10248',
8233@ProizvodID = '13',
8234@Cijena = '15.30',
8235@Kolicina = '3',
8236@Popust = '0'
8237
8238--c)
8239create view pogled_narudzba
8240as
8241select SOH.SalesOrderID as 'ID Narudzbe', SOH.OrderDate as 'Datum narudzbe', P.FirstName + ' ' + P.LastName as 'Ime i prezime',
8242SUM(SOD.UnitPrice*SOD.OrderQty) as 'Ukupna vrijednost'
8243from AdventureWorks2019.Sales.SalesOrderHeader as SOH
8244inner join AdventureWorks2019.sales.SalesOrderDetail as SOD
8245on SOH.SalesOrderID = SOD.SalesOrderID
8246inner join AdventureWorks2019.Sales.Customer as C
8247on SOH.CustomerID = C.CustomerID
8248inner join AdventureWorks2019.Person.Person as P
8249on C.PersonID = P.BusinessEntityID
8250group by SOH.SalesOrderID, SOH.OrderDate, P.FirstName, P.LastName
8251
8252select*
8253from pogled_narudzba
8254order by 4 desc
8255
8256--d)
8257create index ix_selectPoNazivuProizvoda
8258on Proizvodi(Naziv)
8259
8260select Naziv
8261from Proizvodi
8262where Naziv like 'B%'
8263
8264--f)
8265
8266
8267
8268
8269--Vježba 13 :: Zadaci
8270
8271--1. Kroz SQL kod kreirati bazu podataka sa imenom vašeg broja indeksa.
8272CREATE DATABASE brojIndexa
8273GO
8274USE brojIndexa
8275--2. U kreiranoj bazi podataka kreirati tabele sa sljedeæom strukturom:
8276--a) Proizvodi
8277--• ProizvodID, cjelobrojna vrijednost i primarni kljuè
8278--• Naziv, 40 UNICODE karaktera (obavezan unos)
8279--• Cijena, novèani tip (obavezan unos)
8280--• KolièinaNaSkladistu, smallint
8281--• NazivKompanijeDobavljaca, 40 UNICODE (obavezan unos)
8282--• Raspolozivost, bit (obavezan unos)
8283CREATE TABLE Proizvodi
8284(
8285 ProizvodID INT NOT NULL PRIMARY KEY,
8286 Naziv NVARCHAR(40) NOT NULL,
8287 Cijena MONEY NOT NULL,
8288 KolièinaNaSkladistu SMALLINT,
8289 NazivKompanijeDobavljaca NVARCHAR(40) NOT NULL,
8290 Raspolozivost BIT NOT NULL
8291)
8292CREATE TABLE Narudzbe
8293(
8294 NarudzbaID INT NOT NULL PRIMARY KEY,
8295 DatumNarudzbe DATE,
8296 DatumPrijema DATE,
8297 DatumIsporuke DATE,
8298 Drzava NVARCHAR(15),
8299 Regija NVARCHAR(15),
8300 Grad NVARCHAR(15),
8301 Adresa NVARCHAR(60)
8302)
8303CREATE TABLE StavkeNarudzbe
8304(
8305 NarudzbaID INT CONSTRAINT FK_StavkeNarudzbe_Narudzbe FOREIGN KEY REFERENCES Narudzbe(NarudzbaID),
8306 ProizvodID INT CONSTRAINT FK_StavkeNarudzbe_Proizvodi FOREIGN KEY REFERENCES Proizvodi(ProizvodID),
8307 Cijena MONEY NOT NULL,
8308 Kolièina SMALLINT NOT NULL,
8309 Popust REAL NOT NULL,
8310 CONSTRAINT PK_StavkeNarudzbe PRIMARY KEY(NarudzbaID,ProizvodID)
8311)
8312--**Jedan proizvod se može naæi na više narudžbi, dok jedna narudžba može imati više proizvoda. U okviru jedne narudžbe jedan proizvod se ne može pojaviti više od jedanput.
8313
8314--3. Iz baze podataka Northwind u svoju bazu podataka prebaciti sljedeæe podatke:
8315--a) U tabelu Proizvodi dodati sve proizvode
8316--• ProductID -> ProizvodID
8317--• ProductName -> Naziv
8318--• UnitPrice -> Cijena
8319--• UnitsInStock -> KolicinaNaSkladistu
8320--• CompanyName -> NazivKompanijeDobavljaca
8321--• Discontinued -> Raspolozivost
8322INSERT INTO Proizvodi
8323SELECT P.ProductID,P.ProductName,P.UnitPrice,P.UnitsInStock,S.CompanyName,P.Discontinued
8324FROM Northwind.dbo.Products AS P
8325INNER JOIN Northwind.dbo.Suppliers AS S
8326ON P.SupplierID=S.SupplierID
8327--b) U tabelu Narudzbe dodati sve narudžbe, na mjestima gdje nema pohranjenih podataka o regiji zamijeniti vrijednost sa nije naznaceno
8328--• OrderID -> NarudzbaID
8329--• OrderDate -> DatumNarudzbe
8330--• RequiredDate -> DatumPrijema
8331--• ShippedDate -> DatumIsporuke
8332--• ShipCountry -> Drzava
8333--• ShipRegion -> Regija
8334--• ShipCity -> Grad
8335--• ShipAddress -> Adresa
8336INSERT INTO Narudzbe
8337SELECT O.OrderID,O.OrderDate,O.RequiredDate,O.ShippedDate,O.ShipCountry,ISNULL(O.ShipRegion,'nije naznaceno'),O.ShipCity,O.ShipAddress
8338FROM Northwind.dbo.Orders AS O
8339--c) U tabelu StavkeNarudzbe dodati sve stavke narudžbe gdje je kolièina veæa od 4
8340--• OrderID -> NarudzbaID
8341--• ProductID -> ProizvodID
8342--• UnitPrice -> Cijena
8343--• Quantity -> Kolièina
8344--• Discount -> Popust
8345INSERT INTO StavkeNarudzbe
8346SELECT OD.OrderID,OD.ProductID,OD.UnitPrice,OD.Quantity,OD.Quantity
8347FROM Northwind.dbo.[Order Details] AS OD
8348WHERE OD.Quantity>4
8349--4.
8350--a) Prikazati sve proizvode koji poèinju sa slovom a ili c a trenutno nisu raspoloživi.
8351SELECT*
8352FROM Proizvodi AS P
8353WHERE (P.Naziv LIKE 'A%' OR P.Naziv LIKE 'C%') AND P.Raspolozivost=0
8354--b) Prikazati narudžbe koje su kreirane 1996 godine i èija je ukupna vrijednost bez popusta veæa od 500KM.
8355SELECT N.NarudzbaID, SUM(SN.Cijena*SN.Kolièina) 'Ukupna vrijednost'
8356FROM Narudzbe AS N
8357INNER JOIN StavkeNarudzbe AS SN
8358ON N.NarudzbaID=SN.NarudzbaID
8359WHERE YEAR(N.DatumNarudzbe)=1996
8360GROUP BY N.NarudzbaID
8361HAVING SUM(SN.Cijena*SN.Kolièina)>500
8362select*
8363from StavkeNarudzbe
8364--c) Prikazati ukupni promet (uzimajuæi u obzir i popust) od narudžbi po teritorijama. (AdventureWorks2017)
8365SELECT ST.Name,round(SUM(SOD.LineTotal),2) 'Ukupni promet'
8366FROM AdventureWorks2017.Sales.SalesTerritory AS ST
8367INNER JOIN AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8368ON ST.TerritoryID=SOH.TerritoryID
8369INNER JOIN AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8370ON SOH.SalesOrderID=SOD.SalesOrderID
8371GROUP BY ST.Name
8372--d) Napisati upit koji æe prebrojati stavke narudžbe za svaku narudžbu pojedinaèno. U rezultatima prikazati ID narudžbe i broj stavki, te uzeti u obzir samo one narudžbe èiji je broj stavki veæi od 1, te koje su napravljene izmeðu 1.6. i 10.6. bilo koje godine. (AdventureWorks2017)
8373SELECT SOH.SalesOrderID,(SELECT COUNT(*)
8374 FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8375 WHERE SOD.SalesOrderID=SOH.SalesOrderID) 'Ukupno stavki'
8376FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8377WHERE MONTH(SOH.OrderDate)=6 AND DAY(SOH.OrderDate) BETWEEN 1 AND 10 AND (SELECT COUNT(*)
8378 FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8379 WHERE SOD.SalesOrderID=SOH.SalesOrderID)>1
8380ORDER BY 2 DESC
8381
8382--ILI
8383
8384SELECT SOH.SalesOrderID, COUNT(*) as BrojStavki
8385FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8386 INNER JOIN AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8387 ON SOH.SalesOrderID = SOD.SalesOrderID
8388WHERE MONTH(SOH.OrderDate) = 6
8389AND DAY(SOH.OrderDate) BETWEEN 1 and 10
8390GROUP BY SOH.SalesOrderID
8391HAVING COUNT(*) > 1
8392ORDER BY 2 DESC
8393--e) Napisati upit koji æe prikazati sljedeæe podatke o proizvodima: ID proizvoda, naziv proizvoda, šifru proizvoda, te novokreiranu šifru proizvoda. Nova šifra se sastoji od sljedeæih vrijednosti: (AdventureWorks2017)
8394--• Svi karakteri nakon prvog znaka - (crtica)
8395--• Karakter /
8396--• ID proizvoda
8397--Npr. Za proizvod sa ID-om 716 i šifrom LJ-0192-X, nova šifra æe biti 0192-X/716.
8398SELECT PP.ProductID, PP.Name, PP.ProductNumber,
8399SUBSTRING(ProductNumber, CHARINDEX('-', ProductNumber) + 1, LEN(ProductNumber)) + '/' + CONVERT(NVARCHAR(50), PP.ProductID) as Šifra
8400FROM AdventureWorks2017.Production.Product AS PP
8401WHERE PP.ProductID=716
8402
8403--5.
8404--a) Kreirati proceduru sp_search_proizvodi kojom æe se u tabeli Proizvodi uraditi pretraga proizvoda prema nazivu prizvoda ili nazivu dobavljaèa. Pretraga treba da radi i prilikom unosa bilo kojeg od slova, ne samo potpune rijeèi. Ukoliko korisnik ne unese ništa od navedenog vratiti sve zapise. Proceduru obavezno pokrenuti.
8405GO
8406CREATE PROCEDURE proc_search_proizvodi
8407(
8408@Naziv NVARCHAR(40)=NULL,
8409@Dobavljac NVARCHAR(50)=NULL
8410)
8411AS
8412BEGIN
8413SELECT * FROM Proizvodi as P
8414WHERE (Naziv LIKE @Naziv+'%' OR @Naziv IS NULL) AND (NazivKompanijeDobavljaca LIKE @Dobavljac+'%' OR @Dobavljac IS NULL)
8415END
8416
8417EXEC proc_search_proizvodi @Naziv='C'
8418--b) Kreirati proceduru sp_insert_stavkeNarudzbe koje æe vršiti insert nove stavke narudžbe u tabelu stavkeNarudzbe. Proceduru obavezno pokrenuti.
8419GO
8420CREATE PROCEDURE sp_insert_stavkeNarudzbe (
8421@NarudzbaID INT,
8422@ProizvodID INT,
8423@Cijena MONEY,
8424@Kolicina SMALLINT,
8425@Popust MONEY
8426)
8427AS
8428BEGIN
8429 INSERT INTO StavkeNarudzbe VALUES (@NarudzbaID, @ProizvodID, @Cijena, @Kolicina, @Popust)
8430END
8431GO
8432EXEC sp_insert_stavkeNarudzbe 10248, 1, 2, 2, 0.02
8433
8434SELECT*
8435FROM StavkeNarudzbe
8436WHERE NarudzbaID=10248
8437
8438--c) Kreirati view koji prikazuje sljedeæe kolone: ID narudžbe, datum narudžbe, spojeno ime i prezime kupca i ukupnu vrijednost narudžbe bez popusta. Podatke sortirati prema ukupnoj vrijednosti u opadajuæem redoslijedu. (AdventureWorks2017)
8439GO
8440CREATE VIEW view_5c AS
8441SELECT SOH.SalesOrderID 'ID narudžbe', SOH.OrderDate 'Datum narudžbe',PP.FirstName + ' '+ PP.LastName AS 'Ime i prezime',
8442SUM(SOD.UnitPrice*SOD.OrderQty) AS 'Vrijednost'
8443FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8444 INNER JOIN AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8445 ON SOH.SalesOrderID = SOD.SalesOrderID
8446 INNER JOIN AdventureWorks2017.Sales.Customer AS C
8447 ON SOH.CustomerID=C.CustomerID
8448 INNER JOIN AdventureWorks2017.Person.Person AS PP
8449 ON PP.BusinessEntityID=C.PersonID
8450GROUP BY SOH.SalesOrderID , SOH.OrderDate ,PP.FirstName , PP.LastName
8451GO
8452
8453SELECT*
8454FROM view_5c
8455ORDER BY Vrijednost DESC
8456--d) Kreirati okidaè kojim æe se onemoguæiti brisanje zapisa iz tabele StavkeNarudzbe. Korisnicima je potrebno ispisati poruku Arhivske zapise nije moguæe izbrisati.
8457GO
8458CREATE TRIGGER t_instead_delete
8459ON StavkeNarudzbe
8460INSTEAD OF DELETE
8461AS
8462BEGIN
8463 SELECT 'Arhivske zapise nije moguæe izbrisati'
8464END
8465DELETE
8466FROM StavkeNarudzbe
8467--e) Kreirati index kojim æe se ubrzati pretraga po nazivu proizvoda.
8468CREATE INDEX ix_selectByProductName
8469ON Proizvodi(Naziv)
8470
8471SELECT Naziv
8472FROM Proizvodi
8473WHERE Naziv LIKE 'A%'
8474--f) U tabeli StavkeNarudzbe kreirati polje ModifiedDate u kojem æe se nakon kreiranja okidaèa za izmjenu podataka spremati datum modifikacije podataka za konkretan red na kojem je izvršena modifikacija.
8475ALTER TABLE StavkeNarudzbe
8476ADD ModifiedDate DATE
8477GO
8478CREATE OR ALTER TRIGGER t_after_update
8479ON StavkeNarudzbe
8480AFTER UPDATE
8481AS
8482BEGIN
8483 UPDATE StavkeNarudzbe
8484 SET ModifiedDate=GETDATE()
8485 WHERE NarudzbaID IN (SELECT DISTINCT NarudzbaID FROM Inserted) AND ProizvodID IN (SELECT DISTINCT ProizvodID FROM Inserted)
8486END
8487
8488UPDATE StavkeNarudzbe
8489SET Cijena=1
8490WHERE NarudzbaID=10248 AND ProizvodID=1
8491
8492SELECT*
8493FROM StavkeNarudzbe
8494
8495--ALTER TABLE StavkeNarudzbe
8496--DROP COLUMN ModifiedDate
8497
8498
8499
8500--1.
8501go
8502create database vjezba_ispitni
8503go
8504use vjezba_ispitni
8505
8506--2.
8507--a)
8508create table Narudzba(
8509NarudzbaID int not null primary key,
8510DatumNarudzbe date,
8511DatumPrijema date,
8512DatumIsporuke date,
8513TrosakPrevoza money,
8514PunaAdresa nvarchar(70)
8515)
8516--b)
8517create table Dobavljac(
8518DobavljacID int not null primary key,
8519NazivDobavljaca nvarchar(40) not null,
8520PunaAdresa nvarchar(60),
8521Drzava nvarchar(15)
8522)
8523--c)
8524create table Proizvod(
8525NarudzbaID int not null constraint FK_Proizvod_Naruzba foreign key (NarudzbaID) references Narudzba(NarudzbaID),
8526DobavljacID int not null constraint FK_Proizvod_Dobavljac foreign key (DobavljacID) references Dobavljac(DobavljacID),
8527ProizvodID int not null,
8528NazivProizvoda nvarchar(40) not null,
8529Cijena int not null,
8530Kolicina int not null,
8531Popust decimal(3,2) not null,
8532Raspolozivost bit not null,
8533constraint PK_Proizvod primary key (NarudzbaID, DobavljacID, ProizvodID)
8534)
8535
8536--2.
8537--a)
8538insert into Narudzba
8539select O.OrderID, O.OrderDate, O.RequiredDate, O.ShippedDate, O.Freight, O.ShipAddress + ' ' + isnull(O.ShipPostalCode, '00000') + ' ' + O.ShipCity as 'Puna adresa'
8540from Northwind.dbo.Orders as O
8541where YEAR(O.OrderDate) >= 1997 and O.ShippedDate is not null
8542order by O.Freight
8543--b)
8544insert into Dobavljac
8545select S.SupplierID, S.CompanyName, S.Address + ' ' + S.PostalCode + ' ' + S.City as 'Puna adresa', S.Country
8546from Northwind.dbo.Suppliers as S
8547--c)
8548insert into Proizvod
8549select OD.OrderID, P.SupplierID, P.ProductID, P.ProductName, OD.UnitPrice, OD.Quantity, OD.Discount, P.Discontinued
8550from Northwind.dbo.Products as P
8551inner join Northwind.dbo.[Order Details] as OD
8552on P.ProductID = OD.ProductID
8553inner join Northwind.dbo.Orders as O
8554on OD.OrderID = O.OrderID
8555where OD.UnitPrice > 10 and OD.Discount > 0 and YEAR(O.OrderDate) >= 1997 and O.ShippedDate is not null
8556
8557--3.
8558select count(P.NarudzbaID) as 'Broj narudzbi', P.DobavljacID, P.ProizvodID
8559from Proizvod as P
8560group by P.DobavljacID, P.ProizvodID
8561order by 1
8562
8563--4.
8564select P.DobavljacID, P.NarudzbaID, SUM(P.Cijena*P.Kolicina*(1-P.Popust)) as 'Ukupni promet'
8565from Proizvod as P
8566where P.Popust > 0.1
8567group by P.DobavljacID, P.NarudzbaID
8568having SUM(P.Cijena*P.Kolicina*(1-P.Popust)) < 1000
8569
8570--5.
8571select N.NarudzbaID, DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) as 'Broj dana razlike', YEAR(N.DatumIsporuke) as 'Kalendarska godina'
8572from Narudzba as N
8573where DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) < 10
8574order by 3, 2
8575
8576select N.NarudzbaID, DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) as 'Broj dana razlike', '1997' as 'Kalendarska godina'
8577from Narudzba as N
8578where DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) < 10 and YEAR(N.DatumIsporuke) = 1997
8579union
8580select N.NarudzbaID, DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) as 'Broj dana razlike', '1998' as 'Kalendarska godina'
8581from Narudzba as N
8582where DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) < 10 and YEAR(N.DatumIsporuke) = 1998
8583order by 2 desc
8584
8585--6.
8586select N.NarudzbaID, DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) as 'Broj dana razlike', MONTH(N.DatumNarudzbe) as 'Mjesec narudzbe', MONTH(N.DatumIsporuke) as 'Mjesec isporuke', YEAR(N.DatumIsporuke) as 'Kalendarska godina'
8587from Narudzba as N
8588where MONTH(N.DatumNarudzbe) = MONTH(N.DatumIsporuke)
8589order by 5, 2
8590
8591select N.NarudzbaID, DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) as 'Broj dana razlike', MONTH(N.DatumNarudzbe) as 'Mjesec narudzbe', MONTH(N.DatumIsporuke) as 'Mjesec isporuke', '1997' as 'Kalendarska godina'
8592from Narudzba as N
8593where MONTH(N.DatumNarudzbe) = MONTH(N.DatumIsporuke) and YEAR(N.DatumIsporuke) = 1997
8594union
8595select N.NarudzbaID, DATEDIFF(DAY, N.DatumNarudzbe, N.DatumIsporuke) as 'Broj dana razlike', MONTH(N.DatumNarudzbe) as 'Mjesec narudzbe', MONTH(N.DatumIsporuke) as 'Mjesec isporuke', '1998' as 'Kalendarska godina'
8596from Narudzba as N
8597where MONTH(N.DatumNarudzbe) = MONTH(N.DatumIsporuke) and YEAR(N.DatumIsporuke) = 1998
8598order by 2 desc
8599
8600--7.
8601select N.NarudzbaID, RIGHT(N.PunaAdresa, CHARINDEX(' ', REVERSE(N.PunaAdresa))-1) as 'Naziv grada'
8602from Narudzba as N
8603where RIGHT(N.PunaAdresa, CHARINDEX(' ', REVERSE(N.PunaAdresa))-1) in('Graz', 'Köln')
8604order by 2
8605
8606--8.
8607select N.NarudzbaID, YEAR(N.DatumNarudzbe) as 'Godina narudzbe', P.NazivProizvoda, D.NazivDobavljaca, D.Drzava, N.TrosakPrevoza, (P.Cijena*P.Kolicina*(1-P.Popust)) as 'Ukupno',
8608LEFT(ROUND(N.TrosakPrevoza/(P.Cijena*P.Kolicina*(1-P.Popust))*100, 2), 5) as 'Postotak'
8609from Narudzba as N
8610inner join Proizvod as P
8611on N.NarudzbaID = P.NarudzbaID
8612inner join Dobavljac as D
8613on P.DobavljacID = D.DobavljacID
8614where N.TrosakPrevoza/(P.Cijena*P.Kolicina*(1-P.Popust))* 100 > 30 and (P.Cijena*P.Kolicina*(1-P.Popust)) > N.TrosakPrevoza
8615order by 8 desc
8616
8617--9.
8618create view pogled1
8619as
8620select N.NarudzbaID, DAY(N.DatumPrijema) as 'Dan prijema', P.Raspolozivost, RIGHT(N.PunaAdresa, CHARINDEX(' ', REVERSE(N.PunaAdresa))-1) as 'Naziv grada', D.Drzava
8621from Narudzba as N
8622inner join Proizvod as P
8623on N.NarudzbaID = P.NarudzbaID
8624inner join Dobavljac as D
8625on P.DobavljacID = D.DobavljacID
8626where DAY(N.DatumPrijema) between 11 and 31 and RIGHT(N.PunaAdresa, CHARINDEX(' ', REVERSE(N.PunaAdresa))-1) = 'Bergamo'
8627
8628select*
8629from pogled1
8630
8631--10.
8632create procedure proc1(
8633@DobavljacID int = null,
8634@NazivDobavljaca nvarchar(40) = null,
8635@UkupanBrojPr int = null
8636)
8637as
8638begin
8639select P.DobavljacID, D.NazivDobavljaca, COUNT(P.ProizvodID) as 'UkupanBrojPr'
8640from Proizvod as P
8641inner join Dobavljac as D
8642on P.DobavljacID = D.DobavljacID
8643where P.DobavljacID = @DobavljacID
8644or D.NazivDobavljaca = @NazivDobavljaca
8645or P.ProizvodID >= 0
8646group by P.DobavljacID, D.NazivDobavljaca
8647having COUNT(P.ProizvodID) = @UkupanBrojPr or @UkupanBrojPr is null
8648end
8649
8650exec proc1 @UkupanBrojPr = 22
8651exec proc1 @UkupanBrojPr = 14
8652
8653
8654
8655go
8656create database treci_online_test
8657go
8658use treci_online_test
8659
8660--Zadatak 1.
8661select a.au_fname as 'Ime', a.au_lname as 'Prezime', COUNT(ta.title_id) as 'Ukupan broj naslova'
8662from pubs.dbo.authors as a
8663inner join pubs.dbo.titleauthor as ta
8664on a.au_id = ta.au_id
8665inner join pubs.dbo.titles as t
8666on ta.title_id = t.title_id
8667group by a.au_fname, a.au_lname
8668having COUNT(ta.title_id) >= 2
8669order by 3 desc
8670--6
8671
8672--Zadatak 2.
8673create view view_2
8674as
8675select t.title as 'Naziv naslova', t.type as 'Naziv(tip)', t.price as 'Cijena', s.qty as 'Kolicina',
8676YEAR(s.ord_date) as 'Godina prodaje', MONTH(s.ord_date) as 'Mjesec prodaje', st.stor_name as 'Naziv prodavnice'
8677from pubs.dbo.titles as t
8678inner join pubs.dbo.sales as s
8679on t.title_id = s.title_id
8680inner join pubs.dbo.stores as st
8681on s.stor_id = st.stor_id
8682where YEAR(s.ord_date) = 1994 and t.price between 10 and 20
8683
8684select*
8685from view_2
8686
8687--Zadatak 3.
8688create procedure proc_3(
8689@au_id varchar(11),
8690@au_lname varchar(40),
8691@au_fname varchar(20),
8692@phone char(12),
8693@address varchar(40),
8694@city varchar(20),
8695@state char(2),
8696@zip char(5),
8697@contract bit
8698)
8699as
8700begin
8701insert into pubs.dbo.authors
8702values (@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract)
8703end
8704
8705select*
8706from pubs.dbo.authors
8707exec proc_3
8708@au_id = '222-55-6851',
8709@au_lname = 'Gološ',
8710@au_fname = 'Kemal',
8711@phone = '062 967-6080',
8712@address = 'Blagaj bb',
8713@city = 'Mostar',
8714@state = 'MO',
8715@zip = '88201',
8716@contract = '1'
8717
8718--Zadatak 4.
8719create procedure proc_4(
8720@au_id varchar(11)
8721)
8722as
8723begin
8724delete from pubs.dbo.authors
8725where au_id = @au_id
8726end
8727
8728exec proc_4
8729@au_id = '222-55-6851'
8730
8731select*
8732from pubs.dbo.authors
8733where au_id = '222-55-6851'
8734
8735
8736
8737
8738--Vježba 13 :: Zadaci
8739
8740--1. Kroz SQL kod kreirati bazu podataka sa imenom vašeg broja indeksa.
8741CREATE DATABASE brojIndexa
8742GO
8743USE brojIndexa
8744--2. U kreiranoj bazi podataka kreirati tabele sa sljedeæom strukturom:
8745--a) Proizvodi
8746--• ProizvodID, cjelobrojna vrijednost i primarni kljuè
8747--• Naziv, 40 UNICODE karaktera (obavezan unos)
8748--• Cijena, novèani tip (obavezan unos)
8749--• KolièinaNaSkladistu, smallint
8750--• NazivKompanijeDobavljaca, 40 UNICODE (obavezan unos)
8751--• Raspolozivost, bit (obavezan unos)
8752CREATE TABLE Proizvodi
8753(
8754 ProizvodID INT NOT NULL PRIMARY KEY,
8755 Naziv NVARCHAR(40) NOT NULL,
8756 Cijena MONEY NOT NULL,
8757 KolièinaNaSkladistu SMALLINT,
8758 NazivKompanijeDobavljaca NVARCHAR(40) NOT NULL,
8759 Raspolozivost BIT NOT NULL
8760)
8761CREATE TABLE Narudzbe
8762(
8763 NarudzbaID INT NOT NULL PRIMARY KEY,
8764 DatumNarudzbe DATE,
8765 DatumPrijema DATE,
8766 DatumIsporuke DATE,
8767 Drzava NVARCHAR(15),
8768 Regija NVARCHAR(15),
8769 Grad NVARCHAR(15),
8770 Adresa NVARCHAR(60)
8771)
8772CREATE TABLE StavkeNarudzbe
8773(
8774 NarudzbaID INT CONSTRAINT FK_StavkeNarudzbe_Narudzbe FOREIGN KEY REFERENCES Narudzbe(NarudzbaID),
8775 ProizvodID INT CONSTRAINT FK_StavkeNarudzbe_Proizvodi FOREIGN KEY REFERENCES Proizvodi(ProizvodID),
8776 Cijena MONEY NOT NULL,
8777 Kolièina SMALLINT NOT NULL,
8778 Popust REAL NOT NULL,
8779 CONSTRAINT PK_StavkeNarudzbe PRIMARY KEY(NarudzbaID,ProizvodID)
8780)
8781--**Jedan proizvod se može naæi na više narudžbi, dok jedna narudžba može imati više proizvoda. U okviru jedne narudžbe jedan proizvod se ne može pojaviti više od jedanput.
8782
8783--3. Iz baze podataka Northwind u svoju bazu podataka prebaciti sljedeæe podatke:
8784--a) U tabelu Proizvodi dodati sve proizvode
8785--• ProductID -> ProizvodID
8786--• ProductName -> Naziv
8787--• UnitPrice -> Cijena
8788--• UnitsInStock -> KolicinaNaSkladistu
8789--• CompanyName -> NazivKompanijeDobavljaca
8790--• Discontinued -> Raspolozivost
8791INSERT INTO Proizvodi
8792SELECT P.ProductID,P.ProductName,P.UnitPrice,P.UnitsInStock,S.CompanyName,P.Discontinued
8793FROM Northwind.dbo.Products AS P
8794INNER JOIN Northwind.dbo.Suppliers AS S
8795ON P.SupplierID=S.SupplierID
8796--b) U tabelu Narudzbe dodati sve narudžbe, na mjestima gdje nema pohranjenih podataka o regiji zamijeniti vrijednost sa nije naznaceno
8797--• OrderID -> NarudzbaID
8798--• OrderDate -> DatumNarudzbe
8799--• RequiredDate -> DatumPrijema
8800--• ShippedDate -> DatumIsporuke
8801--• ShipCountry -> Drzava
8802--• ShipRegion -> Regija
8803--• ShipCity -> Grad
8804--• ShipAddress -> Adresa
8805INSERT INTO Narudzbe
8806SELECT O.OrderID,O.OrderDate,O.RequiredDate,O.ShippedDate,O.ShipCountry,ISNULL(O.ShipRegion,'nije naznaceno'),O.ShipCity,O.ShipAddress
8807FROM Northwind.dbo.Orders AS O
8808--c) U tabelu StavkeNarudzbe dodati sve stavke narudžbe gdje je kolièina veæa od 4
8809--• OrderID -> NarudzbaID
8810--• ProductID -> ProizvodID
8811--• UnitPrice -> Cijena
8812--• Quantity -> Kolièina
8813--• Discount -> Popust
8814INSERT INTO StavkeNarudzbe
8815SELECT OD.OrderID,OD.ProductID,OD.UnitPrice,OD.Quantity,OD.Quantity
8816FROM Northwind.dbo.[Order Details] AS OD
8817WHERE OD.Quantity>4
8818--4.
8819--a) Prikazati sve proizvode koji poèinju sa slovom a ili c a trenutno nisu raspoloživi.
8820SELECT*
8821FROM Proizvodi AS P
8822WHERE (P.Naziv LIKE 'A%' OR P.Naziv LIKE 'C%') AND P.Raspolozivost=0
8823--b) Prikazati narudžbe koje su kreirane 1996 godine i èija je ukupna vrijednost bez popusta veæa od 500KM.
8824SELECT N.NarudzbaID, SUM(SN.Cijena*SN.Kolièina) 'Ukupna vrijednost'
8825FROM Narudzbe AS N
8826INNER JOIN StavkeNarudzbe AS SN
8827ON N.NarudzbaID=SN.NarudzbaID
8828WHERE YEAR(N.DatumNarudzbe)=1996
8829GROUP BY N.NarudzbaID
8830HAVING SUM(SN.Cijena*SN.Kolièina)>500
8831select*
8832from StavkeNarudzbe
8833--c) Prikazati ukupni promet (uzimajuæi u obzir i popust) od narudžbi po teritorijama. (AdventureWorks2017)
8834SELECT ST.Name,round(SUM(SOD.LineTotal),2) 'Ukupni promet'
8835FROM AdventureWorks2017.Sales.SalesTerritory AS ST
8836INNER JOIN AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8837ON ST.TerritoryID=SOH.TerritoryID
8838INNER JOIN AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8839ON SOH.SalesOrderID=SOD.SalesOrderID
8840GROUP BY ST.Name
8841--d) Napisati upit koji æe prebrojati stavke narudžbe za svaku narudžbu pojedinaèno. U rezultatima prikazati ID narudžbe i broj stavki, te uzeti u obzir samo one narudžbe èiji je broj stavki veæi od 1, te koje su napravljene izmeðu 1.6. i 10.6. bilo koje godine. (AdventureWorks2017)
8842SELECT SOH.SalesOrderID,(SELECT COUNT(*)
8843 FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8844 WHERE SOD.SalesOrderID=SOH.SalesOrderID) 'Ukupno stavki'
8845FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8846WHERE MONTH(SOH.OrderDate)=6 AND DAY(SOH.OrderDate) BETWEEN 1 AND 10 AND (SELECT COUNT(*)
8847 FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8848 WHERE SOD.SalesOrderID=SOH.SalesOrderID)>1
8849ORDER BY 2 DESC
8850
8851--ILI
8852
8853SELECT SOH.SalesOrderID, COUNT(*) as BrojStavki
8854FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8855 INNER JOIN AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8856 ON SOH.SalesOrderID = SOD.SalesOrderID
8857WHERE MONTH(SOH.OrderDate) = 6
8858AND DAY(SOH.OrderDate) BETWEEN 1 and 10
8859GROUP BY SOH.SalesOrderID
8860HAVING COUNT(*) > 1
8861ORDER BY 2 DESC
8862--e) Napisati upit koji æe prikazati sljedeæe podatke o proizvodima: ID proizvoda, naziv proizvoda, šifru proizvoda, te novokreiranu šifru proizvoda. Nova šifra se sastoji od sljedeæih vrijednosti: (AdventureWorks2017)
8863--• Svi karakteri nakon prvog znaka - (crtica)
8864--• Karakter /
8865--• ID proizvoda
8866--Npr. Za proizvod sa ID-om 716 i šifrom LJ-0192-X, nova šifra æe biti 0192-X/716.
8867SELECT PP.ProductID, PP.Name, PP.ProductNumber,
8868SUBSTRING(ProductNumber, CHARINDEX('-', ProductNumber) + 1, LEN(ProductNumber)) + '/' + CONVERT(NVARCHAR(50), PP.ProductID) as Šifra
8869FROM AdventureWorks2017.Production.Product AS PP
8870WHERE PP.ProductID=716
8871
8872--5.
8873--a) Kreirati proceduru sp_search_proizvodi kojom æe se u tabeli Proizvodi uraditi pretraga proizvoda prema nazivu prizvoda ili nazivu dobavljaèa. Pretraga treba da radi i prilikom unosa bilo kojeg od slova, ne samo potpune rijeèi. Ukoliko korisnik ne unese ništa od navedenog vratiti sve zapise. Proceduru obavezno pokrenuti.
8874GO
8875CREATE PROCEDURE proc_search_proizvodi
8876(
8877@Naziv NVARCHAR(40)=NULL,
8878@Dobavljac NVARCHAR(50)=NULL
8879)
8880AS
8881BEGIN
8882SELECT * FROM Proizvodi as P
8883WHERE (Naziv LIKE @Naziv+'%' OR @Naziv IS NULL) AND (NazivKompanijeDobavljaca LIKE @Dobavljac+'%' OR @Dobavljac IS NULL)
8884END
8885
8886EXEC proc_search_proizvodi @Naziv='C'
8887--b) Kreirati proceduru sp_insert_stavkeNarudzbe koje æe vršiti insert nove stavke narudžbe u tabelu stavkeNarudzbe. Proceduru obavezno pokrenuti.
8888GO
8889CREATE PROCEDURE sp_insert_stavkeNarudzbe (
8890@NarudzbaID INT,
8891@ProizvodID INT,
8892@Cijena MONEY,
8893@Kolicina SMALLINT,
8894@Popust MONEY
8895)
8896AS
8897BEGIN
8898 INSERT INTO StavkeNarudzbe VALUES (@NarudzbaID, @ProizvodID, @Cijena, @Kolicina, @Popust)
8899END
8900GO
8901EXEC sp_insert_stavkeNarudzbe 10248, 1, 2, 2, 0.02
8902
8903SELECT*
8904FROM StavkeNarudzbe
8905WHERE NarudzbaID=10248
8906
8907--c) Kreirati view koji prikazuje sljedeæe kolone: ID narudžbe, datum narudžbe, spojeno ime i prezime kupca i ukupnu vrijednost narudžbe bez popusta. Podatke sortirati prema ukupnoj vrijednosti u opadajuæem redoslijedu. (AdventureWorks2017)
8908GO
8909CREATE VIEW view_5c AS
8910SELECT SOH.SalesOrderID 'ID narudžbe', SOH.OrderDate 'Datum narudžbe',PP.FirstName + ' '+ PP.LastName AS 'Ime i prezime',
8911SUM(SOD.UnitPrice*SOD.OrderQty) AS 'Vrijednost'
8912FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
8913 INNER JOIN AdventureWorks2017.Sales.SalesOrderDetail AS SOD
8914 ON SOH.SalesOrderID = SOD.SalesOrderID
8915 INNER JOIN AdventureWorks2017.Sales.Customer AS C
8916 ON SOH.CustomerID=C.CustomerID
8917 INNER JOIN AdventureWorks2017.Person.Person AS PP
8918 ON PP.BusinessEntityID=C.PersonID
8919GROUP BY SOH.SalesOrderID , SOH.OrderDate ,PP.FirstName , PP.LastName
8920GO
8921
8922SELECT*
8923FROM view_5c
8924ORDER BY Vrijednost DESC
8925--d) Kreirati okidaè kojim æe se onemoguæiti brisanje zapisa iz tabele StavkeNarudzbe. Korisnicima je potrebno ispisati poruku Arhivske zapise nije moguæe izbrisati.
8926GO
8927CREATE TRIGGER t_instead_delete
8928ON StavkeNarudzbe
8929INSTEAD OF DELETE
8930AS
8931BEGIN
8932 SELECT 'Arhivske zapise nije moguæe izbrisati'
8933END
8934DELETE
8935FROM StavkeNarudzbe
8936--e) Kreirati index kojim æe se ubrzati pretraga po nazivu proizvoda.
8937CREATE INDEX ix_selectByProductName
8938ON Proizvodi(Naziv)
8939
8940SELECT Naziv
8941FROM Proizvodi
8942WHERE Naziv LIKE 'A%'
8943--f) U tabeli StavkeNarudzbe kreirati polje ModifiedDate u kojem æe se nakon kreiranja okidaèa za izmjenu podataka spremati datum modifikacije podataka za konkretan red na kojem je izvršena modifikacija.
8944ALTER TABLE StavkeNarudzbe
8945ADD ModifiedDate DATE
8946GO
8947CREATE OR ALTER TRIGGER t_after_update
8948ON StavkeNarudzbe
8949AFTER UPDATE
8950AS
8951BEGIN
8952 UPDATE StavkeNarudzbe
8953 SET ModifiedDate=GETDATE()
8954 WHERE NarudzbaID IN (SELECT DISTINCT NarudzbaID FROM Inserted) AND ProizvodID IN (SELECT DISTINCT ProizvodID FROM Inserted)
8955END
8956
8957UPDATE StavkeNarudzbe
8958SET Cijena=1
8959WHERE NarudzbaID=10248 AND ProizvodID=1
8960
8961SELECT*
8962FROM StavkeNarudzbe
8963
8964--ALTER TABLE StavkeNarudzbe
8965--DROP COLUMN ModifiedDate
8966
8967
8968
8969
8970create database vježba
8971go
8972
8973use vježba
8974
8975create table Proizvodi(
8976ProizvodID int not null primary key,
8977Naziv nvarchar(40) not null,
8978Cijena money not null,
8979Koli?inaNaSkladištu smallint,
8980NazivKompanijeDobavlja?a nvarchar(40) not null,
8981Raspoloživost bit not null
8982)
8983
8984create table Narudžbe(
8985NarudzbaID int not null primary key,
8986DatumNarudzbe date,
8987DatumPrijema date,
8988DatumIpsoruke date,
8989Drzava nvarchar(15),
8990Regija nvarchar(15),
8991Grad nvarchar(15),
8992Adresa nvarchar(60)
8993)
8994
8995create table StavkeNarudzbe(
8996NarudzbaID int constraint FK_StavkeNarudzbe_Narudzbe foreign key references Narudžbe(NarudzbaID),
8997ProizvodID int constraint FK_StavkeNarudzbe_Proizvodi foreign key references Proizvodi(ProizvodID),
8998Cijena money not null,
8999Koli?ina smallint not null,
9000Popust real not null,
9001constraint PK_StavkeNarudzbe primary key(NarudzbaID, ProizvodID)
9002)
9003
9004insert into Proizvodi
9005select P.ProductID, P.ProductName, P.UnitPrice, P.UnitsInStock, S.CompanyName, P.Discontinued
9006from Northwind.dbo.Products as P
9007inner join Northwind.dbo.Suppliers as S
9008on P.SupplierID = S.SupplierID
9009
9010insert into Narudžbe
9011select O.OrderID, O.OrderDate, O.RequiredDate, O.ShippedDate, O.ShipCountry, O.ShipRegion, O.ShipCity, O.ShipAddress
9012from Northwind.dbo.Orders as O
9013
9014insert into StavkeNarudzbe
9015select OD.OrderID, OD.ProductID, OD.UnitPrice, OD.Quantity, OD.Discount
9016from Northwind.dbo.[Order Details] as OD
9017
9018select*
9019from Proizvodi as P
9020where (P.Naziv like 'A%' or P.Naziv like 'C%') and P.Raspoloživost = 0
9021
9022select N.NarudzbaID, SUM(SN.Cijena*SN.Koli?ina) 'Ukupna vrijednost'
9023from Narudžbe as N
9024inner join StavkeNarudzbe as SN
9025on N.NarudzbaID = SN.NarudzbaID
9026where YEAR(N.DatumNarudzbe) = 1996
9027group by N.NarudzbaID
9028having SUM(SN.Cijena*SN.Koli?ina) > 500
9029
9030select*
9031from StavkeNarudzbe
9032
9033
9034
9035
9036
9037
9038
9039
9040SELECT
9041 o.OrderID,
9042 SUM(od.Quantity) AS UkupanBrojKomada,
9043 ROUND(SUM(od.UnitPrice * od.Quantity * (1 - od.Discount)), 2) AS UkupnaCijenaBezPopusta,
9044 ROUND(SUM(od.UnitPrice * od.Quantity * (1 - od.Discount) * (1 + o.ShippingCosts)), 2) AS UkupnaCijenaSPopustom
9045FROM
9046 Orders o
9047 INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
9048 INNER JOIN Customers c ON o.CustomerID = c.CustomerID
9049WHERE
9050 o.ShippedDate IS NOT NULL
9051 AND o.ShippedDate - o.OrderDate <= 7
9052 AND c.City IN ('Madrid', 'Munich', 'Seattle')
9053GROUP BY
9054 o.OrderID
9055ORDER BY UkupanBrojKomada DESC;
9056
9057create database jacuseubit
9058use jacuseubit
9059
9060create table izdavac
9061(
9062 izdavacID nvarchar(4) primary key not null,
9063 izdavac_naziv nvarchar(40),
9064 izdavac_grad_okrug nvarchar(40)
9065)
9066
9067create table uposlenik
9068(
9069 uposlenikID nvarchar(9) primary key not null,
9070 ime_prezime nvarchar(50),
9071 datum_zaposl datetime,
9072 opis_posla nvarchar(50),
9073 izdavacID nvarchar(4)
9074 constraint FK_uposlenik_izdavac foreign key (izdavacID) references izdavac(izdavacID)
9075)
9076create table publikacija
9077(
9078 pubID nvarchar(10) primary key not null,
9079 naziv_pub nvarchar(80),
9080 cijena money,
9081 datum_izd datetime,
9082 izdavacID nvarchar(4),
9083 constraint FK_publikacija_izdavac foreign key (izdavacID) references izdavac(izdavacID)
9084)
9085
9086INSERT INTO izdavac
9087select p.pub_id,p.pub_name,ISNULL(p.city,'xx')+'_'+ISNULL(p.state,'xx')
9088from pubs.dbo.publishers as p
9089
9090INSERT INTO uposlenik
9091select e.emp_id,e.fname+ ' ' + e.lname as 'ime i prezime',e.hire_date,j.job_desc,e.pub_id
9092from pubs.dbo.employee as e join pubs.dbo.jobs as j on e.job_id=j.job_id
9093
9094insert into publikacija
9095select t.title_id,t.title,t.price,t.pubdate,t.pub_id
9096from pubs.dbo.titles as t
9097
9098go
9099create view view_god_zaposl
9100as
9101select u.ime_prezime,year(u.datum_zaposl) as 'godina_zaposlenja',DATEDIFF(year,u.datum_zaposl,GETDATE()) as 'godina_staza',u.opis_posla,i.izdavac_naziv
9102from uposlenik as u join izdavac as i on u.izdavacID=i.izdavacID
9103where DATEDIFF(year,u.datum_zaposl,GETDATE())>25
9104
9105drop view view_god_zaposl
9106
9107select*from view_god_zaposl
9108order by 3 desc
9109
9110select opis_posla,COUNT(godina_staza) as 'pobrojano'
9111from view_god_zaposl
9112group by opis_posla
9113
9114select godina_staza,COUNT(godina_staza)
9115from view_god_zaposl
9116group by godina_staza
9117order by 2 desc
9118
9119select* from view_god_zaposl
9120order by 3 desc
9121
9122go
9123create procedure proc_god_zaposl
9124(
9125 @ime_prezime nvarchar(50)=null,
9126 @godina_zaposlenja int=null,
9127 @godina_staza int=null,
9128 @opis_posla nvarchar(50)=null,
9129 @izdavac_naziv nvarchar(40)=null
9130)
9131as
9132begin
9133select ime_prezime,godina_zaposlenja,godina_staza,opis_posla,izdavac_naziv
9134
9135from view_god_zaposl
9136where ime_prezime=@ime_prezime OR
9137 godina_zaposlenja=@godina_zaposlenja OR
9138 godina_staza=@godina_staza OR
9139 opis_posla=@opis_posla OR
9140 izdavac_naziv=@izdavac_naziv
9141end;
9142
9143exec proc_god_zaposl @godina_staza=26
9144exec proc_god_zaposl @opis_posla='designer'
9145exec proc_god_zaposl @godina_zaposlenja=1992
9146
9147select u.ime_prezime,count(p.pubID) as 'ukupno pub'
9148from publikacija as p join izdavac as i on p.izdavacID=i.izdavacID join uposlenik as u on i.izdavacID=p.izdavacID
9149where year(p.datum_izd)=1991 and u.opis_posla LIKE ('%Ed%')
9150GROUP BY U.ime_prezime
9151ORDER BY 2 DESC
9152
9153
9154go
9155create view view_izdavaci
9156as
9157select distinct p.izdavacID,i.izdavac_naziv
9158from publikacija as p join izdavac as i on p.izdavacID=i.izdavacID
9159
9160select*from view_izdavaci
9161
9162select i.izdavacID,i.izdavac_naziv,sum(p.cijena) as 'ukupno'
9163from publikacija as p join izdavac as i on p.izdavacID=i.izdavacID
9164group by i.izdavacID,i.izdavac_naziv
9165
9166go
9167create procedure proc_uposlenik
9168(
9169 @uposlenikID nvarchar(9)=null,
9170 @ime_prezime nvarchar(50)=null,
9171 @godina_zaposlenja int=null,
9172 @opis_posla nvarchar(50)=null,
9173 @izdavacID nvarchar(4)=null
9174)
9175as
9176begin
9177select uposlenikID,ime_prezime,year(datum_zaposl) as 'godina_zaposlenja',opis_posla,izdavacID
9178from uposlenik
9179where opis_posla LIKE ('%Man%') and uposlenikID=uposlenikID OR ime_prezime=@ime_prezime OR year(datum_zaposl)=@godina_zaposlenja or
9180 opis_posla=@opis_posla or izdavacID=@izdavacID
9181end;
9182
9183exec proc_uposlenik @godina_zaposlenja=1992
9184exec proc_uposlenik @opis_posla='Marketing Manager'
9185exec proc_uposlenik @izdavacID=9999
9186drop procedure proc_uposlenik
9187
9188drop table izdavac
9189drop table publikacija
9190drop table uposlenik
9191
9192use master
9193drop database jacuseubit
9194
9195
9196
9197
9198
9199create database PI_5_7_2019
9200use PI_5_7_2019
9201
9202
9203create table uposlenik
9204(
9205 uposlenikID int constraint PK_uposlenikID primary key (uposlenikID) identity (1,1),
9206 prezime_ime nvarchar (30) not null,
9207 datum_rodj date,
9208 datum_zaposl date,
9209 kucni_tel nvarchar (25),
9210 teritorija nvarchar (50)
9211)
9212
9213insert into uposlenik
9214SELECT E.LastName + ' ' + E.FirstName, E.BirthDate, E.HireDate, E.HomePhone, T.TerritoryDescription
9215FROM Northwind.dbo.EmployeeTerritories as ET INNER JOIN Northwind.dbo.Employees as E
9216ON ET.EmployeeID = E.EmployeeID
9217 INNER JOIN Northwind.dbo.Territories AS T
9218 ON ET.TerritoryID = T.TerritoryID
9219--rj: 49
9220
9221
9222create table isporucitelj
9223(
9224 isporuciteljID int constraint PK_isporuciteljID primary key (isporuciteljID),
9225 ispor_naziv nvarchar (40),
9226 ispor_tel nvarchar (24)
9227)
9228
9229insert into isporucitelj
9230select * from Northwind.dbo.Shippers
9231--rJ: 3
9232
9233create table isporuka
9234(
9235 isporukaID int constraint PK_narudzbaID primary key (narudzbaID),
9236 kupac_naziv nvarchar (40) not null,
9237 kupac_br_tel nvarchar (25),
9238 prevoz money,
9239 isporuciteljID int,
9240 uposlenikID int,
9241 constraint FK_isporucitelj foreign key (isporuciteljID) references isporucitelj (isporuciteljID),
9242 constraint FK_uposlenik foreign key (uposlenikID) references uposlenik (uposlenikID)
9243)
9244
9245insert into isporuka
9246SELECT O.OrderID, C.CompanyName, C.Phone, O.Freight, O.ShipVia, O.EmployeeID
9247FROM Northwind.dbo.Customers AS C INNER JOIN Northwind.dbo.Orders AS O
9248ON C.CustomerID = O.CustomerID
9249--rj: 830
9250
9251--------------------------------------------------------------------
9252--3
9253--------------------------------------------------------------------
9254select isporuciteljID, sum (prevoz) as ukupno
9255from narudzba
9256where isporuciteljID = 3
9257group by isporuciteljID
9258
9259se
9260--------------------------------------------------------------------
9261--4
9262--------------------------------------------------------------------
9263/*a Kreirati pogled sljedeće strukture: */
9264create view view_uposlenici
9265as
9266SELECT prezime_ime, year (datum_rodj) as godina, count (teritorija) broj_po_teritoriji
9267FROM uposlenik
9268where year (datum_rodj) > 1950
9269group by prezime_ime, year (datum_rodj)
9270
9271select *
9272from view_uposlenici
9273order by 2
9274
9275/*b Kreirati proceduru koja će imati istu strukturu kao i pogled pod 3.a, a zatim pokrenuti proceduru za sljedeće vrijednosti parametara:
92761. godina = 1963
92772. broj_po_teritoriji = 7*/
9278create procedure proc_uposlenici
9279(
9280 @prezime_ime nvarchar (40) = null,
9281 @godina int = null,
9282 @broj_po_teritoriji int = null
9283)
9284as
9285begin
9286select *
9287from view_uposlenici
9288where prezime_ime = @prezime_ime or
9289 godina = @godina or
9290 broj_po_teritoriji = @broj_po_teritoriji
9291end
9292
9293exec proc_uposlenici @godina = 1963
9294--rj: 2
9295/*
9296prezime_ime godina broj_po_teritoriji
9297------------------------------ ----------- ------------------
9298Leverling Janet 1963 4
9299Suyama Michael 1963 5
9300*/
9301
9302exec proc_uposlenici @broj_po_teritoriji = 7
9303--rj: 3
9304/*
9305prezime_ime godina broj_po_teritoriji
9306------------------------------ ----------- ------------------
9307Fuller Andrew 1952 7
9308Buchanan Steven 1955 7
9309Dodsworth Anne 1966 7
9310*/
9311
9312
9313--------------------------------------------------------------------
9314--5
9315--------------------------------------------------------------------
9316/*Dati pregled ukupno ostvarenog prihoda kojeg su ostvarili isporučitelji. Pregled treba da sadrži naziv isporučitelja i ukupno ostvareni prihod po osnovu prevoza. Sortirati po visini ostvarenog prihoda u opadajućem redoslijedu.*/
9317select I.ispor_naziv, sum (N.prevoz) as suma_prevoza
9318from narudzba as N inner join isporucitelj as I
9319on N.isporuciteljID = I.isporuciteljID
9320group by I.ispor_naziv
9321order by 2 desc
9322--rj: 3
9323/*
9324ispor_naziv suma_prevoza
9325---------------------------------------- ---------------------
9326United Package 28244.85
9327Federal Shipping 20512.51
9328Speedy Express 16185.33
9329*/
9330
9331--------------------------------------------------------------------
9332--6
9333--------------------------------------------------------------------
9334create nonclustered index IX_tel on isporucitelj
9335(
9336 ispor_tel asc
9337)
9338
9339
9340--------------------------------------------------------------------
9341--7
9342--------------------------------------------------------------------
9343/*Koristeći tabele iz vlastite baze podataka kreirati pogled koji će imati sljedeću strukturu: prezime i ime uposlenika, naziv kupca, broj telefona kupca i prevoz. U pogledu trebaju biti smješteni oni zapisi kod kojih se predbroj (broj smješten između zagrada) broja telefona kupca sastoji od isključivo dvije cifre (nije dozvoljen bilo kakav drugi znak osim cifre). Obavezno provjeriti sadržaj kreiranog pogleda. Potrebno je da svaki uposlenik pojavljuje samo jedanput.*/
9344create view view_uposlenik_kupac
9345as
9346select u.prezime_ime, n.kupac_naziv, n.kupac_br_tel, n.prevoz
9347from narudzba as n inner join uposlenik as u
9348on n.uposlenikID = u.uposlenikID
9349where left( n.kupac_br_tel ,4) like '([0-9][0-9])'
9350
9351select *
9352from view_uposlenik_kupac
9353order by 1
9354--rj: 120
9355
9356
9357--------------------------------------------------------------------
9358--8
9359--------------------------------------------------------------------
9360/*Kreirati proceduru koja će koristiti podatke iz prethodno kreiranog pogleda, a imat će sljedeću strukturu: prezime i ime, prevoz, suma prevoza, uz uslov da se procedurom daje suma samo onih zapisa kod kojih je vrijednost prevoza veća od 10. Pokrenuti proceduru za sljedeće vrijednosti parametara:
93611. prezime_ime = Fuller Andrew
93622. prezime_ime = Davolio Nancy*/
9363create procedure proc_suma_prevoza
9364(
9365 @prezime_ime nvarchar (40) = null,
9366 @suma_prevoza decimal (8,2) = null
9367)
9368as
9369begin
9370select prezime_ime, sum (prevoz) as suma_prevoza
9371from view_uposlenik_kupac
9372where prevoz > 10 and
9373 prezime_ime = @prezime_ime
9374group by prezime_ime
9375end
9376
9377exec proc_suma_prevoza @prezime_ime= 'Fuller Andrew'
9378--rj: 5054.15
9379
9380exec proc_suma_prevoza @prezime_ime= 'Davolio Nancy'
9381--rj: 1182.68
9382
9383--------------------------------------------------------------------
9384--9
9385--------------------------------------------------------------------
9386/*a) Kreirati pogled koji će imati sljedeću strukturu: prezime_ime, mjesec, pri čemu je u mjesec potrebno smjestiti redni broj mjeseca u kojem je uposlenik zaposlen, uz uslov da se uposlenik zaposlio u prvoj polovini kalendarske godine. Obavezno provjeriti sadržaj kreiranog pogleda. Potrebno je da svaki uposlenik pojavljuje samo jedanput.*/
9387create view view_mjeseci
9388as
9389select distinct prezime_ime, month(datum_zaposl) as mjesec
9390from uposlenik
9391where month (datum_zaposl) in (1,2,3,4,5,6)
9392
9393select *
9394from view_mjeseci
9395order by 2
9396--rj: 5
9397/*
9398prezime_ime mjesec
9399------------------------------ -----------
9400King Robert 1
9401Callahan Laura 3
9402Leverling Janet 4
9403Davolio Nancy 5
9404Peacock Margaret 5
9405*/
9406
9407/*b Iz pogleda kreiranog u zadatku 5.a dati pregled broja zaposlenika po mjesecima, tj. koliko se uposlenika zaposlilo u svakom od mjeseci navedenog perioda u godini.*/
9408select mjesec, count (mjesec) as uk_broj
9409from view_mjeseci
9410group by mjesec
9411--rj: 4
9412/*
9413mjesec uk_broj
94141 1
94153 1
94164 1
94175 2
9418*/
9419
9420
9421--------------------------------------------------------------------
9422--10
9423--------------------------------------------------------------------
9424drop table uposlenik
9425drop table isporucitelj
9426drop table narudzba
9427drop database PI_5_7_2019
9428
9429
9430--1.
9431/*
9432a) Kreirati bazu podataka pod vlastitim brojem indeksa.
9433*/
9434create database PI_2019_9_I
9435use PI_2019_9_I
9436
9437--b) Kreiranje tabela. Prilikom kreiranja tabela voditi računa o spojnim poljima između tabela.
9438/*
9439I. Kreirati tabelu TipProizv koja se sastoji od polja:
9440 - potkatID - cjelobrojna varijabla, primarni ključ
9441 - katID - cjelobrojna varijabla, obavezan unos
9442 - kat_naziv - 50 unicode karaktera, obavezan unos
9443 - potkat_naziv - 50 unicode karaktera, obavezan unos
9444*/
9445create table TipProizv
9446(
9447 potkatID int constraint PK_TipProizv primary key (potkatID),
9448 katID int not null,
9449 kat_naziv nvarchar(50) not null,
9450 potkat_naziv nvarchar(50)
9451)
9452/*
9453II. Kreirati tabelu proizvod koja se sastoji od polja:
9454 - proizvodID - cjelobrojna varijabla, primarni ključ
9455 - naziv - 50 UNICODE karaktera, obavezan unos
9456 - boja - 15 UNICODE karaktera
9457 - tezina - decimalni broj decimal(8, 2),
9458 - dana_za_proiz - cjelobrojna varijabla, obavezan unos
9459 - klasa - 2 unicode karaktera
9460 - potkat_ID cjelobrojna varijabla, obavezan unos
9461*/
9462create table proizvod
9463(
9464 proizvodID int constraint PK_proizvod Primary key (proizvodID),
9465 naziv nvarchar(50) not null,
9466 boja nvarchar(15),
9467 tezina decimal(8, 2),
9468 dana_za_proiz int not null,
9469 klasa nvarchar (2),
9470 potkatID int not null
9471 constraint FK_proizvod_TipProiz foreign key (potkatID) references TipProizv (potkatID)
9472)
9473
9474/*
9475III. Kreirati tabelu nalog koja se sastoji od polja:
9476 - nalogID - cjelobrojna varijabla, primarni ključ
9477 - proizvodID - cjelobrojna varijabla, obavezan unos
9478 - naruc_kol - cjelobrojna varijabla, obavezan unos
9479 - stanje_kol - cjelobrojna varijabla, obavezan unos
9480 - dtm_zaduz - datumska varijabla samo za unos datuma (bez vremena)
9481 - oznaka_greske - 50 unicode karaktera, obavezan unos
9482*/
9483
9484create table nalog
9485(
9486 nalogID int constraint PK_nalogID primary key (nalogID),
9487 proizvodID int not null,
9488 naruc_kol int not null,
9489 stanje_kol int not null,
9490 dtm_zaduz date,
9491 oznaka_greske nvarchar(50) not null,
9492 constraint FK_nalog_proizvod foreign key (proizvodID) references proizvod (proizvodID)
9493)
9494--15 bodova
9495
9496
9497-----------------------------------------------------------------------------------------------
9498--2. Importovanje podataka
9499/*
9500a) U tabelu TipProizv importovati podatke iz tabela ProductSubcategory i ProductCategory baze AdventureWorks2014 koje se nalaze u šemi Production na sljedeći način:
9501 - ProductSubcategoryID -> potkatID
9502 - ProductCategoryID -> katID
9503 - Name -> kat_naziv
9504 - Name -> potkat_naziv
9505Voditi računa o pripadnosti polja tabelama iz kojih se importuju podaci.
9506*/
9507
9508INSERT INTO TipProizv
9509SELECT PS.ProductSubcategoryID, PC.ProductCategoryID, PC.Name, PS.Name
9510FROM AdventureWorks2014.Production.ProductCategory AS PC INNER JOIN AdventureWorks2014.Production.ProductSubcategory AS PS
9511ON PC.ProductCategoryID = PS.ProductCategoryID
9512--37
9513
9514/*
9515b) U tabelu proizvod importovati podatke iz tabele Product baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
9516 - ProductID -> proizvodID
9517 - Name -> naziv
9518 - Color -> boja
9519 - Weight -> tezina
9520 - DaysToManufacture -> dana_za_proiz
9521 - Class -> klasa
9522 - ProductSubcategoryID -> potkatID
9523uz uslov da je ProductSubcategoryID sadrži vrijednost.
9524*/
9525INSERT INTO proizvod
9526SELECT P.ProductID, P.Name, P.Color, P.Weight, P.DaysToManufacture, P.Class, P.ProductSubcategoryID
9527FROM AdventureWorks2014.Production.Product AS P
9528where P.ProductSubcategoryID is not null ------------ ne moze biti not null
9529--295
9530
9531/*
9532c) U tabelu nalog importovati podatke iz tabela WorkOrder i ScrapReason baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
9533 - WorkOrderID -> nalogID
9534 - ProductID -> proizvodID
9535 - OrderQty -> naruc_kol
9536 - StockedQty -> stanje_kol
9537 - DueDate -> dtm_zaduz
9538 - Name -> oznaka_greske
9539uz uslov da je ProductID veći ili jednak 680.
9540*/
9541INSERT INTO nalog
9542SELECT WO.WorkOrderID, WO.ProductID, WO.OrderQty, WO.StockedQty, WO.DueDate, SR.Name
9543FROM AdventureWorks2014.Production.WorkOrder as WO INNER JOIN AdventureWorks2014.Production.ScrapReason as SR
9544ON SR.ScrapReasonID = WO.ScrapReasonID
9545where WO.ProductID >=680
9546--332
9547-- 15 bodova
9548
9549
9550-----------------------------------------------------------------------------------------------
9551--3.
9552/*
9553Iz tabele nalog dati pregled koji će se sastojati od polja:
9554 - godina - godina zaduženja proizvoda
9555 - uk_broj_po_god - ukupan broj zapisa po godinama
9556uz uslov da je proizvod zadužen u prvom polugodištu bilo koje godine.
9557Primjer za uk_broj: U tabeli se nalazi 5 zapisa kod kojih je datum zaduženja iz prvog polugodišta 2015. godine
9558*/
9559select year (dtm_zaduz) as godina, count (dtm_zaduz) as uk_broj_po_god
9560from nalog
9561where MONTH (dtm_zaduz) < 7
9562group by year (dtm_zaduz)
9563--4
9564/*
95652011 2
95662012 49
95672013 72
95682014 51
9569*/
9570--5 bodova
9571
9572-----------------------------------------------------------------------------------------------
9573--4.
9574/*
9575Iz tabele nalog kreirati pogled view_razlika koji će se sastojati od polja:
9576 - razlika_stanja - razlika između naručene količine i količine na stanju
9577 - uk_broj_po_razlici - ukupan broj zapisa po vrijednosti razlike, npr. u tabeli se nalazi 5 zapisa kod kojih je razlika 10
9578uz uslov da je proizvod zadužen u 10. mjesecu bilo koje godine prije 2013.
9579Obavezno napisati naredbu za pregled sadržaja pogleda.
9580*/
9581create view view_razlika
9582as
9583select naruc_kol - stanje_kol as razlika_stanja, count (naruc_kol - stanje_kol) as uk_broj_po_razlici
9584from nalog
9585where MONTH (dtm_zaduz) = 10 and year (dtm_zaduz) < 2013
9586group by (naruc_kol - stanje_kol)
9587
9588select * from view_razlika
9589--6
9590/*
95911 8
95922 7
95933 1
959410 1
959530 1
959632 1
9597*/
9598--12 bodova
9599
9600-----------------------------------------------------------------------------------------------
9601/*
96025. Koristeći tabelu proizvod kreirati proceduru proc_proizvod kojom će se definirati sljedeći ulazni parametri:
9603- proizvodID
9604- boja
9605- tezina
9606- dana_za_proiz
9607Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koje polje bez unijetog parametra).
9608
9609Proceduru pokrenuti za sljedeće vrijednosti parametara:
96101. @boja = Black
96112. @dana_za_proiz = 1
9612*/
9613
9614CREATE PROCEDURE proc_proizvod
9615(
9616 @proizvodID int = null,
9617 @boja nvarchar(15) = null,
9618 @tezina decimal(8, 2) = null,
9619 @dana_za_proiz int = null
9620)
9621AS
9622BEGIN
9623select proizvodID, naziv, boja, tezina, dana_za_proiz
9624from PI_2019_9_I.dbo.proizvod
9625where proizvodID = @proizvodID or
9626 boja = @boja or
9627 tezina = @tezina or
9628 dana_za_proiz = @dana_za_proiz
9629END
9630
9631exec proc_proizvod @boja = 'Black'
9632--89
9633
9634exec proc_proizvod @dana_za_proiz = 1
9635--127
9636--8 bodova
9637
9638
9639-----------------------------------------------------------------------------------------------
9640/*
96416. Kreirati pregled koji će sadržavati polja:
9642 - potkatID
9643 - suma_tez u kojem će se nalaziti suma težina
9644Uslov je da naziv proizvoda počinje slovima HL, da se ne preuzimaju zapisi u kojima se nalaze vrijednosti u kolonama boja i tezina, te da je proizvod zaduzen u 2011. ili 2012. godini.
9645*/
9646select P.potkatID, sum (tezina) as suma_tez
9647from proizvod as P inner join nalog as N
9648on P.proizvodID = N.proizvodID
9649where P.naziv like 'HL%' and P.boja is not null and P.tezina is not null and year (dtm_zaduz) in (2011,2012)
9650group by P.potkatID
9651--10 bodova
9652--3
9653/*
965417 5270.00
965512 27.56
965614 6.52
9657*/
9658
9659
9660
9661-----------------------------------------------------------------------------------------------
9662/*
96637.
9664Kreirati pogled view_potkat_boja koji će se sastojati od polja:
9665 - potkatID
9666 - boja
9667 - uk_broj_po_oznaka_greske kojim će se prebrojati ukupan broj pojedinog naziva greške
9668Napisati naredbu za pregled sadržaja pogleda pri čemu će se izostaviti svi zapisi u kojima nije unijeta vrijednost za boju i uk_broj_po_oznaka_greske je neparan broj.
9669*/
9670create view view_potkat_boja
9671as
9672select P.potkatID, P.boja, count (oznaka_greske) as uk_broj_po_oznaka_greske
9673from proizvod as P inner join nalog as N
9674on P.proizvodID = N.proizvodID
9675group by P.potkatID, P.boja
9676--21
9677
9678select *
9679from view_potkat_boja
9680where boja is not null and right (uk_broj_po_oznaka_greske,1) in (0,2,4,6,8)
9681--7
9682--10 bodova
9683
9684
9685-----------------------------------------------------------------------------------------------
9686/*
96878. Kreirati pregled koji će sadržavati polja:
9688- naziv potkategorije
9689- sr_vr_tez - srednja vrijednost težine zaokružena na 2 decimalna mjesta (treća i ostale decimale su 0)
9690pri čemu se ne prikazuju zapisi u kojima ne postoji srednja vrijednost.
9691*/
9692SELECT TP.potkat_naziv, round (avg (P.tezina),2) as sr_vr_tez
9693FROM proizvod AS P INNER JOIN TipProizv AS TP
9694ON P.potkatID = TP.potkatID
9695group by TP.potkat_naziv
9696HAVING AVG (P.tezina) is not null
9697--12
9698/*
9699Bottom Brackets 187.000000
9700Brakes 317.000000
9701Cranksets 603.330000
9702Derailleurs 151.500000
9703Mountain Bikes 25.060000
9704Mountain Frames 2.840000
9705Pedals 187.330000
9706Road Bikes 17.450000
9707Road Frames 2.310000
9708Touring Bikes 27.680000
9709Touring Frames 3.080000
9710Wheels 890.000000
9711*/
9712--10 bodova
9713
9714
9715-----------------------------------------------------------------------------------------------
9716/*
97179.
9718Kreirati pogled kojim će se dati prikaz ID naloga, ID proizvoda, broja godina razlike u odnosu na aktivnu godinu, oznaku boje koju će predstavljati prvo slovo naziva (npr. Purple -> P), klase i naziva potkategorije. Izraz za izračunavanje broja godina razlike treba biti općeg karaktera. Uslov je da naziv potkategorije sadrži riječ Bikes, te da boja nije crna. Obavezno napisati kod za pregled sadržaja pogleda.
9719*/
9720--a
9721create view view_bikes
9722as
9723SELECT nalog.nalogID, proizvod.proizvodID, datediff (year,nalog.dtm_zaduz,getdate()) as razl_godina, left (proizvod.boja,1) as ozn_boje, proizvod.klasa, TipProizv.potkat_naziv
9724FROM nalog INNER JOIN proizvod
9725ON nalog.proizvodID = proizvod.proizvodID
9726 INNER JOIN TipProizv
9727 ON proizvod.potkatID = TipProizv.potkatID
9728where TipProizv.potkat_naziv like '%Bikes%' and proizvod.boja not like 'Black'
9729
9730select * from view_bikes
9731--59
9732--15 bodova
9733
9734
9735------------------------------------------------
9736--1
9737/*
9738a) Kreirati bazu podataka pod vlastitim brojem indeksa.
9739*/
9740create database PI_BP_2019_9_12
9741use PI_BP_2019_9_12
9742
9743--------------------------
9744
9745/*Prilikom kreiranja tabela voditi računa o međusobnom odnosu između tabela.
9746b) Kreirati tabelu radnik koja će imati sljedeću strukturu:
9747 - radnikID, cjelobrojna varijabla, primarni ključ
9748 - drzavaID, 15 unicode karaktera
9749 - loginID, 256 unicode karaktera
9750 - sati_god_odmora, cjelobrojna varijabla
9751 - sati_bolovanja, cjelobrojna varijabla
9752*/
9753create table radnik
9754(
9755 radnikID int constraint PK_radnikID primary key (radnikID),
9756 drzavaID nvarchar (15),
9757 loginID nvarchar (256),
9758 sati_god_odmora int,
9759 sati_bolovanja int
9760)
9761
9762/*
9763c) Kreirati tabelu kupovina koja će imati sljedeću strukturu:
9764 - kupovinaID, cjelobrojna varijabla, primarni ključ
9765 - status, cjelobrojna varijabla
9766 - radnikID, cjelobrojna varijabla
9767 - br_racuna, 15 unicode karaktera
9768 - naziv_dobavljaca, 50 unicode karaktera
9769 - kred_rejting, cjelobrojna varijabla
9770*/
9771create table kupovina
9772(
9773 kupovinaID int constraint PK_kupovinaID primary key (kupovinaID),
9774 status int,
9775 radnikID int not null,
9776 br_racuna nvarchar (15),
9777 naziv_dobavljaca nvarchar (50),
9778 kred_rejting int,
9779 constraint FK_kupovina_radnik foreign key (radnikID) references radnik (radnikID)
9780)
9781
9782/*
9783c) Kreirati tabelu prodaja koja će imati sljedeću strukturu:
9784 - prodavacID, cjelobrojna varijabla, primarni ključ
9785 - prod_kvota, novčana varijabla
9786 - bonus, novčana varijabla
9787 - proslogod_prodaja, novčana varijabla
9788 - naziv_terit, 50 unicode karaktera
9789*/
9790
9791create table prodaja
9792(
9793 prodavacID int constraint PK_prodaja primary key (prodavacID),
9794 prod_kvota money,
9795 bonus money,
9796 proslogod_prodaja money,
9797 naziv_terit nvarchar (50),
9798 constraint FK_prodaja_radnik foreign key (prodavacID) references radnik (radnikID)
9799)
9800--10 bodova
9801
9802
9803
9804
9805--------------------------------------------
9806--2. Import podataka
9807/*
9808a) Iz tabele humanresources.employee baze AdventureWorks2014 u tabelu radnik importovati podatke po sljedećem pravilu:
9809 - BusinessEntityID -> radnikID
9810 - NationalIDNumber -> drzavaID
9811 - LoginID -> loginID
9812 - VacationHours -> sati_god_odmora
9813 - SickLeaveHours -> sati_bolovanja
9814*/
9815insert into radnik
9816SELECT E.BusinessEntityID, E.NationalIDNumber, E.LoginID, E.VacationHours, E.SickLeaveHours
9817FROM AdventureWorks2014.HumanResources.Employee as E
9818--rj: 290
9819
9820/*
9821b) Iz tabela purchasing.purchaseorderheader i purchasing.vendor baze AdventureWorks2014 u tabelu kupovina importovati podatke po sljedećem pravilu:
9822 - PurchaseOrderID -> kupovinaID
9823 - Status -> status
9824 - EmployeeID -> radnikID
9825 - AccountNumber -> br_racuna
9826 - Name -> naziv_dobavljaca
9827 - CreditRating -> kred_rejting
9828*/
9829insert into kupovina
9830SELECT POH.PurchaseOrderID, POH.Status, POH.EmployeeID, V.AccountNumber, V.Name, V.CreditRating
9831FROM AdventureWorks2014.Purchasing.PurchaseOrderHeader as POH INNER JOIN AdventureWorks2014.Purchasing.Vendor as V
9832ON POH.VendorID = V.BusinessEntityID
9833--rj: 4012
9834
9835/*
9836c) Iz tabela sales.salesperson i sales.salesterritory baze AdventureWorks2014 u tabelu prodaja importovati podatke po sljedećem pravilu:
9837 - BusinessEntityID -> prodavacID
9838 - SalesQuota -> prod_kvota
9839 - Bonus -> bonus
9840 - SalesLastYear -> proslogod_prodaja
9841 - Name -> naziv_terit
9842 - CreditRating -> kred_rejting
9843*/
9844insert into prodaja
9845SELECT SP.BusinessEntityID, SP.SalesQuota, SP.Bonus, SP.SalesLastYear, ST.Name
9846FROM AdventureWorks2014.Sales.SalesPerson as SP INNER JOIN AdventureWorks2014.Sales.SalesTerritory as ST
9847ON SP.TerritoryID = ST.TerritoryID
9848--rj: 14
9849--10 bodova
9850
9851
9852
9853
9854------------------------------------------
9855/*
98563.
9857a) Iz tabela radnik i kupovina kreirati pogled view_bicikl koji će imati sljedeću strukturu:
9858 - kupovinaID,
9859 - naziv dobavljača,
9860 - kreditni rejting
9861Uslov je da u pogledu budu samo oni zapisi u kojima se prema nazivu dobavljača zaključuje da se bavi prodajom bicikla.
9862 Obavezno napisati kod kojim će se dati prikaz sadržaja pogleda sortiran po ID kupovine.
9863b) Koristeći prethodno kreirani pogled prebrojati broj obavljenih kupovina prema kreditnom rejtingu. Pregled treba da sadrži oznaku kreditnog rejtinga i ukupan broj obavljenih kupovina.*/
9864--a
9865CREATE VIEW view_bicikl
9866as
9867SELECT K.kupovinaID, K.naziv_dobavljaca, K.kred_rejting
9868FROM radnik as R INNER JOIN kupovina as K
9869ON R.radnikID = K.radnikID
9870where K.naziv_dobavljaca like '%Bi%'
9871
9872select *
9873from view_bicikl
9874order by 1
9875--rj: 1474
9876
9877--b
9878select kred_rejting, count (kred_rejting) as ukupan_broj
9879from view_bicikl
9880group by kred_rejting
9881order by 1
9882--rj: 3
9883/*
98841 1273
98853 151
98865 50
9887*/
9888--10 bodova
9889
9890
9891
9892
9893-----------------------------------------------
9894/*
98954.
9896Kreirati proceduru koja će imati istu strukturu kao pogled kreiran u prethodnom zadatku. Voditi računa o tipovima varijabli u proceduri. Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Uslov je da se procedurom obuhvate oni zapisi iz pogleda kod kojih je kreditni rejting veći od 1, te da se izvrši sortiranje po kreditnom rejtingu. Pokrenuti proceduru za kreditni rejting 3 i 5.*/
9897CREATE PROCEDURE sp_view_bicikl
9898(
9899 @kupovinaID int = null,
9900 @naziv_dobavljaca nvarchar (50) = null,
9901 @kred_rejting int = null
9902)
9903AS
9904BEGIN
9905 SELECT kupovinaID, naziv_dobavljaca, kred_rejting
9906 FROM view_bicikl
9907 WHERE kred_rejting > 1 AND
9908 (kupovinaID = @kupovinaID OR
9909 naziv_dobavljaca = @naziv_dobavljaca OR
9910 kred_rejting = @kred_rejting)
9911 ORDER BY 3
9912END
9913
9914EXEC sp_view_bicikl @kred_rejting = 3
9915--rj: 151
9916
9917EXEC sp_view_bicikl @kred_rejting = 5
9918--rj: 50
9919--10 bodova
9920
9921
9922
9923
9924-----------------------------------------------
9925/*
99265.
9927a) U tabeli radnik kreirati neklasterirani indeks nad kolonom drzavaID. Uključiti kolone sati_god_odmora i sati_bolovanja.
9928b) Izvršiti testiranje kreiranog indeksa.
9929c) Obrisati prethodno kreirani indeks.
9930*/
9931CREATE NONCLUSTERED INDEX IX_ukupno_sati ON radnik
9932(
9933 drzavaID ASC
9934)
9935INCLUDE (sati_god_odmora, sati_bolovanja)
9936
9937SELECT * FROM radnik
9938WHERE drzavaID < 50000000 And sati_god_odmora > 80 and sati_bolovanja > 40
9939--rj: 3
9940/*
994153 9659517 adventure-works\diane0 87 63
9942210 20244403 adventure-works\belinda0 83 61
9943230 28414965 adventure-works\stuart1 88 64
9944*/
9945
9946drop index IX_ukupno_sati on radnik
9947--5 bodova
9948
9949
9950
9951
9952-----------------------------------------------
9953/*
99546.
9955a) Dati pregled kojim će se prebrojati zapisi u kojima je broj sati bolovanja veći od broja sati godišnjeg odmora, uz uslov da je ta razlika veća od 10. Pregled treba da sadrži razliku sati i ukupan broj. Sortirati prema razlici sati.
9956b) Dati pregled svih zapisa kojim će se prebrojati broj država po prodajnim kvotama.
9957*/
9958--a
9959SELECT (sati_bolovanja - sati_god_odmora) as razlika_sati, count (sati_bolovanja - sati_god_odmora) as ukupan_broj
9960FROM radnik
9961where (sati_bolovanja - sati_god_odmora) > 10
9962group by (sati_bolovanja - sati_god_odmora)
9963order by 1
9964--rj: 12
9965
9966--b
9967SELECT prodaja.prod_kvota, count (radnik.drzavaID)
9968FROM radnik INNER JOIN
9969 prodaja ON radnik.radnikID = prodaja.prodavacID
9970group by prodaja.prod_kvota
9971--rj: 2
9972/*
9973250000.00 11
9974300000.00 3
9975*/
9976--10 bodova
9977
9978
9979
9980
9981-------------------------------------------
9982/*
99837.
9984a) Kreirati pogled dobavljaci_radnici koji će se sastojati od kolona naziv dobavljača i ukupan broj radnika. Ukupan broj je podatak kojim se prebrojava broj radnika s kojima je dobavljač poslovao. Obavezno napisati kod kojim će se izvršiti pregled sadržaja pogleda sortiran po ukupnom broju.
9985b) Kreirati pregled kojim će se izvršiti prebrojavanje po ukupnom broju prebrojanih radnika.
9986c) Kreirati proceduru kojom će se iz pogleda kreiranog pod a) preuzeti zapisi u kojima je ukupan broj manji od 50. Voditi računa o tipovima podataka. Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Pokrenuti proceduru za vrijednosti ukupan broj = 1, 2 i 50.
9987*/
9988--a
9989create view dobavljaci_radnici
9990as
9991SELECT naziv_dobavljaca, count (radnikID) as ukupan_broj
9992FROM kupovina
9993GROUP BY naziv_dobavljaca
9994
9995select *
9996from dobavljaci_radnici
9997order by 1
9998--rj: 86
9999
10000--b
10001select ukupan_broj, count (ukupan_broj)
10002from dobavljaci_radnici
10003group by ukupan_broj
10004order by 1
10005--5
10006/*
100071 4
100082 2
100094 1
1001050 29
1001151 50
10012*/
10013
10014--c
10015CREATE PROCEDURE sp_dobavljaci_radnici
10016(
10017 @naziv_dobavljaca nvarchar (50) = null,
10018 @ukupan_broj int = null
10019)
10020as
10021begin
10022 select naziv_dobavljaca, ukupan_broj
10023 from dobavljaci_radnici
10024 WHERE ukupan_broj < 51 and
10025 (naziv_dobavljaca = @naziv_dobavljaca or
10026 ukupan_broj = @ukupan_broj)
10027END
10028
10029exec sp_dobavljaci_radnici @ukupan_broj = 4
10030--rj: 1
10031--15 bodova
10032
10033---------------------------------------
10034/*
100358.
10036a) Iz tabela kupovina i radnik kreirati pogled view_sifra_transakc koja će se sastojati od sljedećih kolona:
10037 - naziv dobavljača,
10038 - ID države (odnosi se na radnika),
10039 - sifra_transakc
10040Podaci u koloni sifra_transakc će se formirati spajanjem karaktera koji se dobiju kada se iz kolone loginID tabele radnik ukloni dio 'adventure-works\' i posljednja 4 karaktera iz kolone br_racuna tabele kupovina, između kojih je potrebno umetnuti donju crtu (_).
10041Obavezno napisati kod za pregled sadržaja pogleda.
10042b) Iz prethodno kreiranog pogleda prebrojati sve zapise u kojima su i drzavaID i šifra transkacije parni brojevi .*/
10043*/
10044create view view_sifra_transakc
10045as
10046select K.naziv_dobavljaca, R.drzavaID, substring (R.loginID, 17, 15) + '_' +right (K.br_racuna, 4) as sifra_transakc
10047FROM kupovina as K INNER JOIN radnik as R
10048ON K.radnikID = R.radnikID
10049
10050select *
10051from view_sifra_transakc
10052order by 1
10053--4012
10054
10055select count (*)
10056from view_sifra_transakc
10057where right (drzavaID,1) in (0,2,4,6,8) and right (sifra_transakc, 1) in (0,2,4,6,8)
10058--rj: count = 93
10059--10 bodova
10060
10061
10062--------------------------------------------
10063/*
100649.
10065a) U tabeli kupovina broj računa se sastoji od slovnog i brojčanog dijela. Kreirati pogled view_slovni kojim će se izvršiti prebrojavanje prema slovnom dijelu broja računa.
10066b) Koristeći prethodno kreirani pogled izvršiti prebrojavanje prema početnom slovu
10067c) Koristeći pogled kreiran pod a) izvršiti prebrojavanje ukupnog broj prebrojanih slovnih dijelova koji nisu jednocifreni.
10068*/
10069create view view_slovni
10070as
10071select left (br_racuna,LEN (br_racuna)-4) as slovni, COUNT (left (br_racuna,LEN (br_racuna)-4)) as count_slovni
10072from kupovina
10073group by left (br_racuna,LEN (br_racuna)-4)
10074--80
10075
10076select LEFT (slovni,1), COUNT (LEFT (slovni,1))
10077from view_slovni
10078group by LEFT (slovni,1)
10079--18
10080
10081select count_slovni, COUNT (count_slovni)
10082from view_slovni
10083where count_slovni > 9
10084group by count_slovni
10085--4
10086/*
1008750 29
1008851 41
10089102 3
10090154 1
10091*/
10092--15 bodova
10093
10094
10095
10096--------------------------------------------
10097/*
1009810.
10099Kreirati upit kojim će dati prikaz kolone loginID nakon što se iz nje izbaci sve osim karaktera koji slijede nakon znaka \, uz uslov da se prikažu samo oni zapisi u kojima je dužina novonastalog stringa kraća od 6 znakova.
10100*/
10101select substring (loginID,17,15)
10102from radnik
10103where LEN (substring (loginID,17,15)) < 6
10104--82
10105--5 bodova
10106
10107
10108 CREATE DATABASE MILICALJUBAVkl
10109 use MILICALJUBAVkl
10110
10111--b) Kreiranje tabela. Voditi raèuna o meðusobnom odnosu izmeðu tabela. Definirati odgovarajuæe spoljne kljuèeve pomoæu kojih æe se tabele meðusobno povezati.
10112
10113
10114/*
10115I. Kreirati tabelu narudzba sljedeæe strukture:
10116 - narudzbaID cjelobrojna varijabla, primarni kljuè
10117 - kupac, 40 unicode karaktera
10118 - puna_adresa, 80 unicode karaktera
10119 - datum_narudzbe, datumska varijabla
10120 - cijena_prevoza, novèana varijabla
10121*/
10122
10123 CREATE TABLE narudzba
10124 (
10125 narudzbaID int not null primary key,
10126 kupac nvarchar(40),
10127 puna_adresa nvarchar(80),
10128 datum_narudzbe date,
10129 cijena_prevoza money
10130 )
10131
10132
10133/*
10134II. Kreirati tabelu proizvod sljedeæe strukture:
10135 - proizvodID, , cjelobrojna varijabla, primarni kljuè
10136 - naziv_proizvoda, 40 unicode karaktera
10137 - naziv_dobavljaca, 40 unicode karaktera
10138 - stanje_na_sklad, cjelobrojna varijabla
10139 - narucena_kol, cjelobrojna varijabla
10140*/
10141 create table proizvod
10142 (
10143 proizvodID int not null primary key,
10144 naziv_proizvoda nvarchar(40),
10145 naziv_dobavljaca nvarchar(40),
10146 stanje_na_sklad int,
10147 narucena_kol int
10148 )
10149
10150/*
10151II. Kreirati tabelu detalji_narudzbe sljedeæe strukture:
10152 - narudzbaID, cjelobrojna varijabla
10153 - proizvodID, cjelobrojna varijabla
10154 - cijena_proizvoda, novèana varijabla
10155 - kolicina, cjelobrojna varijabla
10156 - popust, decimalna varijabla
10157*/
10158 create table detalji_narudzbe
10159 (
10160 narudzbaID int not null,
10161 proizvodID int not null,
10162 cijena_proizvoda money,
10163 kolicina int,
10164 popust decimal(8,2),
10165 constraint PK_detalji_narudzbe primary key (narudzbaID,proizvodID),
10166 constraint FK_detalji_narudzbe_narudzba foreign key (narudzbaID) references narudzba(narudzbaID),
10167 constraint FK_detalji_narudzbe_proizvod foreign key (proizvodID) references proizvod (proizvodID)
10168 )
10169
10170--10 bodova
10171---------------------------------------------------------------------------
10172--2. Import podataka
10173/*
10174Koristeæi bazu Northwind u vlastiti bazu prebaciti podatke prema zadatim pravilima.
10175a) U tabelu narudzba iz tabela Customers i Orders prebaciti:
10176 - OrderID -> narudzbaID
10177 - CompanyName -> kupac
10178 - puna_adresa - spojiti podatke iz kolona Address, PostalCode i City pri èemu je potrebno podatke razdvojiti crticom
10179 - OrderDate -> datum_narudzbe
10180 - Freight -> cijena_prevoza
10181*/
10182 INSERT INTO narudzba
10183 SELECT O.OrderID,C.CompanyName,C.Address+ '_' + C.PostalCode + '_' + C.City AS 'puna_adresa',o.OrderDate,O.Freight
10184 FROM Northwind.dbo.Customers as C join Northwind.dbo.Orders as O ON C.CustomerID=O.CustomerID
10185
10186
10187/*
10188b) U tabelu proizvod iz tabela Products i Suppliers prebaciti:
10189 - ProductID -> proizvodID
10190 - ProductName -> naziv_proizvoda
10191 - CompanyName -> naziv_dobavljaca
10192 - UnitsInStock -> stanje_na_sklad
10193 - UnitsOnOrder -> narucena_kol
10194*/
10195
10196 INSERT INTO proizvod
10197 SELECT P.ProductID,p.ProductName,S.CompanyName,P.UnitsInStock,P.UnitsOnOrder
10198 from Northwind.dbo.Products as P join Northwind.dbo.Suppliers as S ON P.SupplierID=S.SupplierID
10199--77
10200
10201/*
10202c) U tabelu detalji_narudzbe iz tabela Order Details i Products prebaciti:
10203 - OrderID -> narudzbaID
10204 - ProductID -> proizvodID
10205 - UnitPrice -> cijena_proizvoda
10206 - Quantity -> kolicina
10207 - Discount -> popust
10208*/
10209
10210 INSERT INTO detalji_narudzbe
10211 SELECT OD.OrderID,P.ProductID,P.UnitPrice,OD.Quantity,OD.Discount
10212 FROM Northwind.dbo.[Order Details] AS OD JOIN Northwind.dbo.Products AS P ON OD.ProductID=P.ProductID
10213
10214
10215--2155
10216--10 bodova
10217
10218
10219
10220
10221---------------------------------------------------------------------------
10222/*
102233.
10224a) Koristeæi tabele narudzba i detalji_narudzbe kreirati pogled view_kupac_kol sljedeæe strukture:
10225 - narudzbaID
10226 - kupac
10227 - datum_narudzbe
10228 - kolicina
10229uz uslov da je narudzba izvršena najranije 22 godine u odnosu na aktuelni datum.
10230*/
10231
10232--12 bodova
10233go
10234create view view_kupac_kol
10235as
10236select n.narudzbaID, n.kupac, n.datum_narudzbe, dn.kolicina
10237from narudzba as n join detalji_narudzbe as dn on dn.narudzbaID=n.narudzbaID
10238where datediff(year, n.datum_narudzbe, getdate()) <22
10239/*4.
10240Kreirati proceduru koja æe imati istu strukturu kao tabela narudzba. Voditi raèuna o tipovima varijabli u proceduri. Proceduru kreirati tako da je prilikom izvršavanja moguæe unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Uslov je da preuzmu samo oni zapisi u kojima nije odobren popust. Pokrenuti porceduru za sljedeæe vrijednosti parametara:
102411. kolièina = 10
102422. ID narudžbe = 10255
10243*/
10244
10245go
10246create procedure proc_kupac_kol
10247(
10248@narudzbaID INT=NULL,
10249@proizvodID INT=NULL,
10250@cijena_proizvoda MONEY=null,
10251@kolicina INT=null,
10252@popust DECIMAL=null
10253)
10254as
10255begin
10256select narudzbaID,proizvodID,cijena_proizvoda,kolicina,popust
10257from detalji_narudzbe
10258where (@narudzbaID=narudzbaID OR @proizvodID=proizvodID OR @cijena_proizvoda=cijena_proizvoda OR
10259 @kolicina=kolicina OR @popust=popust) AND ( @popust IS NULL)
10260END;
10261
10262
10263exec proc_kupac_kol @kolicina=10
10264exec proc_kupac_kol @narudzbaID=10255
10265
10266
10267/*
102685. Kreirati pogled kojim æe se dati prikaz naruèenih kolièina prema mjesecu narudžbe. Uslov je da je narudžba izvršena u 1996. godini. Pogled treba sadržavati ID narudžbe, redni broj mjeseca i kolièinu.
10269*/
10270
10271go
10272create view view_kolicina
10273as
10274select n.narudzbaID, month(n.datum_narudzbe) as 'mjesec', dn.kolicina
10275from narudzba as n join detalji_narudzbe as dn on dn.narudzbaID=n.narudzbaID
10276where YEAR(n.datum_narudzbe) LIKE 1996
10277
10278/*
102796.
10280a) Kreirati pogled koji æe se sastojati od naziva dobavljaèa, naziva proizvoda, ukupne cijene koja je proizvod jediniène cijene i kolièine, ukupne cijene s popustom koja predstavlja ukupnu cijenu sa obraèunatim popustom i visinu popusta izraženu kao broj. Obratiti pažnju na naèin raèunanja ukupne cijene s popustom. Uslov da je u pogledu budu samo oni zapisi kod kojih je odobren popust.
10281b) Koriseæi pogled kreiran pod a) prikazati minimalnu, maksimalnu i srednju vrijednost visine popusta, te razliku izmeðu minimalne i maksimalne vrijednosti. Srednja vrijednsot predstavlja srednju vrijednost novèanih vrijednosti, pa njen prikaz treba s tim uskladiti.
10282*/
10283
10284go
10285create view view_dobavljac
10286as
10287select p.naziv_dobavljaca, p.naziv_proizvoda, dn.kolicina*dn.cijena_proizvoda as 'ukupna_cijena', dn.kolicina*dn.cijena_proizvoda*(1-dn.popust) as 'uk_sa_pop', dn.cijena_proizvoda*dn.kolicina*dn.popust as 'visina_popusta'
10288from proizvod as p join detalji_narudzbe as dn on p.proizvodID=dn.proizvodID
10289where dn.popust IS NOT NULL
10290
10291SELECT min(visina_popusta) as 'min', max(visina_popusta) as 'max', round(avg(visina_popusta),2) as 'prosjecna',
10292 MAX(visina_popusta)-MIN(visina_popusta) as 'razlika'
10293from view_dobavljac
10294
10295/*
102967.
10297a) Kreirati pogled koji æe prikazati sumirane cijene proizvoda po nazivu proizvoda i popustu.
10298b) Koristeæi pogled kreiran pod a) prikazati maksimalne vrijednosti suma po visinama popusta. Sortirati po vrijednostima popusta u rastuæem redoslijedu.
10299c) Koristeæi pogled kreiran pod a) prikazati srednje vrijednosti suma po nazivima proizvoda. Sortirati po vrijednostima suma u opadajuæem redoslijedu. Voditi raèuna da je cijena proizvoda novèana varijabla, te prema tome formatirati srednje vrijednosti.
10300*/
10301
10302go
10303create view view_cijena
10304as
10305select p.naziv_proizvoda,dn.popust,SUM(dn.cijena_proizvoda) as 'sumirana_cijena'
10306from proizvod as p join detalji_narudzbe as dn on p.proizvodID=dn.proizvodID
10307group by p.naziv_proizvoda,dn.popust
10308
10309
10310select MAX(c.sumirana_cijena) as 'cijena',c.popust
10311from view_cijena as c
10312group by c.popust
10313order by popust asc
10314
10315select naziv_proizvoda, round(avg(sumirana_cijena),2) as 'sumirana cijena'
10316from view_cijena
10317group by naziv_proizvoda
10318order by round(avg(sumirana_cijena),2) desc
10319
10320/*
103218. Dati pregled kupovine po rednom broju dana u mjesecu. Upit treba da sadrži naziv proizvoda, redni broj dana u mjesecu i ukupan broj prodaje proizvoda na taj redni broj dana. Npr, proizvod_1 se 1 dana u mjesecu prodao 3 puta. Uslov je da se da prikaz za prvu polovinu mjeseca.
10322*/
10323
10324SELECT p.naziv_proizvoda,day(n.datum_narudzbe) as 'dani_u_mjesecu',count(*) as 'koliko_puta_se_prodalo'
10325FROM proizvod as p join detalji_narudzbe as dn on p.proizvodID=dn.proizvodID JOIN narudzba as n ON dn.narudzbaID=n.narudzbaID
10326where day(n.datum_narudzbe)>=1 AND day(n.datum_narudzbe)<=15
10327GROUP BY p.naziv_proizvoda,day(n.datum_narudzbe)
10328
10329/*
103309. Kreirati pregled kojim æe se na osnovu podataka iz kolone puna_adresa prebrojati koliko puta se neka adresa pojavljuje. Upit treba da sadrži adresu i broj pojavljivanja adrese. Npr. adresa 1 se pojavljuje 10 puta. Sortirati prema broju pojavljivanja u opadajuæem redoslijedu.
10331*/
10332
10333SELECT n.puna_adresa,COUNT(n.puna_adresa) as 'broj_pojavljivanja_adrese'
10334FROM narudzba AS n
10335GROUP BY n.puna_adresa
10336ORDER BY COUNT(n.puna_adresa) desc
10337
10338
10339select left (puna_adresa, (CHARINDEX ('-',puna_adresa)-1)), count (left (puna_adresa, (CHARINDEX ('-',puna_adresa)-1)))
10340from narudzba
10341group by left (puna_adresa, (CHARINDEX ('-',puna_adresa)-1))
10342order by 2 desc
10343
10344
10345
10346
10347
10348--1
10349/*
10350a) Koristeći izričito SQL kod kreirati bazu podataka pod vlastitim brojem indeksa.
10351*/
10352CREATE DATABASE PI_2019_9_16
10353USE PI_2019_9_16
10354
10355--b) Kreiranje tabela. Voditi računa o međusobnom odnosu između tabela. Definirati odgovarajuće spoljne ključeve pomoću kojih će se tabele međusobno povezati.
10356/*
10357I. Kreirati tabelu narudzba sljedeće strukture:
10358 - narudzbaID cjelobrojna varijabla, primarni ključ
10359 - kupac, 40 unicode karaktera
10360 - puna_adresa, 80 unicode karaktera
10361 - datum_narudzbe, datumska varijabla
10362 - cijena_prevoza, novčana varijabla
10363*/
10364CREATE TABLE narudzba
10365(
10366 narudzbaID INT CONSTRAINT PK_Narudzba PRIMARY KEY,
10367 kupac NVARCHAR (40),
10368 puna_adresa NVARCHAR (80),
10369 datum_narudzbe DATE,
10370 cijena_prevoza MONEY
10371)
10372
10373/*
10374II. Kreirati tabelu proizvod sljedeće strukture:
10375 - proizvodID, , cjelobrojna varijabla, primarni ključ
10376 - naziv_proizvoda, 40 unicode karaktera
10377 - naziv_dobavljaca, 40 unicode karaktera
10378 - stanje_na_sklad, cjelobrojna varijabla
10379 - narucena_kol, cjelobrojna varijabla
10380*/
10381CREATE TABLE proizvod
10382(
10383 proizvodID INT CONSTRAINT PK_ProizvodID PRIMARY KEY,
10384 naziv_proizvoda NVARCHAR (40),
10385 naziv_dobavljaca NVARCHAR (40),
10386 stanje_na_sklad INT,
10387 narucena_kol INT
10388)
10389
10390/*
10391II. Kreirati tabelu detalji_narudzbe sljedeće strukture:
10392 - narudzbaID, cjelobrojna varijabla
10393 - proizvodID, cjelobrojna varijabla
10394 - cijena_proizvoda, novčana varijabla
10395 - kolicina, cjelobrojna varijabla
10396 - popust, decimalna varijabla
10397*/
10398CREATE TABLE detalji_narudzbe
10399(
10400 narudzbaID INT,
10401 proizvodID INT,
10402 cijena_proizvoda MONEY,
10403 kolicina INT,
10404 popust decimal (8,2),
10405 CONSTRAINT FK_Detalji_Narudzba FOREIGN KEY (narudzbaID) REFERENCES narudzba (narudzbaID),
10406 CONSTRAINT FK_Detalji_Proizvod FOREIGN KEY (proizvodID) REFERENCES proizvod (proizvodID),
10407 CONSTRAINT PK_DetaljiNarudzbe PRIMARY KEY (narudzbaID, proizvodID)
10408)
10409--10 bodova
10410
10411
10412
10413---------------------------------------------------------------------------
10414--2. Import podataka
10415/*
10416Koristeći bazu Northwind u vlastiti bazu prebaciti podatke prema zadatim pravilima.
10417a) U tabelu narudzba iz tabela Customers i Orders prebaciti:
10418 - OrderID -> narudzbaID
10419 - CompanyName -> kupac
10420 - puna_adresa - spojiti podatke iz kolona Address, PostalCode i City pri čemu je potrebno podatke razdvojiti crticom
10421 - OrderDate -> datum_narudzbe
10422 - Freight -> cijena_prevoza
10423*/
10424INSERT INTO narudzba
10425SELECT O.OrderID, C.CompanyName, C.Address + ' - ' + C.PostalCode + ' - ' + C.City,
10426 O.OrderDate, O.Freight
10427FROM Northwind.dbo.Customers AS C INNER JOIN Northwind.dbo.Orders AS O
10428ON C.CustomerID = O.CustomerID
10429--830
10430
10431SELECT * FROM narudzba
10432
10433/*
10434b) U tabelu proizvod iz tabela Products i Suppliers prebaciti:
10435 - ProductID -> proizvodID
10436 - ProductName -> naziv_proizvoda
10437 - CompanyName -> naziv_dobavljaca
10438 - UnitsInStock -> stanje_na_sklad
10439 - UnitsOnOrder -> narucena_kol
10440*/
10441INSERT INTO proizvod
10442SELECT P.ProductID, P.ProductName, S.CompanyName, P.UnitsInStock, P.UnitsOnOrder
10443FROM Northwind.dbo.Products AS P INNER JOIN Northwind.dbo.Suppliers AS S
10444ON P.SupplierID = S.SupplierID
10445--77
10446
10447/*
10448c) U tabelu detalji_narudzbe iz tabela Order Details i Products prebaciti:
10449 - OrderID -> narudzbaID
10450 - ProductID -> proizvodID
10451 - UnitPrice -> cijena_proizvoda
10452 - Quantity -> kolicina
10453 - Discount -> popust
10454*/
10455INSERT INTO detalji_narudzbe
10456SELECT OD.OrderID, OD.ProductID, OD.UnitPrice, OD.Quantity, OD.Discount
10457FROM Northwind.dbo.[Order Details] AS OD INNER JOIN Northwind.dbo.Products AS P
10458ON OD.ProductID = P.ProductID
10459--2155
10460--10 bodova
10461
10462
10463
10464
10465---------------------------------------------------------------------------
10466/*
104673.
10468a) Koristeći tabele narudzba i detalji_narudzbe kreirati pogled view_kupac_kol sljedeće strukture:
10469 - narudzbaID
10470 - kupac
10471 - datum_narudzbe
10472 - kolicina
10473uz uslov da je narudzba izvršena najranije 22 godine u odnosu na aktuelni datum.
10474*/
10475create view view_kupac_kol
10476as
10477SELECT detalji_narudzbe.narudzbaID, narudzba.kupac, narudzba.datum_narudzbe, detalji_narudzbe.kolicina
10478FROM detalji_narudzbe INNER JOIN narudzba
10479ON detalji_narudzbe.narudzbaID = narudzba.narudzbaID
10480WHERE (DATEDIFF(year, narudzba.datum_narudzbe, GETDATE()) < 22)
10481--691
10482
10483select * from view_kupac_kol
10484--12 bodova
10485
10486
10487
10488
10489---------------------------------------------------------------------------
10490/*
104914.
10492Kreirati proceduru koja će imati istu strukturu kao tabela narudzba. Voditi računa o tipovima varijabli u proceduri. Proceduru kreirati tako da je prilikom izvršavanja moguće unijeti bilo koji broj parametara (možemo ostaviti bilo koji parametar bez unijete vrijednosti). Uslov je da preuzmu samo oni zapisi u kojima nije odobren popust. Pokrenuti porceduru za sljedeće vrijednosti parametara:
104931. količina = 10
104942. ID narudžbe = 10255
10495*/
10496go
10497CREATE PROCEDURE proc_detalji_narudzbe
10498(
10499 @narudzbaID int = null,
10500 @proizvodID int = null,
10501 @cijena_proizvoda money = null,
10502 @kolicina int = null,
10503 @popust decimal (8,2) = null
10504)
10505AS
10506BEGIN
10507 SELECT narudzbaID, proizvodID, cijena_proizvoda, kolicina, popust
10508 FROM detalji_narudzbe
10509 WHERE popust = 0 AND
10510 (narudzbaID = @narudzbaID OR
10511 proizvodID = @proizvodID OR
10512 cijena_proizvoda = @cijena_proizvoda or
10513 kolicina = @kolicina or
10514 popust = @popust)
10515END
10516
10517exec proc_detalji_narudzbe @kolicina = 10
10518--130
10519
10520exec proc_detalji_narudzbe @narudzbaID = 10255
10521--4
10522--8 bodova
10523
10524
10525
10526
10527---------------------------------------------------------------------------
10528/*
105295. Kreirati pogled kojim će se dati prikaz naručenih količina prema mjesecu narudžbe. Uslov je da je narudžba izvršena u 1996. godini. Pogled treba sadržavati ID narudžbe, redni broj mjeseca i količinu.
10530*/
10531go
10532create view view_1996
10533as
10534SELECT detalji_narudzbe.narudzbaID, month (narudzba.datum_narudzbe) as mjesec, detalji_narudzbe.kolicina
10535FROM detalji_narudzbe INNER JOIN narudzba
10536 ON detalji_narudzbe.narudzbaID = narudzba.narudzbaID
10537where year (narudzba.datum_narudzbe) = 1996
10538--405
10539
10540select * from view_1996
10541
10542--7 bodova
10543
10544
10545
10546---------------------------------------------------------------------------
10547/*
105486.
10549a) Kreirati pogled koji će se sastojati od naziva dobavljača, naziva proizvoda, ukupne cijene koja je proizvod jedinične cijene i količine, ukupne cijene s popustom koja predstavlja ukupnu cijenu sa obračunatim popustom i visinu popusta izraženu kao broj. Obratiti pažnju na način računanja ukupne cijene s popustom. Uslov da je u pogledu budu samo oni zapisi kod kojih je odobren popust.
10550b) Koriseći pogled kreiran pod a) prikazati minimalnu, maksimalnu i srednju vrijednost visine popusta, te razliku između minimalne i maksimalne vrijednosti. Srednja vrijednsot predstavlja srednju vrijednost novčanih vrijednosti, pa njen prikaz treba s tim uskladiti.
10551*/
10552--a
10553create view view_popust
10554as
10555SELECT proizvod.naziv_dobavljaca, proizvod.naziv_proizvoda, detalji_narudzbe.cijena_proizvoda * detalji_narudzbe.kolicina as uk_cijena, detalji_narudzbe.cijena_proizvoda * detalji_narudzbe.kolicina * (1-detalji_narudzbe.popust) as uk_cij_sa_pop, detalji_narudzbe.cijena_proizvoda * detalji_narudzbe.kolicina * detalji_narudzbe.popust as vis_pop
10556FROM detalji_narudzbe INNER JOIN proizvod
10557 ON detalji_narudzbe.proizvodID = proizvod.proizvodID
10558 where detalji_narudzbe.popust <> 0
10559--838
10560
10561select * from view_popust
10562
10563--b
10564select min (vis_pop), MAX (vis_pop), round(AVG (vis_pop),2), MAX (vis_pop) - min (vis_pop)
10565from view_popust
10566--8 bodova
10567
10568
10569
10570
10571
10572---------------------------------------------------------------------------
10573/*
105747.
10575a) Kreirati pogled koji će prikazati sumirane cijene proizvoda po nazivu proizvoda i popustu.
10576b) Koristeći pogled kreiran pod a) prikazati maksimalne vrijednosti suma po visinama popusta. Sortirati po vrijednostima popusta u rastućem redoslijedu.
10577c) Koristeći pogled kreiran pod a) prikazati srednje vrijednosti suma po nazivima proizvoda. Sortirati po vrijednostima suma u opadajućem redoslijedu. Voditi računa da je cijena proizvoda novčana varijabla, te prema tome formatirati srednje vrijednosti.
10578*/
10579--a
10580create view view_max_popust
10581as
10582SELECT proizvod.naziv_proizvoda, detalji_narudzbe.popust, sum (detalji_narudzbe.cijena_proizvoda) as ukupno
10583FROM detalji_narudzbe INNER JOIN proizvod
10584 ON detalji_narudzbe.proizvodID = proizvod.proizvodID
10585group by proizvod.naziv_proizvoda, detalji_narudzbe.popust
10586--407
10587
10588--b
10589select popust, max (ukupno)
10590from view_max_popust
10591group by popust
10592--11
10593/*
105940.00 3530.90
105950.01 15.00
105960.02 25.00
105970.03 33.25
105980.04 81.00
105990.05 1212.10
106000.06 34.00
106010.10 527.00
106020.15 297.00
106030.20 421.60
106040.25 742.74
10605*/
10606--c
10607select naziv_proizvoda, round (avg (ukupno),2)
10608from view_max_popust
10609group by naziv_proizvoda
10610order by 2 desc
10611--77
10612--15 bodova
10613
10614
10615
10616---------------------------------------------------------------------------
10617/*
106188. Dati pregled kupovine po rednom broju dana u mjesecu. Upit treba da sadrži naziv proizvoda, redni broj dana u mjesecu i ukupan broj prodaje proizvoda na taj redni broj dana. Npr, proizvod_1 se 1 dana u mjesecu prodao 3 puta. Uslova je da se dadne prikaz za prvu polovicu mjeseca.
10619*/
10620SELECT proizvod.naziv_proizvoda, day (narudzba.datum_narudzbe) as r_br_dana, count (day (narudzba.datum_narudzbe))
10621FROM detalji_narudzbe INNER JOIN narudzba
10622 ON detalji_narudzbe.narudzbaID = narudzba.narudzbaID INNER JOIN proizvod
10623 ON detalji_narudzbe.proizvodID = proizvod.proizvodID
10624where day (narudzba.datum_narudzbe) between 1 and 15
10625group by proizvod.naziv_proizvoda, day (narudzba.datum_narudzbe)
10626--646
10627--15 bodova
10628
10629
10630
10631
10632
10633---------------------------------------------------------------------------
10634/*
106359. Kreirati pregled kojim će se na osnovu podataka iz kolone puna_adresa prebrojati koliko puta se neka adresa pojavljuje. Upit treba da sadrži adresu i broj pojavljivanja adrese. Npr. adresa 1 se pojavljuje 10 puta. Sortirati prema broju pojavljivanja u opadajućem redoslijedu.
10636*/
10637select left (puna_adresa, (CHARINDEX ('-',puna_adresa)-1)), count (left (puna_adresa, (CHARINDEX ('-',puna_adresa)-1)))
10638from narudzba
10639group by left (puna_adresa, (CHARINDEX ('-',puna_adresa)-1))
10640order by 2 desc
10641--89
10642--15 bodova
10643create database probajseneubit
10644USE probajseneubit
10645--b) Kreiranje tabela. Prilikom kreiranja tabela voditi računa o spojnim poljima između tabela.
10646/*
10647I. Kreirati tabelu TipProizv koja se sastoji od polja:
10648 - potkatID - cjelobrojna varijabla, primarni ključ
10649 - katID - cjelobrojna varijabla, obavezan unos
10650 - kat_naziv - 50 unicode karaktera, obavezan unos
10651 - potkat_naziv - 50 unicode karaktera, obavezan unos
10652*/
10653create table TipProizv
10654(
10655 potkatID int constraint PK_TipProizv primary key (potkatID),
10656 katID int not null,
10657 kat_naziv nvarchar(50) not null,
10658 potkat_naziv nvarchar(50)
10659)
10660
10661/*
10662II. Kreirati tabelu proizvod koja se sastoji od polja:
10663 - proizvodID - cjelobrojna varijabla, primarni ključ
10664 - naziv - 50 UNICODE karaktera, obavezan unos
10665 - boja - 15 UNICODE karaktera
10666 - tezina - decimalni broj decimal(8, 2),
10667 - dana_za_proiz - cjelobrojna varijabla, obavezan unos
10668 - klasa - 2 unicode karaktera
10669 -dtmm_poc_prodaje- datumska varijabla samo za unos datuma (bez vremena)
10670 - potkat_ID cjelobrojna varijabla, obavezan unos
10671*/
10672create table proizvod
10673(
10674 proizvodID int constraint PK_proizvod Primary key (proizvodID),
10675 naziv nvarchar(50) not null,
10676 boja nvarchar(15),
10677 tezina decimal(8, 2),
10678 dana_za_proiz int not null,
10679 klasa nvarchar (2),
10680 dtm_poc_prodaje date,
10681 potkatID int not null
10682 constraint FK_proizvod_TipProiz foreign key (potkatID) references TipProizv (potkatID)
10683)
10684
10685/*
10686III. Kreirati tabelu nalog koja se sastoji od polja:
10687 - nalogID - cjelobrojna varijabla, primarni ključ
10688 - proizvodID - cjelobrojna varijabla, obavezan unos
10689 - naruc_kol - cjelobrojna varijabla, obavezan unos
10690 - stanje_kol - cjelobrojna varijabla, obavezan unos
10691 - dtm_zaduz - datumska varijabla samo za unos datuma (bez vremena)
10692 - oznaka_greske - 50 unicode karaktera, obavezan unos
10693*/
10694create table nalog
10695(
10696 nalogID int not null primary key,
10697 proizvodID int not null,
10698 naruc_kol int not null,
10699 stanje_kol int not null,
10700 dtm_zaduz date,
10701 oznaka_greske nvarchar(50) not null,
10702 constraint FK_nalog_proizvod foreign key (proizvodID) references proizvod (proizvodID)
10703)
10704--15 bodova
10705
10706--2. Importovanje podataka
10707/*
10708a) U tabelu TipProizv importovati podatke iz tabela ProductSubcategory i ProductCategory baze AdventureWorks2014 koje se nalaze u šemi Production na sljedeći način:
10709 - ProductSubcategoryID -> potkatID
10710 - ProductCategoryID -> katID
10711 - Name -> kat_naziv
10712 - Name -> potkat_naziv
10713Voditi računa o pripadnosti polja tabelama iz kojih se importuju podaci.
10714*/
10715
10716INSERT INTO TipProizv
10717SELECT PS.ProductSubcategoryID, PC.ProductCategoryID, PC.Name, PS.Name
10718FROM AdventureWorks2014.Production.ProductCategory AS PC INNER JOIN AdventureWorks2014.Production.ProductSubcategory AS PS
10719ON PC.ProductCategoryID = PS.ProductCategoryID
10720
10721/*b) U tabelu proizvod importovati podatke iz tabele Product baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
10722 - ProductID -> proizvodID
10723 - Name -> naziv
10724 - Color -> boja
10725 - Weight -> tezina
10726 - DaysToManufacture -> dana_za_proiz
10727 - Class -> klasa
10728 - ProductSubcategoryID -> potkatID
10729uz uslov da je ProductSubcategoryID sadrži vrijednost.
10730*/
10731
10732INSERT INTO proizvod(proizvodID, naziv, boja, tezina, dana_za_proiz, klasa, potkatID)
10733select p.ProductID, P.Name, P.Color, P.Weight, P.DaysToManufacture, P.Class, P.ProductSubcategoryID
10734FROM AdventureWorks2014.Production.Product AS P
10735where P.ProductSubcategoryID is not null
10736
10737/*
10738c) U tabelu nalog importovati podatke iz tabela WorkOrder i ScrapReason baze AdventureWorks2014 koja se nalazi u šemi Production na sljedeći način:
10739 - WorkOrderID -> nalogID
10740 - ProductID -> proizvodID
10741 - OrderQty -> naruc_kol
10742 - StockedQty -> stanje_kol
10743 - DueDate -> dtm_zaduz
10744 - Name -> oznaka_greske
10745uz uslov da je ProductID veći ili jednak 680.
10746*/
10747INSERT INTO nalog
10748SELECT WO.WorkOrderID, WO.ProductID, WO.OrderQty, WO.StockedQty, WO.DueDate, SR.Name
10749FROM AdventureWorks2014.Production.WorkOrder as WO INNER JOIN AdventureWorks2014.Production.ScrapReason as SR
10750ON SR.ScrapReasonID = WO.ScrapReasonID
10751where WO.ProductID >= 680
10752
10753/*
107543. Iz tabele proizvod dati pregled koji će se sastojati od polja:
10755
10756mjesec - mjesec iz datuma početka prodaje
10757uk_broj_po_mj - ukupan broj zapisa po mjesecima
10758
107595 bodova
10760*/
10761
10762select MONTH(dtm_poc_prodaje) AS 'mjesec', count(*)
10763from proizvod
10764group by month(dtm_poc_prodaje)
10765
10766/*
107674. Iz tabele nalog kreirati pogled view_greska koji će se sastojati od polja:
10768- nalogID, proizvodID, dtm_zaduz, uz uslov da se u oznaci greške bilo gdje pojavi riječ 'brake'
10769
1077010 bodova
10771
10772
10773*/
10774
10775go
10776create view view_greska
10777as
10778select n.nalogID, n.proizvodID, n.dtm_zaduz, n.oznaka_greske
10779from nalog as n
10780where n.oznaka_greske LIKE '%Brake%'
10781/*
107825. Koristeći pogled view_greska kreirati proceduru proc_greska kojom će se definisati ulazni parametar godina
10783a procedura će imati strukturu
10784-godina
10785-prebrojano, broj grešaka po godinama
10786Proc pokrenuti za vrijednost parametra 2011 i 2014
10787
1078810 bodova
10789
10790*/
10791
10792go
10793create procedure proc_greska
10794(
10795@godina int=null
10796)
10797as
10798begin
10799select year(dtm_zaduz) as 'godina', count(*) as 'prebrojano'
10800from view_greska
10801where @godina=year(dtm_zaduz)
10802group by year(dtm_zaduz)
10803end;
10804
10805exec proc_greska @godina=2014
10806exec proc_greska @godina=2011
10807/*
108086. Koristeći tabele proizvod i nalog kreirati pogled view_tezina sljedeće strukture:
10809- potkatID,
10810- suma_tez suma tezina
10811Uslov je da se preuzimaju zapisi u kojima se nalaze vrijednosti u kolonama boja i težina
10812*/
10813
10814go
10815create view view_tezina
10816as
10817select p.potkatID, sum(p.tezina) as 'suma'
10818from proizvod as p join nalog as n on n.proizvodID=p.proizvodID
10819where p.boja IS NOT NULL AND p.tezina IS NOT NULL
10820GROUP BY P.potkatID
10821*/
10822/*
10823Koristeći pogled view_tezina prebrojati broj zapisa koji su veći ili jednaki, odnosno manji od srednje vrijednosti. Rezultat upita trebaju biti isključivo dvije poruke:
10824'Broj zapisa u kojima je suma veća ili jednaka srednjoj vrijednosti sume težina je: ' nakon čega slijedi prebrojati
10825'Broj zapisa u kojima je suma manja srednjoj vrijednosti sume težina je: ' nakon čega slijedi prebrojani broj
10826Neće se priznati rješenje koje vraća dvije ili više kolona
10827
10828---- spajanje poruka, vise od jedne je UNION !
10829
1083015 bodoba
10831*/
10832
10833select 'broj zapisa u kojima je suma veca ili jednaka sredjnoj vrijednosti sume tezina je:' + CONVERT(nvarchar,COUNT(suma))
10834from view_tezina
10835where suma>=AVG(suma)
10836UNION
10837SELECT
10838FROM
10839group by
10840having
10841
10842*/
10843/*
108448. a)Kreirati pogled view_proizv_greska koji će se sastojati od polja:
10845proizvodID, oznaka_greske, uk_broj_gresaka kojim će se prebrojati ukupan broj pojavljivanja grešaka po proizvodID i nazivu greške.
10846b) Koristeći pogled view_proizv_greska dati informaciju o proizvodima na kojim je ustanovljeno više vrsta grešaka
10847Sortirati po opadajućem redoslijedu prema broju poajvljivanja
10848
10849
1085015 bodova
10851*/
10852
10853go
10854create view view_proizv_greska
10855as
10856select n.proizvodID, n.oznaka_greske, count(n.oznaka_greske) as 'ukupan_broj'
10857from nalog as n
10858group by n.proizvodID, n.oznaka_greske
10859
10860
10861
10862 select proizvodID,COUNT(ukupan_broj) as ' uk_prebrojano'
10863 from view_proizv_greska
10864 group by proizvodID
10865 order by 2 desc
10866
10867*/
10868/*
108699. Kreirati pogled kojim će se dati prikaz nalogID, proizvodID, broja godina razlike u odnosnu na trenutnu (aktivnu), oznaku boje koju će predstavljati prvo slovo naziva (npr. Puprle) -> P, klase i naziva potkat. Izraz za izračunavanje broja godina razlike treba biti opšteg karaktera. Uslov je da naziv potkat sadrži 'Bikes', te da boja nije crna.Obavezno napisati kod za pregled sadržaja pogleda.
10870
10871
10872*/
10873
10874go
10875create view view_neki
10876as
10877select N.nalogID, N.proizvodID,DATEDIFF(YEAR,N.dtm_zaduz,GETDATE()) as 'razlika_godina', LEFT(P.boja,1) AS 'oznaka_boje',P.klasa,TP.potkat_naziv
10878from nalog as N join proizvod as P ON N.proizvodID=P.proizvodID join TipProizv as TP ON P.potkatID=TP.potkatID
10879where TP.potkat_naziv like '%Bikes%' AND P.boja NOT LIKE 'Black'
10880
10881
10882SELECT* from view_neki
10883/*
1088410.a) Kreirati backup baze na default lokaciju
10885b) obrisati bazu
10886c) restore baze
10887*/
10888backup database probajseneubit
10889to disk = 'probajseneubit.bak'
10890
10891use master
10892
10893alter database probajseneubit
10894set offline
10895
10896drop database probajseneubit
10897
10898restore database probajseneubit
10899from disk = 'probajseneubit.bak'
10900with replace
10901
10902*/
10903
10904
10905*/
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
10920
10921
10922
10923
10924
10925--29.06.2022.
10926
10927--BAZE PODATAKA II – ISPIT
10928
10929--***Prilikom izrade zadataka, OBAVEZNO iznad svakog zadatka napisati redni broj zadatka npr (4c). Zadaci koji ne budu oznaèeni na prethodno definisan naèin neæe biti evaluirani.
10930
10931--1. Kroz SQL kod kreirati bazu podataka sa imenom vašeg broja indeksa.
10932CREATE DATABASE brojIndexa
10933GO
10934USE brojIndexa
10935GO
10936--2. U kreiranoj bazi podataka kreirati tabele sa sljedeæom strukturom:
10937--a) Proizvodi
10938--• ProizvodID, cjelobrojna vrijednost i primarni kljuè, autoinkrement
10939--• Naziv, 50 UNICODE karaktera (obavezan unos)
10940--• SifraProizvoda, 25 UNICODE karaktera (obavezan unos)
10941--• Boja, 15 UNICODE karaktera
10942--• NazivKategorije, 50 UNICODE (obavezan unos)
10943--• Tezina, decimalna vrijednost sa 2 znaka iza zareza
10944CREATE TABLE Proizvodi
10945(
10946 ProizvodID INT CONSTRAINT PK_Proizvod PRIMARY KEY IDENTITY(1,1),
10947 Naziv NVARCHAR(50) NOT NULL,
10948 SifraProizvoda NVARCHAR(25) NOT NULL,
10949 Boja NVARCHAR(15),
10950 NazivKategorije NVARCHAR(50) NOT NULL,
10951 Tezina DECIMAL(18,2)
10952
10953)
10954GO
10955--b) ZaglavljeNarudzbe
10956--• NarudzbaID, cjelobrojna vrijednost i primarni kljuè, autoinkrement
10957--• DatumNarudzbe, polje za unos datuma i vremena (obavezan unos)
10958--• DatumIsporuke, polje za unos datuma i vremena
10959--• ImeKupca, 50 UNICODE (obavezan unos)
10960--• PrezimeKupca, 50 UNICODE (obavezan unos)
10961--• NazivTeritorije, 50 UNICODE (obavezan unos)
10962--• NazivRegije, 50 UNICODE (obavezan unos)
10963--• NacinIsporuke, 50 UNICODE (obavezan unos)
10964CREATE TABLE ZaglavljeNarudzbe
10965(
10966 NarudzbaID INT CONSTRAINT PK_ZaglavljeNarudzbe PRIMARY KEY IDENTITY(1,1),
10967 DatumNarudzbe DATETIME NOT NULL,
10968 DatumIsporuke DATETIME,
10969 ImeKupca NVARCHAR(50) NOT NULL,
10970 PrezimeKupca NVARCHAR(50) NOT NULL,
10971 NazivTeritorije NVARCHAR(50) NOT NULL,
10972 NazivRegije NVARCHAR(50) NOT NULL,
10973 NacinIsporuke NVARCHAR(50) NOT NULL
10974)
10975GO
10976--c) DetaljiNarudzbe
10977--• NarudzbaID, cjelobrojna vrijednost, strani kljuè
10978--• ProizvodID, cjelobrojna vrijednost, strani kljuè
10979--• Cijena, novèani tip (obavezan unos),
10980--• Kolicina, skraæeni cjelobrojni tip (obavezan unos),
10981--• Popust, novèani tip (obavezan unos)
10982CREATE TABLE DetaljiNarudzbe
10983(
10984 NarudzbaID INT NOT NULL CONSTRAINT FK_ZaglavljeNarudzbe FOREIGN KEY REFERENCES ZaglavljeNarudzbe(NarudzbaID),
10985 ProizvodID INT NOT NULL CONSTRAINT FK_Proizvodi FOREIGN KEY REFERENCES Proizvodi(ProizvodID),
10986 Cijena MONEY NOT NULL,
10987 Kolicina SMALLINT NOT NULL,
10988 Popust MONEY NOT NULL,
10989 DetaljiNarudzbe INT CONSTRAINT PK_DetaljiNarudzbe PRIMARY KEY IDENTITY(1,1)
10990)
10991GO
10992--**Jedan proizvod se može više puta naruèiti, dok jedna narudžba može sadržavati više proizvoda. U okviru jedne narudžbe jedan proizvod se može naruèiti više puta.
10993--7 bodova
10994--3. Iz baze podataka AdventureWorks u svoju bazu podataka prebaciti sljedeæe podatke:
10995--a) U tabelu Proizvodi dodati sve proizvode, na mjestima gdje nema pohranjenih podataka o težini zamijeniti vrijednost sa 0
10996--• ProductID -> ProizvodID
10997--• Name -> Naziv
10998--• ProductNumber -> SifraProizvoda
10999--• Color -> Boja
11000--• Name (ProductCategory) -> NazivKategorije
11001--• Weight -> Tezina
11002SET IDENTITY_INSERT Proizvodi ON
11003INSERT INTO Proizvodi(ProizvodID,Naziv,SifraProizvoda,Boja,NazivKategorije,Tezina)
11004SELECT P.ProductID,P.Name,P.ProductNumber,P.Color,PC.Name,ISNULL(P.Weight,0)
11005FROM AdventureWorks2017.Production.Product AS P
11006INNER JOIN AdventureWorks2017.Production.ProductSubcategory AS PS
11007ON P.ProductSubcategoryID=PS.ProductSubcategoryID
11008INNER JOIN AdventureWorks2017.Production.ProductCategory AS PC
11009ON PS.ProductCategoryID=PC.ProductCategoryID
11010SET IDENTITY_INSERT Proizvodi OFF
11011GO
11012
11013--b) U tabelu ZaglavljeNarudzbe dodati sve narudžbe
11014--• SalesOrderID -> NarudzbaID
11015--• OrderDate -> DatumNarudzbe
11016--• ShipDate -> DatumIsporuke
11017--• FirstName (Person) -> ImeKupca
11018--• LastName (Person) -> PrezimeKupca
11019--• Name (SalesTerritory) -> NazivTeritorije
11020--• Group (SalesTerritory) -> NazivRegije
11021--• Name (ShipMethod) -> NacinIsporuke
11022SET IDENTITY_INSERT ZaglavljeNarudzbe ON
11023INSERT INTO ZaglavljeNarudzbe(NarudzbaID,DatumNarudzbe,DatumIsporuke,ImeKupca,PrezimeKupca,NazivTeritorije,NazivRegije,NacinIsporuke)
11024SELECT SOH.SalesOrderID,SOH.OrderDate,SOH.ShipDate,PP.FirstName,PP.LastName,ST.Name,ST.[Group],SM.Name
11025FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
11026INNER JOIN AdventureWorks2017.Sales.Customer AS SC
11027ON SOH.CustomerID=SC.CustomerID
11028INNER JOIN AdventureWorks2017.Person.Person AS PP
11029ON SC.PersonID=PP.BusinessEntityID
11030INNER JOIN AdventureWorks2017.Sales.SalesTerritory AS ST
11031ON ST.TerritoryID=SOH.TerritoryID
11032INNER JOIN AdventureWorks2017.Purchasing.ShipMethod AS SM
11033ON SOH.ShipMethodID=SM.ShipMethodID
11034SET IDENTITY_INSERT ZaglavljeNarudzbe OFF
11035GO
11036--c) U tabelu DetaljiNarudzbe dodati sve stavke narudžbe
11037--• SalesOrderID -> NarudzbaID
11038--• ProductID -> ProizvodID
11039--• UnitPrice -> Cijena
11040--• OrderQty -> Kolicina
11041--• UnitPriceDiscount -> Popust
11042--8 bodova
11043INSERT INTO DetaljiNarudzbe
11044SELECT SOD.SalesOrderID,SOD.ProductID,SOD.UnitPrice,SOD.OrderQty,SOD.UnitPriceDiscount
11045FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
11046GO
11047--4.
11048--a) (6 bodova) Kreirati upit koji æe prikazati ukupan broj uposlenika po odjelima. Potrebno je prebrojati samo one uposlenike koji su trenutno aktivni, odnosno rade na datom odjelu. Takoðer, samo uzeti u obzir one uposlenike koji imaju više od 10 godina radnog staža (ne ukljuèujuæi graniènu vrijednost). Rezultate sortirati preba broju uposlenika u opadajuæem redoslijedu. (AdventureWorks2017)
11049USE AdventureWorks2017
11050SELECT D.Name,COUNT(*) 'Broj uposlenika'
11051FROM HumanResources.Employee AS E
11052INNER JOIN HumanResources.EmployeeDepartmentHistory AS EDH
11053ON E.BusinessEntityID=EDH.BusinessEntityID
11054INNER JOIN HumanResources.Department AS D
11055ON EDH.DepartmentID=D.DepartmentID
11056WHERE EDH.EndDate IS NULL AND DATEDIFF(YEAR,E.HireDate,GETDATE())>10
11057GROUP BY D.Name
11058ORDER BY 2 DESC
11059GO
11060--, SUM(IIF(POD.RejectedQty>100,1,0)) 'Broj stavki'
11061--b) Kreirati upit koji prikazuje po mjesecima ukupnu vrijednost poruèene robe za skladište, te ukupnu kolièinu primljene robe, iskljuèivo u 2012 godini. Uslov je da su troškovi prevoza bili izmeðu 500 i 2500, a da je dostava izvršena CARGO transportom. Takoðer u rezultatima upita je potrebno prebrojati stavke narudžbe na kojima je odbijena kolièina veæa od 100.(AdventureWorks2017)
11062USE AdventureWorks2017
11063--1. NAÈIN
11064 SELECT MONTH(POH.OrderDate) 'Mjesec', SUM(POD.LineTotal), SUM(POD.ReceivedQty),SUM(IIF(POD.RejectedQty>100,1,0)) 'Broj stavki'
11065 FROM Purchasing.PurchaseOrderHeader AS POH
11066 INNER JOIN Purchasing.PurchaseOrderDetail AS POD
11067 ON POH.PurchaseOrderID=POD.PurchaseOrderID
11068 INNER JOIN Purchasing.ShipMethod AS SM
11069 ON POH.ShipMethodID=SM.ShipMethodID
11070 WHERE YEAR(POH.OrderDate)=2012 AND POH.Freight BETWEEN 500 AND 2500 AND SM.Name LIKE '%CARGO%'
11071 GROUP BY MONTH(POH.OrderDate)
11072GO
11073--2. NAÈIN
11074 SELECT MONTH(POH.OrderDate) 'Mjesec', SUM(POD.LineTotal), SUM(POD.ReceivedQty),(SELECT COUNT(*)
11075 FROM Purchasing.PurchaseOrderHeader AS POH1
11076 INNER JOIN Purchasing.PurchaseOrderDetail AS POD1
11077 ON POH1.PurchaseOrderID=POD1.PurchaseOrderID
11078 INNER JOIN Purchasing.ShipMethod AS SM1
11079 ON POH1.ShipMethodID=SM1.ShipMethodID
11080 WHERE MONTH(POH.OrderDate)=MONTH(POH1.OrderDate) AND POD1.RejectedQty>100 AND YEAR(POH1.OrderDate)=2012 AND POH1.Freight BETWEEN 500 AND 2500 AND SM1.Name LIKE '%CARGO%')
11081 FROM Purchasing.PurchaseOrderHeader AS POH
11082 INNER JOIN Purchasing.PurchaseOrderDetail AS POD
11083 ON POH.PurchaseOrderID=POD.PurchaseOrderID
11084 INNER JOIN Purchasing.ShipMethod AS SM
11085 ON POH.ShipMethodID=SM.ShipMethodID
11086 WHERE YEAR(POH.OrderDate)=2012 AND POH.Freight BETWEEN 500 AND 2500 AND SM.Name LIKE '%CARGO%'
11087 GROUP BY MONTH(POH.OrderDate)
11088
11089GO
11090
11091--3. NAÈIN
11092 SELECT Q.Mjesec, SUM(Q.[Ukupna vrijednost]) 'Ukupna vrijednost', SUM(Q.[Ukupna kolièina]) 'Ukupna kolièina',SUM(Q.[Stavke narudzbe]) 'Stavke narudzbe'
11093FROM
11094(SELECT MONTH(POH.OrderDate) 'Mjesec', SUM(POD.LineTotal) 'Ukupna vrijednost', SUM(POD.ReceivedQty) 'Ukupna kolièina', (SELECT COUNT(*)
11095 FROM
11096 AdventureWorks2017.Purchasing.PurchaseOrderDetail AS POD1
11097 WHERE POD1.RejectedQty>100 AND POD.PurchaseOrderID=POD1.PurchaseOrderID) 'Stavke narudzbe'
11098
11099FROM Purchasing.PurchaseOrderDetail AS POD
11100INNER JOIN Purchasing.PurchaseOrderHeader AS POH
11101ON POD.PurchaseOrderID=POH.PurchaseOrderID
11102INNER JOIN Purchasing.ShipMethod AS SM
11103ON POH.ShipMethodID=SM.ShipMethodID
11104WHERE YEAR(POH.OrderDate)=2012 AND (POH.Freight BETWEEN 500 AND 2500) AND SM.Name LIKE '%CARGO%'
11105GROUP BY MONTH(POH.OrderDate), POD.PurchaseOrderID) AS Q
11106GROUP BY Q.Mjesec
11107
11108GO
11109 --PROVJERA
11110 SELECT POH.OrderDate, POD.RejectedQty, POD.PurchaseOrderDetailID, POH.PurchaseOrderID
11111 FROM Purchasing.PurchaseOrderHeader AS POH
11112 INNER JOIN Purchasing.PurchaseOrderDetail AS POD
11113 ON POH.PurchaseOrderID=POD.PurchaseOrderID
11114 INNER JOIN Purchasing.ShipMethod AS SM
11115 ON POH.ShipMethodID=SM.ShipMethodID
11116 WHERE YEAR(POH.OrderDate)=2012 AND POH.Freight BETWEEN 500 AND 2500 AND SM.Name LIKE '%CARGO%' AND MONTH(POH.OrderDate) =1
11117 --GROUP BY MONTH(POH.OrderDate), POD.RejectedQty
11118GO
11119--c) (11 bodova) Prikazati ukupan broj narudžbi koje su obradili uposlenici, za svakog uposlenika pojedinaèno. Uslov je da su narudžbe kreirane u 2011 ili 2012 godini, te da je u okviru jedne narudžbe odobren popust na dvije ili više stavki. Takoðer uzeti u obzir samo one narudžbe koje su isporuèene u Veliku Britaniju, Kanadu ili Francusku. (AdventureWorks2017)
11120
11121SELECT PP.LastName,PP.FirstName, COUNT(*) 'Broj narudžbi'
11122FROM Person.Person AS PP
11123INNER JOIN HumanResources.Employee AS E
11124ON PP.BusinessEntityID=E.BusinessEntityID
11125INNER JOIN Sales.SalesPerson AS SP
11126ON SP.BusinessEntityID=E.BusinessEntityID
11127INNER JOIN Sales.SalesOrderHeader AS SOH
11128ON SOH.SalesPersonID=SP.BusinessEntityID
11129INNER JOIN Sales.SalesTerritory AS ST
11130ON ST.TerritoryID=SOH.TerritoryID
11131WHERE YEAR(SOH.OrderDate) IN (2011,2012) AND ST.Name IN ('United Kingdom', 'Canada', 'France') AND (SELECT COUNT(*)
11132 FROM Sales.SalesOrderDetail AS SOD
11133 WHERE SOD.SalesOrderID=SOH.SalesOrderID AND
11134 SOD.UnitPriceDiscount>0) >=2
11135GROUP BY PP.LastName,PP.FirstName
11136ORDER BY 3 DESC
11137
11138GO
11139
11140
11141
11142
11143--d) (11 bodova) Napisati upit koji æe prikazati sljedeæe podatke o proizvodima: naziv proizvoda, naziv kompanije dobavljaèa, kolièinu na skladištu, te kreiranu šifru proizvoda. Šifra se sastoji od sljedeæih vrijednosti: (Northwind)
11144--1) Prva dva slova naziva proizvoda
11145--2) Karakter /
11146--3) Prva dva slova druge rijeèi naziva kompanije dobavljaèa, uzeti u obzir one kompanije koje u nazivu imaju 2 ili 3 rijeèi
11147--4) ID proizvoda po pravilu ukoliko se radi o jednocifrenom broju na njega dodati slovo 'a', u ostalim sluèajevima dodati obrnutu vrijednost broja
11148--Npr. Za proizvod sa nazivom Chai i sa dobavljaèem naziva Exotic Liquids, šifra æe btiti Ch/Li1a.
11149
11150USE Northwind
11151GO
11152SELECT P.ProductName,S.CompanyName,P.UnitsInStock,LEFT(P.ProductName,2)+'/'+LEFT(SUBSTRING(S.CompanyName,CHARINDEX(' ',S.CompanyName)+1,LEN(S.CompanyName)),2)+IIF(P.ProductID BETWEEN 1 AND 9,'a', REVERSE(P.ProductID)), P.ProductID
11153FROM Products AS P
11154INNER JOIN Suppliers AS S
11155ON P.SupplierID=S.SupplierID
11156WHERE LEN(S.CompanyName)-LEN(REPLACE(S.CompanyName,' ','')) IN (1,2)
11157
11158GO
11159-- 37 bodova
11160--5.
11161--a) (3 boda) U kreiranoj bazi kreirati index kojim æe se ubrzati pretraga prema šifri i nazivu proizvoda. Napisati upit za potpuno iskorištenje indexa.
11162USE brojIndexa
11163GO
11164
11165CREATE INDEX IX_Search_Products
11166ON Proizvodi(SifraProizvoda,Naziv)
11167
11168SELECT P.SifraProizvoda,P.Naziv
11169FROM Proizvodi AS P
11170WHERE P.SifraProizvoda LIKE 'F%' AND P.Naziv LIKE 'H%'
11171--b) (7 bodova) U kreiranoj bazi kreirati proceduru sp_search_products kojom æe se vratiti podaci o proizvodima na osnovu kategorije kojoj pripadaju ili težini. Korisnici ne moraju unijeti niti jedan od parametara ali u tom sluèaju procedura ne vraæa niti jedan od zapisa. Korisnicima unosom veæ prvog slova kategorije se trebaju osvježiti zapisi, a vrijednost unesenog parametra težina æe vratiti one proizvode èija težina je veæa od unesene vrijednosti.
11172GO
11173CREATE PROCEDURE sp_search_products
11174(
11175@Kategorija NVARCHAR(50)=NULL,
11176@Tezina DECIMAL(18,2)=NULL
11177)
11178AS
11179BEGIN
11180 SELECT*
11181 FROM Proizvodi AS P
11182 WHERE P.NazivKategorije LIKE @Kategorija+'%' OR P.Tezina>@Tezina
11183END
11184GO
11185
11186
11187EXEC sp_search_products 'Clothing'
11188EXEC sp_search_products @Tezina=2.2
11189EXEC sp_search_products
11190--c) (18 bodova) Zbog proglašenja dobitnika nagradne igre održane u prva dva mjeseca drugog kvartala 2013 godine potrebno je kreirati upit. Upitom æe se prikazati treæa najveæa narudžba (vrijednost bez popusta) za svaki mjesec pojedinaèno. Obzirom da je u pravilima nagradne igre potrebno nagraditi 2 osobe (muškarca i ženu) za svaki mjesec, potrebno je u rezultatima upita prikazati pored navedenih stavki i o kojem se kupcu radi odnosno ime i prezime, te koju je nagradu osvojio. Nagrade se dodjeljuju po sljedeæem pravilu:
11191--• za žene u prvom mjesecu drugog kvartala je stoni mikser, dok je za muškarce usisivaè
11192--• za žene u drugom mjesecu drugog kvartala je pegla, dok je za muškarc multicooker
11193-- Obzirom da za kupce nije eksplicitno naveden spol, odreðivat æe se po pravilu: Ako je zadnje slovo imena a, smatra se da je osoba ženskog spola u suprotnom radi se o osobi muškog spola. Rezultate u formiranoj tabeli dobitnika sortirati prema vrijednosti narudžbe u opadajuæem redoslijedu. (AdventureWorks2017)
11194--28 bodova
11195--6. Dokument teorija_28_06_2022, preimenovati vašim brojem indeksa, te u tom dokumentu izraditi pitanja.
11196--20 bodova
11197--SQL skriptu (bila prazna ili ne) imenovati Vašim brojem indeksa npr IB200001.sql, te istu zajedno sa .docx dokumentom kompromitovati u jednu datoteku naziva npr IB200001.zip i upload-ovati na ftp u folder Upload.
11198--Maksimalan broj bodova:100
11199--Prag prolaznosti: 55
11200GO
11201 USE AdventureWorks2017
11202 SELECT*
11203 FROM(SELECT TOP 1 T1.SalesOrderID,T1.FirstName,T1.LastName,T1.[Ukupna vrijednost], T1.Nagrada
11204 FROM (SELECT TOP 3 SOH.SalesOrderID,PP.FirstName,PP.LastName ,SUM(SOD.UnitPrice*SOD.OrderQty) 'Ukupna vrijednost','Stoni mikser' Nagrada
11205 FROM Sales.SalesOrderHeader AS SOH
11206 INNER JOIN Sales.SalesOrderDetail AS SOD
11207 ON SOH.SalesOrderID=SOD.SalesOrderID
11208 INNER JOIN Sales.Customer AS SC
11209 ON SOH.CustomerID=SC.CustomerID
11210 INNER JOIN Person.Person AS PP
11211 ON SC.PersonID=PP.BusinessEntityID
11212 WHERE YEAR(SOH.OrderDate)=2013 AND MONTH(SOH.OrderDate)=4 AND RIGHT(PP.FirstName,1)='a'
11213 GROUP BY SOH.SalesOrderID,PP.FirstName,PP.LastName
11214 ORDER BY 4 DESC) AS T1
11215 ORDER BY 4 ASC) AS T2
11216 UNION
11217 SELECT*
11218 FROM(SELECT TOP 1 T1.SalesOrderID,T1.FirstName,T1.LastName,T1.[Ukupna vrijednost], T1.Nagrada
11219 FROM (SELECT TOP 3 SOH.SalesOrderID,PP.FirstName,PP.LastName ,SUM(SOD.UnitPrice*SOD.OrderQty) 'Ukupna vrijednost','Usisivaè' Nagrada
11220 FROM Sales.SalesOrderHeader AS SOH
11221 INNER JOIN Sales.SalesOrderDetail AS SOD
11222 ON SOH.SalesOrderID=SOD.SalesOrderID
11223 INNER JOIN Sales.Customer AS SC
11224 ON SOH.CustomerID=SC.CustomerID
11225 INNER JOIN Person.Person AS PP
11226 ON SC.PersonID=PP.BusinessEntityID
11227 WHERE YEAR(SOH.OrderDate)=2013 AND MONTH(SOH.OrderDate)=4 AND RIGHT(PP.FirstName,1)<>'a'
11228 GROUP BY SOH.SalesOrderID,PP.FirstName,PP.LastName
11229 ORDER BY 4 DESC) AS T1
11230 ORDER BY 4 ASC) AS T2
11231 UNION
11232 SELECT*
11233 FROM(SELECT TOP 1 T1.SalesOrderID,T1.FirstName,T1.LastName,T1.[Ukupna vrijednost], T1.Nagrada
11234 FROM (SELECT TOP 3 SOH.SalesOrderID,PP.FirstName,PP.LastName ,SUM(SOD.UnitPrice*SOD.OrderQty) 'Ukupna vrijednost','Pegla' Nagrada
11235 FROM Sales.SalesOrderHeader AS SOH
11236 INNER JOIN Sales.SalesOrderDetail AS SOD
11237 ON SOH.SalesOrderID=SOD.SalesOrderID
11238 INNER JOIN Sales.Customer AS SC
11239 ON SOH.CustomerID=SC.CustomerID
11240 INNER JOIN Person.Person AS PP
11241 ON SC.PersonID=PP.BusinessEntityID
11242 WHERE YEAR(SOH.OrderDate)=2013 AND MONTH(SOH.OrderDate)=5 AND RIGHT(PP.FirstName,1)='a'
11243 GROUP BY SOH.SalesOrderID,PP.FirstName,PP.LastName
11244 ORDER BY 4 DESC) AS T1
11245 ORDER BY 4 ASC) AS T2
11246 UNION
11247 SELECT*
11248 FROM(SELECT TOP 1 T1.SalesOrderID,T1.FirstName,T1.LastName,T1.[Ukupna vrijednost], T1.Nagrada
11249 FROM (SELECT TOP 3 SOH.SalesOrderID,PP.FirstName,PP.LastName ,SUM(SOD.UnitPrice*SOD.OrderQty) 'Ukupna vrijednost','Multicooker' Nagrada
11250 FROM Sales.SalesOrderHeader AS SOH
11251 INNER JOIN Sales.SalesOrderDetail AS SOD
11252 ON SOH.SalesOrderID=SOD.SalesOrderID
11253 INNER JOIN Sales.Customer AS SC
11254 ON SOH.CustomerID=SC.CustomerID
11255 INNER JOIN Person.Person AS PP
11256 ON SC.PersonID=PP.BusinessEntityID
11257 WHERE YEAR(SOH.OrderDate)=2013 AND MONTH(SOH.OrderDate)=5 AND RIGHT(PP.FirstName,1)<>'a'
11258 GROUP BY SOH.SalesOrderID,PP.FirstName,PP.LastName
11259 ORDER BY 4 DESC) AS T1
11260 ORDER BY 4 ASC) AS T2
11261 ORDER BY [Ukupna vrijednost] DESC
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273--1 ZADATAK
11274
11275CREATE DATABASE Indeks
11276GO
11277USE Indeks
11278GO
11279
11280CREATE TABLE Narudzba
11281(
11282 NarudzbaID INT NOT NULL PRIMARY KEY (NarudzbaID),
11283 DatumNarudzbe DATE NULL,
11284 DatumPrijema DATE NULL,
11285 DatumIsporuke DATE NULL,
11286 TrosakPrevoza MONEY NULL,
11287 PunaAdresa NVARCHAR (70) NULL
11288)
11289
11290CREATE TABLE Dobavljac
11291(
11292 DobavljacID INT NOT NULL PRIMARY KEY (DobavljacID),
11293 NazivDobavljaca nvarchar(40) NOT NULL,
11294 PunaAdresa nvarchar(60) NULL,
11295 Drzava nvarchar(15) NULL,
11296
11297)
11298
11299CREATE TABLE Proizvod
11300(
11301 NarudzbaID INT NOT NULL CONSTRAINT FK_Proizvod_Narudzba FOREIGN KEY (NarudzbaID) REFERENCES Narudzba (NarudzbaID),
11302 DobavljacID INT NOT NULL CONSTRAINT FK_Proizvod_Dobavljac FOREIGN KEY (DobavljacID) REFERENCES Dobavljac (DobavljacID),
11303 ProizvodID INT NOT NULL,
11304 NazivProizvoda NVARCHAR (40) NOT NULL,
11305 Cijena INT NOT NULL,
11306 Kolicina INT NOT NULL,
11307 Popust DECIMAL (3,2) NOT NULL,
11308 Raspolozivost BIT NOT NULL,
11309 CONSTRAINT PK_Proizvod PRIMARY KEY (NarudzbaID, DobavljacID, ProizvodID)
11310)
11311--2 ZADATAK
11312
11313--2a
11314INSERT INTO Narudzba
11315SELECT o.OrderID, o.OrderDate, o.RequiredDate, o.ShippedDate,o.Freight, o.ShipAddress + ' '+ ISNULL(o.ShipPostalCode,'0000')+ ' '+o.ShipCity
11316FROM Northwind.dbo.Orders as o
11317WHERE YEAR(o.OrderDate)>=1997 AND o.ShippedDate IS NOT NULL
11318ORDER BY o.Freight
11319--657
11320
11321--2b
11322INSERT INTO Dobavljac
11323SELECT S.SupplierID, S.CompanyName, S.Address + S.PostalCode + S.City, S.Country
11324FROM Northwind.dbo.Suppliers as S
11325--29
11326
11327--2c
11328INSERT INTO Proizvod
11329SELECT OD.OrderID, P.SupplierID, P.ProductID, P.ProductName, OD.UnitPrice,OD.Quantity,OD.Discount,P.Discontinued
11330FROM Northwind.dbo.Products as P
11331inner join Northwind.dbo.[Order Details] as OD
11332on P.ProductID=OD.ProductID
11333inner join Northwind.dbo.Orders as O
11334on O.OrderID=OD.OrderID
11335WHERE OD.UnitPrice>10 AND OD.Discount>0 AND YEAR(O.OrderDate)>=1997 AND O.ShippedDate IS NOT NULL
11336--512
11337
11338--3 ZADATAK
11339--Iz tabele Proizvod dati pregled ukupnog broja ostvarenih narudzbi po dobavljaèu i proizvodu.
11340
11341SELECT P.DobavljacID,P.ProizvodID,COUNT(P.DobavljacID) AS 'Broj narudzbi'
11342FROM Proizvod AS P
11343GROUP BY P.DobavljacID,P.ProizvodID
11344ORDER BY 1
11345--62
11346
11347--4 ZADATAK
11348--Iz tabele Proizvod dati pregled ukupnog prometa ostvarenog po dobavljaèu i narudžbi uz uslov da se prikažu samo oni zapisi
11349--kod kojih je vrijednost prometa manja od 1000 i odobreni popust veæi od 10%. Ukupni promet izraèunati uz uzimanje u obzir i odobrenog popusta.
11350
11351SELECT P.DobavljacID,P.NarudzbaID,SUM(P.Cijena*P.Kolicina*(1-P.Popust)) AS Promet
11352FROM Proizvod AS P
11353WHERE P.Popust>0.1
11354GROUP BY P.DobavljacID,P.NarudzbaID
11355HAVING SUM(P.Cijena*P.Kolicina*(1-P.Popust))<1000
11356
11357--5 ZADATAK
11358--Iz tabele Narudzba dati pregled svih narudzbi kod kojih je broj dana od datuma narudžbe do datuma isporuke manji od 10.
11359--Pregled æe se sastojati od ID narudžbe, broja dana razlike i kalendarske godine,
11360--pri èemu je razdvojiti pregled po godinama - 1997 i 1998 (prvo sve 1997, zatim sve 1998).
11361--Sortirati po broju dana isporuke u opadajuæem redoslijedu.
11362
11363SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, YEAR (DatumIsporuke) AS Godina
11364FROM Narudzba
11365WHERE DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) < 10
11366ORDER BY 3, 2
11367--495
11368
11369SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike', '1997' AS 'Godina'
11370FROM Narudzba AS N
11371WHERE DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke)<10 AND YEAR(N.DatumIsporuke)=1997
11372UNION
11373SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike', '1998' AS 'Godina'
11374FROM Narudzba AS N
11375WHERE DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke)<10 AND YEAR(N.DatumIsporuke)=1998
11376ORDER BY 2 DESC
11377--495
11378
11379
11380
11381--6 ZADATAK
11382--Iz tabele Narudzba dati pregled svih narudzbi kod kojih je isporuka izvršena u istom mjesecu.
11383--Pregled æe se sastojati od ID narudžbe, broja dana razlike, mjeseca narudžbe, mjeseca isporuke i kalendarske godine,
11384--pri èemu je potrebno razdvojiti pregled po godinama (1997 i 1998 - prvo sve 1997, zatim sve 1998).
11385--Sortirati po broju dana isporuke u opadajuæem redoslijedu.
11386
11387SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike',
11388 MONTH(N.DatumNarudzbe) AS 'Mjesec narudzbe',MONTH(N.DatumIsporuke) AS 'Mjesec isporuke','1997' AS 'Godina'
11389FROM Narudzba AS N
11390WHERE MONTH(N.DatumNarudzbe)=MONTH(N.DatumIsporuke) AND YEAR(N.DatumIsporuke)=1997
11391UNION
11392SELECT N.NarudzbaID, DATEDIFF(DAY,N.DatumNarudzbe,N.DatumIsporuke) AS 'Broj dana razlike',
11393 MONTH(N.DatumNarudzbe) AS 'Mjesec narudzbe',MONTH(N.DatumIsporuke) AS 'Mjesec isporuke','1998' AS 'Godina'
11394FROM Narudzba AS N
11395WHERE MONTH(N.DatumNarudzbe)=MONTH(N.DatumIsporuke) AND YEAR(N.DatumIsporuke)=1998
11396ORDER BY 2 DESC
11397--464
11398
11399SELECT NarudzbaID, DATEDIFF (DAY, DatumNarudzbe, DatumIsporuke) AS BrDanaIsporuke, MONTH (DatumIsporuke) AS MjesecNarudzbe,
11400MONTH (DatumNarudzbe) AS MjesecIsporuke, YEAR (DatumIsporuke) AS Godina
11401FROM Narudzba
11402WHERE MONTH (DatumIsporuke) = MONTH (DatumNarudzbe)
11403ORDER BY 5, 2
11404
11405
11406
11407
11408--7 ZADATAK
11409--Iz tabele Narudzba dati pregled svih narudžbi koje su isporuèene u Graz ili Köln.
11410--Pregled æe se sastojati od ID narudžbe i naziva grada. Sortirati po nazivu grada.
11411
11412SELECT N.PunaAdresa, RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) AS 'Naziv grada'
11413FROM Narudzba AS N
11414WHERE RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) IN('Graz', 'Köln')
11415ORDER BY 2
11416
11417
11418--8 ZADATAK
11419--Iz tabela Narudzba, Dobavljac i Proizvod kreirati pregled koji æe se sastojati od polja NarudzbaID,
11420--GodNarudzbe kao godinu iz polja DatumNarudzbe, NazivProizvoda, NazivDobavljaca, Drzava, TrosakPrevoza,
11421--Ukupno kao ukupna vrijednost narudžbe koja æe se raèunati uz uzimanje u obzir i popusta i postotak koji æe
11422--davati informaciju o vrijednosti postotka troška prevoza u odnosu na ukupnu vrijenost narudžbe. Uslov je da
11423--postotak bude veæi od 30% i da je ukupna vrijednost veæa od troška prevoza. Sortirati po vrijednosti postotka u opadajuæem redoslijedu.
11424
11425SELECT N.NarudzbaID,YEAR(N.DatumNarudzbe) AS 'GodNarudzbe', P.NazivProizvoda,D.NazivDobavljaca,D.Drzava,N.TrosakPrevoza,
11426P.Cijena*P.Kolicina*(1-p.Popust) AS 'Ukupna vrijednost',
11427LEFT (ROUND (N.TrosakPrevoza / (P.Cijena * P.Kolicina * (1 - P.Popust)) * 100, 2),5) AS Postotak
11428FROM Proizvod AS P INNER JOIN
11429 Narudzba AS N
11430 ON P.NarudzbaID=N.NarudzbaID
11431 JOIN Dobavljac AS D
11432 ON D.DobavljacID=P.DobavljacID
11433WHERE N.TrosakPrevoza / (P.Cijena * P.Kolicina * (1 - P.Popust)) * 100>30 AND P.Cijena*P.Kolicina*(1-p.Popust)>N.TrosakPrevoza
11434ORDER BY 8 DESC
11435
11436
11437--9 ZADATAK
11438--Iz tabela Narudzba, Dobavljac i Proizvod kreirati pogled koji æe sadržavati ID narudžbe, dan iz datuma prijema,
11439--raspoloživost, naziv grada iz pune adrese naruèitelja i državu dobavljaèa.
11440--Uslov je da je datum prijema u 2. ili 3. dekadi mjeseca i da grad naruèitelja Bergamo.
11441
11442CREATE VIEW view_9
11443AS
11444SELECT N.NarudzbaID, DAY(N.DatumPrijema) AS 'Dan', P.Raspolozivost,
11445N.PunaAdresa ,RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) AS 'Naziv grada', d.Drzava
11446FROM Proizvod AS P
11447 INNER JOIN Narudzba AS N
11448 ON P.NarudzbaID=N.NarudzbaID
11449 INNER JOIN Dobavljac AS D
11450 ON D.DobavljacID=P.DobavljacID
11451--WHERE DAY(N.DatumPrijema) BETWEEN 11 AND 31 AND RIGHT(N.PunaAdresa, CHARINDEX(' ',REVERSE(N.PunaAdresa))-1) = 'Bergamo'
11452SELECT*
11453FROM view_9
11454--7
11455
11456
11457--10 ZADATAK
11458--Iz tabela Proizvod i Dobavljac kreirati proceduru proc1 koja æe sadržavati ID i naziv dobavljaèa i ukupan broj proizvoda
11459--koji je realizirao dobavljaè. Pokrenuti proceduru za vrijednost ukupno realiziranog broja proizvoda 22 i 14.
11460
11461ALTER PROCEDURE proc1
11462(
11463 @DobavljacID int = NULL,
11464 @NazivDobavljaca nvarchar(40) = NULL,
11465 @UkBroj int = NULL
11466)
11467AS
11468BEGIN
11469SELECT P.DobavljacID, D.NazivDobavljaca, COUNT (P.ProizvodID) AS Broj
11470FROM Proizvod AS P INNER JOIN Dobavljac AS D
11471ON P.DobavljacID = D.DobavljacID
11472--WHERE P.DobavljacID = @DobavljacID OR
11473-- NazivDobavljaca = @NazivDobavljaca OR
11474-- P.ProizvodID >= 0
11475GROUP BY P.DobavljacID, D.NazivDobavljaca
11476HAVING COUNT (P.ProizvodID) = @UkBroj --OR @UkBroj IS NULL
11477END
11478
11479EXEC proc1 @UkBroj=22
11480
11481
11482--1. Kroz SQL kod kreirati bazu podataka sa imenom vašeg broja indeksa.
11483CREATE DATABASE BB210006
11484GO
11485USE BB210006
11486
11487--2. U kreiranoj bazi podataka kreirati tabele sa sljedeæom strukturom:
11488--a) Prodavaci
11489--• ProdavacID, cjelobrojna vrijednost i primarni kljuè
11490--• Ime, 50 UNICODE (obavezan unos)
11491--• Prezime, 50 UNICODE (obavezan unos)
11492--• OpisPosla, 50 UNICODE karaktera (obavezan unos)
11493--• EmailAdresa, 50 UNICODE karaktera
11494
11495CREATE TABLE Prodavaci
11496(
11497ProdavacID INT NOT NULL PRIMARY KEY,
11498Ime NVARCHAR(50) NOT NULL,
11499Prezime NVARCHAR(50) NOT NULL,
11500OpisPosla NVARCHAR(50) NOT NULL,
11501EmailAdresa NVARCHAR(50)
11502)
11503--2.
11504--b) Proizvodi
11505--• ProizvodID, cjelobrojna vrijednost i primarni kljuè
11506--• Naziv, 50 UNICODE karaktera (obavezan unos)
11507--• SifraProizvoda, 25 UNICODE karaktera (obavezan unos)
11508--• Boja, 15 UNICODE karaktera ,
11509--• Cijena, novèani tip podatka (obavezan unos)
11510--• NazivPodkategorije, 50 UNICODE (obavezan unos)
11511
11512CREATE TABLE Proizvodi
11513(
11514ProizvodID INT NOT NULL PRIMARY KEY,
11515Naziv NVARCHAR(50) NOT NULL,
11516SifraProizvoda NVARCHAR(25) NOT NULL,
11517Boja NVARCHAR(15),
11518Cijena MONEY NOT NULL,
11519NazivPodkategorije NVARCHAR(50) NOT NULL
11520)
11521
11522--2.
11523--c) ZaglavljeNarudzbe
11524--• NarudzbaID, cjelobrojna vrijednost i primarni kljuè
11525--• DatumNarudzbe, polje za unos datuma i vremena (obavezan unos)
11526--• DatumIsporuke, polje za unos datuma i vremena
11527--• NazivTeritorije, 50 UNICODE (obavezan unos)
11528--• ProdavacID, cjelobrojna vrijednost, strani kljuè
11529
11530CREATE TABLE ZaglavljeNarudzbe
11531(
11532NarudzbaID INT NOT NULL PRIMARY KEY,
11533DatumNarudzbe DATETIME NOT NULL,
11534DatumIsporuke DATETIME,
11535NazivTeritorije NVARCHAR(50) NOT NULL,
11536ProdavacID INT CONSTRAINT FK_ZaglavljeNarudzbe FOREIGN KEY REFERENCES Prodavaci(ProdavacID)
11537)
11538
11539--2.
11540--d) DetaljiNarudzbe
11541--• NarudzbaID, cjelobrojna vrijednost, obavezan unos i strani kljuè
11542--• ProizvodID, cjelobrojna vrijednost, obavezan unos i strani kljuè
11543--• Cijena, novèani tip (obavezan unos),
11544--• Kolicina, skraæeni cjelobrojni tip (obavezan unos),
11545--• Popust, novèani tip (obavezan unos)
11546--**Jedan proizvod se može više puta naruèiti, dok jedna narudžba može sadržavati više proizvoda. U okviru jedne
11547--narudžbe jedan proizvod se ne može naruèiti više od jedanput.
11548
11549CREATE TABLE DetaljiNarudzbe
11550(
11551NarudzbaID INT NOT NULL CONSTRAINT FK_DetaljiNarudzbe_ZaglavljeNarudzbe FOREIGN KEY REFERENCES ZaglavljeNarudzbe(NarudzbaID),
11552ProizvodID INT NOT NULL CONSTRAINT FK_DetaljiNarudzbe_Proizvodi FOREIGN KEY REFERENCES Proizvodi(ProizvodID),
11553Cijena MONEY NOT NULL,
11554Kolicina SMALLINT NOT NULL,
11555Popust MONEY NOT NULL
11556PRIMARY KEY(NarudzbaID,ProizvodID)
11557)
11558
11559--3. Iz baze podataka AdventureWorks u kreiranu bazu podataka prebaciti sljedeæe podatke:
11560--a) U tabelu Prodavaci dodati sve prodavaèe
11561--• BusinessEntityID (SalesPerson) -> ProdavacID
11562--• FirstName (Person) -> Ime
11563--• LastName (Person) -> Prezime
11564--• JobTitle (Employee) -> OpisPosla
11565--• EmailAddress (EmailAddress) -> EmailAdresa
11566
11567INSERT INTO Prodavaci
11568SELECT SP.BusinessEntityID,PP.FirstName,PP.LastName,E.JobTitle,EA.EmailAddress
11569FROM AdventureWorks2014.Sales.SalesPerson AS SP
11570INNER JOIN AdventureWorks2014.Person.Person AS PP
11571ON SP.BusinessEntityID=PP.BusinessEntityID
11572INNER JOIN AdventureWorks2014.HumanResources.Employee AS E
11573ON E.BusinessEntityID=PP.BusinessEntityID
11574INNER JOIN AdventureWorks2014.Person.EmailAddress AS EA
11575ON EA.BusinessEntityID=PP.BusinessEntityID
11576
11577--3.
11578--b) U tabelu Proizvodi dodati sve proizvode, na mjestima gdje nema pohranjenih podataka o boji zamijeniti
11579--vrijednost sa nije naznaceno
11580--• ProductID (Product)-> ProizvodID
11581--• Name (Product)-> Naziv
11582--• ProductNumber (Product)-> SifraProizvoda
11583--• Color (Product)-> Boja
11584--• ListPrice (Product)-> Cijena
11585--• Name (ProductSubategory) -> NazivPodkategorije
11586
11587INSERT INTO Proizvodi
11588SELECT PP.ProductID,PP.Name,PP.ProductNumber,ISNULL(PP.Color,0),PP.ListPrice,PS.Name
11589FROM AdventureWorks2014.Production.Product AS PP
11590INNER JOIN AdventureWorks2014.Production.ProductSubcategory AS PS
11591ON PP.ProductSubcategoryID=PS.ProductSubcategoryID
11592
11593--3.
11594--c) U tabelu ZaglavljeNarudzbe dodati sve narudžbe
11595--• SalesOrderID (SalesOrderHeader) -> NarudzbaID
11596--• OrderDate (SalesOrderHeader)-> DatumNarudzbe
11597--• ShipDate (SalesOrderHeader)-> DatumIsporuke
11598--• Name (SalesTerritory) -> NazivTeritorije
11599--• SalesPersonID (SalesOrderHeader)-> ProdavacID
11600
11601INSERT INTO ZaglavljeNarudzbe
11602SELECT SOH.SalesOrderID,SOH.OrderDate,SOH.ShipDate,ST.Name,SOH.SalesPersonID
11603FROM AdventureWorks2014.Sales.SalesOrderHeader AS SOH
11604INNER JOIN AdventureWorks2014.Sales.SalesTerritory AS ST
11605ON ST.TerritoryID=SOH.TerritoryID
11606
11607
11608--3.
11609--d) U tabelu DetaljiNarudzbe dodati sve stavke narudžbe
11610--• SalesOrderID (SalesOrderDetail)-> NarudzbaID
11611--• ProductID (SalesOrderDetail)-> ProizvodID
11612--• UnitPrice (SalesOrderDetail)-> Cijena
11613--• OrderQty (SalesOrderDetail)-> Kolicina
11614--• UnitPriceDiscount (SalesOrderDetail)-> Popust
11615
11616INSERT INTO DetaljiNarudzbe
11617SELECT SOD.SalesOrderID ,SOD.ProductID ,SOD.UnitPrice,SOD.OrderQty,SOD.UnitPriceDiscount
11618FROM AdventureWorks2014.Sales.SalesOrderDetail AS SOD
11619
11620
11621--4.
11622--a) (6 bodova) Prikazati sve uposlenike koji rade na 3 ili više teritorija koje pripadaju regiji Eastern. Upitom
11623--je potrebno prikazati spojeno ime i prezime uposlenika, te ukupan broj teritorija na koje su rasporeðeni.
11624--(Northwind)
11625
11626SELECT E.FirstName+ ' '+ E.LastName 'Ime i prezime', count(T.TerritoryID) as Ukupanbrojnarudzbi
11627FROM Northwind.dbo.Employees AS E
11628INNER JOIN Northwind.dbo.EmployeeTerritories AS ET
11629ON E.EmployeeID=ET.EmployeeID
11630INNER JOIN Northwind.dbo.Territories AS T
11631ON ET.TerritoryID=T.TerritoryID
11632INNER JOIN Northwind.dbo.Region AS R
11633ON T.RegionID=R.RegionID
11634WHERE T.TerritoryID>3 AND T.RegionID LIKE 'Eastern'
11635GROUP BY E.FirstName,E.LastName,T.TerritoryID
11636
11637ORDER BY 2 DESC
11638
11639--b) (7 bodova) U kreiranoj bazi kreirati pogled v_proizvodi koji æe prikazivati naziv i šifru proizvoda,
11640--ukupan broj prodanih proizvoda, te ukupnu vrijednost sa popustom. Rezultate sortirati prema ukupnoj
11641--vrijednosti u opadajuæem redoslijedu.
11642USE BB210006
11643GO
11644CREATE VIEW v_proizvodi AS
11645SELECT P.Naziv,P.SifraProizvoda,SUM(DN.Kolicina)'ukupan broj prodanih',SUM(DN.Cijena*DN.Kolicina*(1-DN.Popust))'Ukupna vrijednost sa popustom'
11646FROM Proizvodi as P
11647INNER JOIN DetaljiNarudzbe AS DN
11648ON P.ProizvodID=DN.ProizvodID
11649GROUP BY P.Naziv,P.SifraProizvoda
11650GO
11651SELECT*
11652FROM v_proizvodi
11653ORDER BY 4 DESC
11654
11655--e) (13 bodova) Za svakog uposlenika pojedinaèno prikazati ukupan broj narudžbi koje su obradili. Uslov je
11656--da su narudžbe kreirane u 2011 ili 2012 godini. Takoðer uzeti u obzir samo one narudžbe koje su
11657--isporuèene u Veliku Britaniju, Kanadu ili Francusku. Rezultate sortirati prema broju narudžbi u
11658--opadajuæem redoslijedu. (AdventureWorks2017)
11659USE AdventureWorks2017
11660SELECT E.BusinessEntityID,PP.FirstName+' '+PP.LastName'ime i prezime', COUNT(SOH.SalesOrderID) 'broj narudzbi'
11661FROM HumanResources.Employee AS E
11662INNER JOIN Sales.SalesPerson AS SP
11663ON E.BusinessEntityID=SP.BusinessEntityID
11664INNER JOIN Person.Person AS PP
11665ON PP.BusinessEntityID=E.BusinessEntityID
11666INNER JOIN Sales.SalesOrderHeader AS SOH
11667ON SOH.SalesPersonID=E.BusinessEntityID
11668INNER JOIN Sales.SalesTerritoryHistory AS STH
11669ON STH.TerritoryID=sp.BusinessEntityID
11670inner join Sales.SalesTerritory AS ST
11671ON STH.TerritoryID=ST.TerritoryID
11672group by E.BusinessEntityID
11673order by 3 desc
11674
11675--f) (4 boda) Prikazati naziv dobavljaèa, adresu i državu dobavljaèa i nazive proizvoda koji pripadaju
11676--kategoriji piæa i ima ih na stanju više od 30 komada. Rezultate upita sortirati po državama. (Northwind)
11677
11678use Northwind
11679select
11680from Suppliers as s
11681inner join Products as p
11682on p.SupplierID=s.SupplierID
11683inner join Categories as c
11684on c.CategoryID=p.CategoryID
11685
11686
11687
11688--5.
11689--a) (7 bodova) U kreiranoj bazi kreirati index kojim æe se ubrzati pretraga prema šifri i nazivu proizvoda.
11690--OBAVEZNO index testirati.
11691
11692create index ix_searchproduct
11693on Proizvod(naziv,šifra)
11694
11695
11696SELECT*
11697FROM Proizvodi
11698
11699go
11700--b) (8 bodova) Kreirati proceduru sp_insert kojom æe se vršiti unos detalja narudžbe. OBAVEZNO
11701--proceduru pokrenuti
11702GO
11703CREATE PROCEDURE proc_insert
11704(
11705@NarudzbaID INT,
11706@ProizvodID int,
11707@Cijena MONEY ,
11708@Kolicina SMALLINT ,
11709@Popust MONEY
11710) AS BEGIN
11711
11712INSERT INTO DetaljiNarudzbe VALUES (@NarudzbaID,@ProizvodID,@Cijena,@Kolicina,@Popust)
11713
11714
11715END
11716
11717
11718
11719
11720
11721--1. Kreirati bazu podataka pod nazivom ZadaciZaVjezbu.
11722
11723CREATE DATABASE ZadaciZaVjezbu
11724
11725GO
11726
11727USE ZadaciZaVjezbu
11728
11729
11730
11731--2. U pomenutoj bazi kreirati tabelu Aplikanti koja æe sadržavati sljedeæe kolone: Ime, Prezime i Mjesto_roðenja. Sva navedena polja trebaju da budu tekstualnog tipa, te prilikom kreiranja istih paziti da se ne zauzimaju bespotrebno memorijski resursi.
11732
11733CREATE TABLE Aplikanti
11734
11735(
11736
11737Ime NVARCHAR(10),
11738
11739Prezime NVARCHAR(20),
11740
11741MjestoRodjenja NVARCHAR(50)
11742
11743)
11744
11745--3. U tabelu Aplikanti dodati kolonu AplikantID, te je proglasiti primarnim kljuèem tabele (kolona mora biti autonkrement)
11746
11747ALTER TABLE Aplikanti
11748
11749ADD AplikantID INT NOT NULL IDENTITY(1,1)
11750
11751
11752
11753ALTER TABLE Aplikanti
11754
11755ADD CONSTRAINT PK_Aplikant PRIMARY KEY(AplikantID)
11756
11757--4. U bazi ZadaciZaVjezbu kreirati tabelu Projekti koji æe sadržavati sljedeæe kolone: Naziv projekta, Akronim projekta, Svrha projekta i Cilj projekta. Sva polja u tabeli su tekstualnog tipa, te prilikom kreiranja istih paziti da se ne zauzimaju bespotrebno memorijski resursi. Sva navedena polja osim cilja projekta moraju imati vrijednost.
11758
11759CREATE TABLE Projekti
11760
11761(
11762
11763NazivProjekta NVARCHAR(30) NOT NULL,
11764
11765AkronimProjekta NVARCHAR(30) NOT NULL,
11766
11767SvrhaProjekta NVARCHAR(150) NOT NULL,
11768
11769CiljProjekta NVARCHAR(150)
11770
11771
11772
11773)
11774
11775--5. U tabelu Projekti dodati kolonu Sifra projekta, te je proglasiti primarnim kljuèem tabele.
11776
11777ALTER TABLE Projekti
11778
11779ADD SifraProjekta NVARCHAR(30) PRIMARY KEY
11780
11781--6. U tabelu Aplikanti dodati kolonu projekatID koje æe biti spoljni kljuè na tabelu projekat.
11782
11783ALTER TABLE Aplikanti
11784
11785ADD ProjekatID NVARCHAR(30) NOT NULL CONSTRAINT FK_Aplikant_Projekti FOREIGN KEY REFERENCES Projekti(sifraProjekta)
11786
11787--7. U bazi podataka ZadaciZaVjezbu kreirati tabelu TematskeOblasti koja æe sadržavati sljedeæa polja tematskaOblastID, naziv i opseg. TematskaOblastID predstavlja primarni kljuè tabele, te se automatski uveæava. Sva definisana polja moraju imati vrijednost. Prilikom definisanja dužine polja potrebno je obratiti pažnju da se ne zauzimaju bespotrebno memorijski resursi.
11788
11789CREATE TABLE TematskeOblasti
11790
11791(
11792
11793TematskaOblastID INT CONSTRAINT PK_TematskaOblast PRIMARY KEY,
11794
11795Naziv NVARCHAR(50) NOT NULL,
11796
11797Opseg NVARCHAR(150) NOT NULL
11798
11799)
11800
11801--8. U tabeli Aplikanti dodati polje email koje je tekstualnog tipa i može ostati prazno.
11802
11803ALTER TABLE Aplikanti
11804
11805ADD Email NVARCHAR(50)
11806
11807--9. U tabeli Aplikanti obrisati mjesto roðenja i dodati polja telefon i matièni broj. Oba novokreirana polja su tekstualnog tipa i moraju sadržavati vrijednost.
11808
11809ALTER TABLE Aplikanti
11810
11811DROP COLUMN MjestoRodjenja
11812
11813
11814
11815ALTER TABLE Aplikanti
11816
11817ADD Telefon NVARCHAR(10) NOT NULL,
11818
11819MaticniBroj NVARCHAR(13) NOT NULL --CONSTRAINT UQ_Aplikanti_MaticniBroj UNIQUE
11820
11821--10. Obrisati tabele kreirane u prethodnim zadacima
11822
11823DROP TABLE Aplikanti, TematskeOblasti, Projekti
11824
11825--11. Obrisati kreiranu bazu
11826
11827DROP DATABASE ZadaciZaVjezbu
11828
11829
11830
11831
11832
11833
11834
11835--1. Kreirati bazu Procedure_ i aktivirati je.
11836
11837CREATE DATABASE Procedure_
11838
11839GO
11840
11841USE Procedure_
11842
11843--2. Kreirati tabelu Proizvodi te prilikom kreiranja uraditi insert podataka iz tabele Products baze Northwind.
11844
11845SELECT*
11846
11847INTO Proizvodi
11848
11849FROM Northwind.dbo.Products
11850
11851
11852
11853--3. Kreirati proceduru sp_Insert_Proizvod kojom æe se u tabeli Proizvodi uraditi insert novog zapisa.
11854
11855GO
11856
11857CREATE PROCEDURE sp_Products_Insert
11858
11859(
11860
11861@ProductName NVARCHAR(40),
11862
11863@SupplierID INT=NULL,
11864
11865@CategoryID INT=NULL,
11866
11867@QuantityPerUnit NVARCHAR (20)= NULL,
11868
11869@UnitPrice MONEY= NULL,
11870
11871@UnitsInStock SMALLINT= NULL,
11872
11873@UnitsOnOrder SMALLINT= NULL,
11874
11875@ReorderLevel SMALLINT= NULL,
11876
11877@Discontinued BIT
11878
11879)
11880
11881AS
11882
11883BEGIN
11884
11885INSERT INTO Proizvodi
11886
11887VALUES(@ProductName,@SupplierID,@CategoryID,@QuantityPerUnit,@UnitPrice,@UnitsInStock,@UnitsOnOrder,@ReorderLevel,@Discontinued)
11888
11889END
11890
11891GO
11892
11893--4. Kreirati dva testna sluèaja, u prvom poslati podatke u sva polja, u drugom samo u ona koja su obavezna.
11894
11895EXEC sp_Products_Insert
11896
11897 @ProductName='Mlijeko',
11898
11899 @SupplierID=1,
11900
11901 @CategoryID=1,
11902
11903 @QuantityPerUnit=2,
11904
11905 @UnitPrice=1.4,
11906
11907 @UnitsInStock=30,
11908
11909 @UnitsOnOrder=0,
11910
11911 @ReorderLevel=1,
11912
11913 @Discontinued=1
11914
11915
11916
11917SELECT*
11918
11919FROM Proizvodi
11920
11921ORDER BY 1 DESC
11922
11923
11924
11925EXEC sp_Products_Insert
11926
11927 @ProductName='Brašno',
11928
11929 @Discontinued=1
11930
11931
11932
11933--5. Kreirati proceduru sp_Proizvod_Update kojom æe se u tabeli Proizvodi uraditi update zapisa.
11934
11935GO
11936
11937CREATE OR ALTER PROCEDURE sp_Proizvod_Update
11938
11939(
11940
11941@ProductID INT,
11942
11943@ProductName NVARCHAR(40),
11944
11945@SupplierID INT=NULL,
11946
11947@CategoryID INT=NULL,
11948
11949@QuantityPerUnit NVARCHAR (20)= NULL,
11950
11951@UnitPrice MONEY= NULL,
11952
11953@UnitsInStock SMALLINT= NULL,
11954
11955@UnitsOnOrder SMALLINT= NULL,
11956
11957@ReorderLevel SMALLINT= NULL,
11958
11959@Discontinued BIT
11960
11961)
11962
11963AS
11964
11965BEGIN
11966
11967UPDATE Proizvodi
11968
11969SET
11970
11971 ProductName=ISNULL(@ProductName,ProductName),
11972
11973 SupplierID=ISNULL(@SupplierID,SupplierID),
11974
11975 CategoryID=ISNULL(@CategoryID,CategoryID),
11976
11977 QuantityPerUnit=ISNULL(@QuantityPerUnit,QuantityPerUnit),
11978
11979 UnitPrice=ISNULL(@UnitPrice,UnitPrice),
11980
11981 UnitsInStock=ISNULL(@UnitsInStock,UnitsInStock),
11982
11983 UnitsOnOrder=ISNULL(@UnitsOnOrder,UnitsOnOrder),
11984
11985 ReorderLevel=ISNULL(@ReorderLevel,ReorderLevel),
11986
11987 Discontinued=ISNULL(@Discontinued,Discontinued)
11988
11989 WHERE ProductID=@ProductID
11990
11991END
11992
11993GO
11994
11995
11996
11997EXEC sp_Proizvod_Update
11998
11999 @ProductID=76,
12000
12001 @ProductName='New product',
12002
12003 @SupplierID=2,
12004
12005 @ReorderLevel=1,
12006
12007 @Discontinued=1
12008
12009
12010
12011SELECT *
12012
12013FROM Proizvodi
12014
12015ORDER BY 1 DESC
12016
12017
12018
12019
12020
12021GO
12022
12023CREATE OR ALTER PROCEDURE sp_Proizvod_Update
12024
12025(
12026
12027@ProductId INT,
12028
12029@ProductName NVARCHAR(40)=NULL,
12030
12031@SupplierID INT=NULL,
12032
12033@CategoryID INT=NULL,
12034
12035@QuantityPerUnit NVARCHAR(20)=NULL,
12036
12037@UnitPrice MONEY=NULL,
12038
12039@UnitsInStock SMALLINT=NULL,
12040
12041@UnitsOnOrder SMALLINT=NULL,
12042
12043@ReorderLevel SMALLINT=NULL,
12044
12045@Discontinued BIT
12046
12047)
12048
12049AS
12050
12051BEGIN
12052
12053UPDATE Proizvodi
12054
12055SET
12056
12057ProductName=ISNULL(@ProductName,ProductName),
12058
12059SupplierID=ISNULL(@SupplierID,SupplierID),
12060
12061CategoryID= ISNULL(@CategoryID,CategoryID),
12062
12063QuantityPerUnit=ISNULL(@QuantityPerUnit,QuantityPerUnit),
12064
12065UnitPrice=ISNULL(@UnitPrice,UnitPrice),
12066
12067UnitsInStock=ISNULL(@UnitsInStock,UnitsInStock),
12068
12069UnitsOnOrder=ISNULL(@UnitsOnOrder,UnitsOnOrder),
12070
12071ReorderLevel=ISNULL(@ReorderLevel,ReorderLevel),
12072
12073Discontinued=ISNULL(@Discontinued,Discontinued)
12074
12075WHERE ProductID=@ProductId
12076
12077END
12078
12079--6. Kreirati testni sluèaj za update zapisa kroz proceduru.
12080
12081EXEC sp_Proizvod_Update
12082
12083 @ProductName='Mlijeko',
12084
12085 @SupplierID=1,
12086
12087 @CategoryID=1,
12088
12089 @UnitPrice=1.6,
12090
12091 @UnitsInStock=30,
12092
12093 @UnitsOnOrder=0,
12094
12095 @Discontinued=1,
12096
12097 @ProductID=78
12098
12099
12100
12101--7 Kreirati proceduru sp_Proizvod_Delete kojom æe se u tabeli Proizvodi uraditi delete odreðenog zapisa.
12102
12103
12104
12105GO
12106
12107CREATE PROCEDURE sp_Proizvod_Delete
12108
12109(
12110
12111 @ProductID INT
12112
12113)
12114
12115AS
12116
12117BEGIN
12118
12119DELETE FROM Proizvodi
12120
12121WHERE ProductID=@ProductID
12122
12123END
12124
12125GO
12126
12127
12128
12129
12130
12131GO
12132
12133CREATE PROCEDURE sp_Proizvod_Delete
12134
12135(
12136
12137@ProductID int
12138
12139)
12140
12141AS
12142
12143BEGIN
12144
12145DELETE FROM Proizvodi
12146
12147WHERE ProductID=@ProductID
12148
12149END
12150
12151
12152
12153--8. Kreirati testni sluèaj za brisanje proizvoda sa id-om 78.
12154
12155EXEC sp_Proizvod_Delete @ProductId=78
12156
12157
12158
12159--9. Kreirati tabelu StavkeNarudzbe te prilikom kreiranja uraditi insert podataka iz tabele Order Details baze Northwind.
12160
12161SELECT*
12162
12163INTO StavkeNarudzbe
12164
12165FROM Northwind.dbo.[Order Details]
12166
12167--10. Kreirati proceduru sp_StavkeNarudzbe_Proizvodi_InsertUpdate kojom æe se u tabeli StavkeNarudzbe dodati nova stavka narudžbe a u tabeli Proizvodi umanjiti stanje za zalihama.
12168
12169GO
12170
12171CREATE PROCEDURE sp_StavkeNarudzbe_Proizvodi_InsertUpdate
12172
12173(
12174
12175@OrderID int,
12176
12177@ProductID int,
12178
12179@UnitPrice money,
12180
12181@Quantity smallint,
12182
12183@Discount real
12184
12185)
12186
12187AS
12188
12189BEGIN
12190
12191INSERT INTO StavkeNarudzbe
12192
12193VALUES(@OrderID,@ProductID,@UnitPrice,@Quantity,@Discount)
12194
12195
12196
12197UPDATE Proizvodi
12198
12199SET UnitsInStock=UnitsInStock-@Quantity
12200
12201WHERE ProductID=@ProductID
12202
12203END
12204
12205--11. Kreirati testni sluèaj za prethodno kreiranu proceduru.
12206
12207EXEC sp_StavkeNarudzbe_Proizvodi_InsertUpdate 10248,1,5,4,0.1
12208
12209
12210
12211SELECT*
12212
12213FROM StavkeNarudzbe
12214
12215WHERE OrderID=10248
12216
12217
12218
12219SELECT*
12220
12221FROM Proizvodi
12222
12223--12. Kreirati proceduru kojom æe se u tabeli Proizvodi uraditi select proizvoda prema nazivu proizvoda i ID kategorije. Ukoliko korisnik ne unese ništa od navedenog prikazati sve proizvode.
12224
12225GO
12226
12227CREATE PROCEDURE sp_Proizvodi_SelectByProductNameOrCategoryID
12228
12229(
12230
12231@ProductName NVARCHAR(40)=NULL,
12232
12233@CategoryID INT=NULL
12234
12235)
12236
12237AS
12238
12239BEGIN
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252