29-JUN

 avatar
firex
sql
a year ago
14 kB
10
Indexable
Never
--1. Kroz SQL kod kreirati bazu podataka sa imenom vašeg broja indeksa.
 
CREATE DATABASE IB200013
GO
USE IB200013
 
--2. U kreiranoj bazi podataka kreirati tabele sa sljedećom strukturom:
--a) Proizvodi
 
CREATE TABLE Proizvodi
(
--• ProizvodID, cjelobrojna vrijednost i primarni ključ, autoinkrement
--• Naziv, 50 UNICODE karaktera (obavezan unos)
--• SifraProizvoda, 25 UNICODE karaktera (obavezan unos)
--• Boja, 15 UNICODE karaktera
--• NazivKategorije, 50 UNICODE (obavezan unos)
--• Tezina, decimalna vrijednost sa 2 znaka iza zareza
​ProizvodID INT CONSTRAINT PK_Proizvodi PRIMARY KEY IDENTITY(1,1),
​Naziv NVARCHAR(50) NOT NULL,
​SifraProizvoda NVARCHAR(25) NOT NULL,
​Boja NVARCHAR(15),
​NazivKategorije NVARCHAR(50) NOT NULL,
​Tezina DECIMAL(18,2)
)
--b) ZaglavljeNarudzbe
CREATE TABLE ZaglavljeNarudzbe
(
--• NarudzbaID, cjelobrojna vrijednost i primarni ključ, autoinkrement
--• DatumNarudzbe, polje za unos datuma i vremena (obavezan unos)
--• DatumIsporuke, polje za unos datuma i vremena
--• ImeKupca, 50 UNICODE (obavezan unos)
--• PrezimeKupca, 50 UNICODE (obavezan unos)
--• NazivTeritorije, 50 UNICODE (obavezan unos)
--• NazivRegije, 50 UNICODE (obavezan unos)
--• NacinIsporuke, 50 UNICODE (obavezan unos)
​NarudzbaID INT CONSTRAINT PK_ZaglavljeNarudzbe PRIMARY KEY IDENTITY(1,1),
​DatumNarudzbe DATETIME NOT NULL,
​DatumIsporuke DATETIME,
​ImeKupca NVARCHAR(50) NOT NULL,
​PrezimeKupca NVARCHAR(50) NOT NULL,
​NazivTeritorije NVARCHAR(50) NOT NULL,
​NazivRegije NVARCHAR(50) NOT NULL,
​NacinIsporuke NVARCHAR(50) NOT NULL
)
--c) DetaljiNarudzbe
CREATE TABLE DetaljiNarudzbe
(
--• NarudzbaID, cjelobrojna vrijednost, obavezan unos i strani ključ
--• ProizvodID, cjelobrojna vrijednost, obavezan unos i strani ključ
--• Cijena, novčani tip (obavezan unos),
--• Kolicina, skraćeni cjelobrojni tip (obavezan unos),
--• Popust, novčani tip (obavezan unos)
--**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.
​DetaljiNarudzbe INT CONSTRAINT PK_DetaljiNarudzbe PRIMARY KEY IDENTITY(1,1),
​NarudzbaID INT NOT NULL CONSTRAINT FK_DetaljiNarudzbe_ZaglavljeNarudzbe FOREIGN KEY REFERENCES ZaglavljeNarudzbe(NarudzbaID),
​ProizvodID INT NOT NULL CONSTRAINT FK_DetaljiNarudzbe_Proizvodi FOREIGN KEY REFERENCES Proizvodi(ProizvodID),
​Cijena MONEY NOT NULL,
​Kolicina SMALLINT NOT NULL,
​Popust MONEY NOT NULL
)
 
--3. Iz baze podataka AdventureWorks u svoju bazu podataka prebaciti sljedeće podatke:
--a) U tabelu Proizvodi dodati sve proizvode, na mjestima gdje nema pohranjenih podataka o težini
--zamijeniti vrijednost sa 0
--• ProductID -> ProizvodID
--• Name -> Naziv
--• ProductNumber -> SifraProizvoda
--• Color -> Boja
--• Name (ProductCategory) -> NazivKategorije
--• Weight -> Tezina
SET IDENTITY_INSERT Proizvodi ON
INSERT INTO Proizvodi (ProizvodID, Naziv, SifraProizvoda, Boja, NazivKategorije, Tezina)
SELECT P.ProductID, P.Name, P.ProductNumber, P.Color, PC.Name, ISNULL(P.Weight,0)
FROM AdventureWorks2017.Production.Product AS P
INNER JOIN AdventureWorks2017.Production.ProductSubcategory AS PS
ON P.ProductSubcategoryID=PS.ProductSubcategoryID
INNER JOIN AdventureWorks2017.Production.ProductCategory AS PC
ON PS.ProductCategoryID=PC.ProductCategoryID
SET IDENTITY_INSERT Proizvodi OFF
 
--b) U tabelu ZaglavljeNarudzbe dodati sve narudžbe
--• SalesOrderID -> NarudzbaID
--• OrderDate -> DatumNarudzbe
--• ShipDate -> DatumIsporuke
--• FirstName (Person) -> ImeKupca
--• LastName (Person) -> PrezimeKupca
--• Name (SalesTerritory) -> NazivTeritorije
--• Group (SalesTerritory) -> NazivRegije
--• Name (ShipMethod) -> NacinIsporuke
 
SET IDENTITY_INSERT ZaglavljeNarudzbe ON
INSERT INTO ZaglavljeNarudzbe(NarudzbaID,DatumNarudzbe,DatumIsporuke,ImeKupca,PrezimeKupca,NazivTeritorije,NazivRegije,NacinIsporuke)
SELECT SOH.SalesOrderID, SOH.OrderDate, SOH.ShipDate, P.FirstName, P.LastName, ST.Name, ST.[Group], SM.Name
FROM AdventureWorks2017.Sales.SalesOrderHeader AS SOH
INNER JOIN AdventureWorks2017.Sales.Customer AS C
ON SOH.CustomerID=C.CustomerID
INNER JOIN AdventureWorks2017.Person.Person AS P
ON C.PersonID=P.BusinessEntityID
INNER JOIN AdventureWorks2017.Sales.SalesTerritory AS ST
ON SOH.TerritoryID=ST.TerritoryID
INNER JOIN AdventureWorks2017.Purchasing.ShipMethod AS SM
ON SOH.ShipMethodID=SM.ShipMethodID
SET IDENTITY_INSERT ZaglavljeNarudzbe OFF
 
--c) U tabelu DetaljiNarudzbe dodati sve stavke narudžbe
--• SalesOrderID -> NarudzbaID
--• ProductID -> ProizvodID
--• UnitPrice -> Cijena
--• OrderQty -> Kolicina
--• UnitPriceDiscount -> Popust
 
INSERT INTO DetaljiNarudzbe
SELECT SOD.SalesOrderID, SOD.ProductID, SOD.UnitPrice, SOD.OrderQty, SOD.UnitPriceDiscount
FROM AdventureWorks2017.Sales.SalesOrderDetail AS SOD
 
--4.
--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 prema broju uposlenika u opadajućem redoslijedu. (AdventureWorks2017)
 
USE AdventureWorks2017
SELECT D.Name, COUNT(*) 'Ukupan broj uposlenika'
FROM HumanResources.Employee AS E
INNER JOIN HumanResources.EmployeeDepartmentHistory AS EDH
ON E.BusinessEntityID=EDH.BusinessEntityID
INNER JOIN HumanResources.Department AS D
ON EDH.DepartmentID=D.DepartmentID
WHERE EDH.EndDate IS NULL AND DATEDIFF(YEAR,E.HireDate,GETDATE())>10
GROUP BY D.Name
ORDER BY 2 DESC
 
--b) (10 bodova) 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)
 
SELECT MONTH(POH.OrderDate) 'Mjesec', SUM(POD.LineTotal) 'Ukupna vrijednost', SUM(POD.ReceivedQty) 'Ukupna količina primljene robe', SUM(IIF(POD.RejectedQty>100, 1, 0)) 'Ukupno stavki rejectedQty veće od 100'
FROM Purchasing.PurchaseOrderDetail AS POD
INNER JOIN Purchasing.PurchaseOrderHeader AS POH
ON POD.PurchaseOrderID=POH.PurchaseOrderID
INNER JOIN Purchasing.ShipMethod AS SM
ON POH.ShipMethodID=SM.ShipMethodID
WHERE YEAR(POH.OrderDate)=2012 AND POH.Freight BETWEEN 500 AND 2500 AND SM.Name LIKE '%CARGO%'
GROUP BY MONTH(POH.OrderDate)
 
 
 
--c) (10 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)
 
SELECT P.FirstName, P.LastName, COUNT(*) 'Ukupan broj narudžbi'
FROM Person.Person AS P
INNER JOIN HumanResources.Employee AS E
ON P.BusinessEntityID=E.BusinessEntityID
INNER JOIN Sales.SalesPerson AS SP
ON E.BusinessEntityID=SP.BusinessEntityID
INNER JOIN Sales.SalesOrderHeader AS SOH
ON SP.BusinessEntityID=SOH.SalesPersonID
INNER JOIN Sales.SalesTerritory AS ST
ON SOH.TerritoryID=ST.TerritoryID
WHERE YEAR(SOH.OrderDate) IN (2011, 2012) AND ST.Name IN ('France', 'Canada', 'United Kingdom') AND
(
​SELECT COUNT(*)
​FROM Sales.SalesOrderDetail AS SOD
​WHERE SOD.UnitPriceDiscount>0 AND SOD.SalesOrderID=SOH.SalesOrderID
)>=2
GROUP BY P.FirstName, P.LastName
 
SELECT *
FROM Sales.SalesTerritory AS ST
 
--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)
--1) Prva dva slova naziva proizvoda
--2) Karakter /
--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
--4) ID proizvoda, po pravilu ukoliko se radi o jednocifrenom broju na njega dodati slovo 'a', u
--suprotnom uzeti obrnutu vrijednost broja
--Npr. Za proizvod sa nazivom Chai i sa dobavljačem naziva Exotic Liquids, šifra će btiti Ch/Li1a.
USE Northwind
SELECT P.ProductName, S.CompanyName, P.UnitsInStock,
LEFT(P.ProductName,2) + '/' + SUBSTRING(S.CompanyName,CHARINDEX(' ', S.CompanyName)+1,2) +
IIF(LEN(P.ProductID)=1, CAST(P.ProductID AS NVARCHAR)+'a', CAST(REVERSE(P.ProductID) AS NVARCHAR))
FROM Products AS P
INNER JOIN Suppliers AS S
ON P.SupplierID=S.SupplierID
WHERE LEN(S.CompanyName) - LEN(REPLACE(S.CompanyName, ' ','')) IN(1,2)
 
 
--37 bodova
--5.
--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.
USE IB200013
CREATE INDEX IX_Proizvodi_Sifra_NazivP
ON Proizvodi(SifraProizvoda, Naziv)
 
SELECT P.SifraProizvoda,P.Naziv
FROM Proizvodi AS P
WHERE P.SifraProizvoda LIKE 'M%' OR Naziv LIKE 'S%'
 
--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.
GO
CREATE PROCEDURE sp_search_products
(
​@Kategorija NVARCHAR(50)=NULL,
​@Tezina DECIMAL(18,2)=NULL
)
AS
BEGIN
​SELECT *
​FROM Proizvodi AS P
​WHERE P.NazivKategorije LIKE @Kategorija + '%' OR P.Tezina>@Tezina
END
GO
 
EXEC sp_search_products @Kategorija='B'
 
--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:
--• za žene u prvom mjesecu drugog kvartala je stoni mikser, dok je za muškarce usisivač
--• za žene u drugom mjesecu drugog kvartala je pegla, dok je za muškarc multicooker
--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)
--28 bodova
 
USE AdventureWorks2017
SELECT PODQ.FirstName, PODQ.LastName, PODQ.Mjesec, PODQ.[Ukupno bez popusta], PODQ.Nagrada
FROM(SELECT MONTH(SOH.OrderDate) 'Mjesec', P.FirstName, P.LastName, SUM(SOD.OrderQty*SOD.UnitPrice) 'Ukupno bez popusta',
​ROW_NUMBER() OVER(ORDER BY SUM(SOD.OrderQty*SOD.UnitPrice) DESC) 'RedniBroj', 'Stoni mikser' Nagrada
​FROM Person.Person AS P
​INNER JOIN Sales.Customer AS C
​ON P.BusinessEntityID=C.PersonID
​INNER JOIN Sales.SalesOrderHeader AS SOH
​ON C.CustomerID=SOH.CustomerID
​INNER JOIN Sales.SalesOrderDetail AS SOD
​ON SOH.SalesOrderID=SOD.SalesOrderID
​WHERE MONTH(SOH.OrderDate)=4 AND YEAR(SOH.OrderDate)=2013 AND RIGHT(P.FirstName,1) LIKE 'a'
​GROUP BY MONTH(SOH.OrderDate), P.FirstName, P.LastName) AS PODQ
WHERE PODQ.RedniBroj=3
UNION
SELECT PODQ.FirstName, PODQ.LastName, PODQ.Mjesec, PODQ.[Ukupno bez popusta], PODQ.Nagrada
FROM(SELECT MONTH(SOH.OrderDate) 'Mjesec', P.FirstName, P.LastName, SUM(SOD.OrderQty*SOD.UnitPrice) 'Ukupno bez popusta',
​ROW_NUMBER() OVER(ORDER BY SUM(SOD.OrderQty*SOD.UnitPrice) DESC) 'RedniBroj', 'Pegla' Nagrada
​FROM Person.Person AS P
​INNER JOIN Sales.Customer AS C
​ON P.BusinessEntityID=C.PersonID
​INNER JOIN Sales.SalesOrderHeader AS SOH
​ON C.CustomerID=SOH.CustomerID
​INNER JOIN Sales.SalesOrderDetail AS SOD
​ON SOH.SalesOrderID=SOD.SalesOrderID
​WHERE MONTH(SOH.OrderDate)=5 AND YEAR(SOH.OrderDate)=2013 AND RIGHT(P.FirstName,1) LIKE 'a'
​GROUP BY MONTH(SOH.OrderDate), P.FirstName, P.LastName) AS PODQ
WHERE PODQ.RedniBroj=3
UNION
SELECT PODQ.FirstName, PODQ.LastName, PODQ.Mjesec, PODQ.[Ukupno bez popusta], PODQ.Nagrada
FROM(SELECT MONTH(SOH.OrderDate) 'Mjesec', P.FirstName, P.LastName, SUM(SOD.OrderQty*SOD.UnitPrice) 'Ukupno bez popusta',
​ROW_NUMBER() OVER(ORDER BY SUM(SOD.OrderQty*SOD.UnitPrice) DESC) 'RedniBroj', 'Usisivac' Nagrada
​FROM Person.Person AS P
​INNER JOIN Sales.Customer AS C
​ON P.BusinessEntityID=C.PersonID
​INNER JOIN Sales.SalesOrderHeader AS SOH
​ON C.CustomerID=SOH.CustomerID
​INNER JOIN Sales.SalesOrderDetail AS SOD
​ON SOH.SalesOrderID=SOD.SalesOrderID
​WHERE MONTH(SOH.OrderDate)=4 AND YEAR(SOH.OrderDate)=2013 AND RIGHT(P.FirstName,1) NOT LIKE 'a'
​GROUP BY MONTH(SOH.OrderDate), P.FirstName, P.LastName) AS PODQ
WHERE PODQ.RedniBroj=3
UNION
SELECT PODQ.FirstName, PODQ.LastName, PODQ.Mjesec, PODQ.[Ukupno bez popusta], PODQ.Nagrada
FROM(SELECT MONTH(SOH.OrderDate) 'Mjesec', P.FirstName, P.LastName, SUM(SOD.OrderQty*SOD.UnitPrice) 'Ukupno bez popusta',
​ROW_NUMBER() OVER(ORDER BY SUM(SOD.OrderQty*SOD.UnitPrice) DESC) 'RedniBroj', 'Multicooker' Nagrada
​FROM Person.Person AS P
​INNER JOIN Sales.Customer AS C
​ON P.BusinessEntityID=C.PersonID
​INNER JOIN Sales.SalesOrderHeader AS SOH
​ON C.CustomerID=SOH.CustomerID
​INNER JOIN Sales.SalesOrderDetail AS SOD
​ON SOH.SalesOrderID=SOD.SalesOrderID
​WHERE MONTH(SOH.OrderDate)=5 AND YEAR(SOH.OrderDate)=2013 AND RIGHT(P.FirstName,1) NOT LIKE 'a'
​GROUP BY MONTH(SOH.OrderDate), P.FirstName, P.LastName) AS PODQ
WHERE PODQ.RedniBroj=3
ORDER BY 4 DESC