--Ponavljanje za ispit
USE AdventureWorksOBP

SELECT * FROM Stavka

-- Moramo znati CAST i CONVERT funkcije
SELECT BrojRacuna, CAST(DatumIzdavanja as CHAR(11)) as DatumIzdavanja
FROM Racun WHERE KupacID = 287

SELECT BrojRacuna, CONVERT() as DatumIzdavanja
FROM Racun WHERE KupacID = 287

--Na testu će rijetko biti CASE i WHILE

--TRY i CATCH --> ERROR_MEESSAGE(), ERROR_NUMBER()
--Općenito unutar procedura se piše TRY/CATCH

/*
ZADATAK 1 [POGLEDI]:
Napravite pogled koji prikazuje države i broj kupaca iz svake države. Pogled treba vratiti stupce: NazivDrzave i BrojKupaca. 
Iskoristite pogled za dohvaćanje države s najviše kupaca. Napišite naredbu za uklanjanje pogleda.
*/

	CREATE OR ALTER VIEW vDrzaveKupci AS
	SELECT d.Naziv as NazivDrzave, COUNT(k.IDKupac) as BrojKupaca FROM Drzava as d
	LEFT JOIN Grad as g ON g.DrzavaID = d.IDDrzava
	FULL OUTER JOIN Kupac as k ON k.GradID = g.IDGrad
	GROUP BY d.Naziv

	SELECT TOP 1 * FROM vDrzaveKupci ORDER BY vDrzaveKupci.BrojKupaca DESC


	DROP VIEW vDrzaveKupci

/* 
ZADATAK 2 [POGLEDI]:
Napravite pogled koji vraća formatiran datum na hrvatski način te broj proizvoda koji su prodani u tom razdoblju. 
Iskoristite pogled za dohvaćanje 3 mjeseca s najvećom prodajom proizvoda. Osmislite dodatne mjere kako biste zaštitili
definiciju od neovlaštenog pregleda sadržaja pogleda. Napišite naredbu za uklanjanje pogleda.
*/

		CREATE OR ALTER VIEW vDatumProdano WITH ENCRYPTION AS
		SELECT CONVERT(CHAR(10), r.DatumIzdavanja, 104) as DatumIzdavanja, SUM(s.Kolicina) as BrojProizvoda FROM Stavka as s
		INNER JOIN Racun as r on r.IDRacun = s.IDStavka
		GROUP BY CONVERT(CHAR(10), r.DatumIzdavanja, 104)

		SELECT TOP 3 * FROM vDatumProdano ORDER BY BrojProizvoda DESC
		
		DROP VIEW vDatumProdano

/*
ZADATAK 3 [OKIDAČI]:
Napravite novu tablicu Zapisnik sa stupcima IDZapisnik, Poruka i Vrijeme. Napravite okidač na tablici Grad koji će pri
svakom događaju INSERT, UPDATE ili DELETE upisati novi zapis s odgovoarajućom porukom i vremenom u tablicu Zapisnik.
Napišite naredbu za uklanjanje okidača.
Primjer poruka:
- INSERT: Grad je dodan u tablicu.
- UPDATE: Grad je ažuriran u tablici.
- DELETE: Grad je obrisan iz tablice.
*/

-- ovaj zadatak ima 100% jedna i druga grupa

	CREATE TABLE Zapisnik(
		IDZapisnik int IDENTITY PRIMARY KEY,
		Poruka nvarchar(255),
		Vrijeme datetime DEFAULT GETDATE()

	)
	GO
	CREATE OR ALTER TRIGGER trZapisnikGrad
	ON Grad
	AFTER INSERT,UPDATE,DELETE
	AS
		BEGIN
			DECLARE @Poruka nvarchar(255)
			IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
				BEGIN
					SET @Poruka = 'Grad je ažuriran u tablici'
				END
			ELSE IF EXISTS(SELECT 1 FROM inserted)
				BEGIN
					SET @Poruka = 'Grad je dodan u tablicu'
				END
			ELSE IF EXISTS(SELECT 1 FROM deleted)
				BEGIN
					SET @Poruka = 'Grad je obrisan iz tablice'
				END

		INSERT INTO Zapisnik (Poruka) VALUES (@Poruka)
	END
GO
INSERT INTO Grad (Naziv, DrzavaID) VALUES('Karlovac', 1)
/*
ZADATAK 4 [ANALIZA PODATAKA NA DISKU]:
Analizirajte tablicu Kupac i odgovorite na sljedeća pitanja:
1. Na koliko stranica su smješteni podaci iz tablice Kupac?
2. Napišite redne brojeve prvih 5 stranica (PagePID) i redne brojeve datoteke u kojoj su smještene stranice (PageFID).
3. Na kojoj stranici se nalazi kupac s IDKupac = 35?
4. Kolika je duljina IDKupac = 10 u bajtovima?
*/
	DBCC TRACEON(3604)
	DBCC IND('AdventureWorksOBP', 'Kupac', 1)
/*
ZADATAK 5 [INDEKSI]:
Optimizirajte upit što je bolje moguće:
"""
SELECT S.IDStavka, S.RacunID, S.Kolicina
FROM Stavka AS S
WHERE S.Kolicina<20 AND S.PopustUPostocima>0.2
"""
Napišite naredbu za uklanjanje indeksa.
*/
SET STATISTICS IO ON

SELECT s.IDStavka, s.RacunID, s.Kolicina FROM Stavka as s
WHERE s.Kolicina<20 and s.PopustUPostocima>0.2

CREATE NONCLUSTERED INDEX iStavkaKolicinaPopust
ON Stavka (PopustUPostocima) INCLUDE (RacunID)

DROP INDEX iStavkaKolicinaPopust ON Stavka

SET STATISTICS IO OFF
/*
ZADATAK 6 [FUNKCIJE]:
Napišite složenu tabličnu funkciju koja prima cijenu. Ako je cijena NULL, vratite nazive i cijene svih proizvoda iz tablice Proizvod. ​
Ako nije, vratite nazive i cijene samo onih proizvoda čija cijena je veća od zadane cijene. Iskoristite funkciju s NULL i s cijenom od 3000.
Uklonite funkciju.
*/

CREATE OR ALTER FUNCTION fnProizvodCijena(@cijena money)
RETURNS @res TABLE (
	Naziv nvarchar(50),
	Cijena money
)
AS
	BEGIN
		IF @cijena IS NULL
			BEGIN 
				INSERT INTO @res (Naziv, Cijena)
				SELECT Naziv, CijenaBezPDV from Proizvod
			END
		ELSE
			BEGIN
				INSERT INTO @res (Naziv, Cijena)
				SELECT Naziv, CijenaBezPDV from Proizvod
				WHERE CijenaBezPDV > @cijena
			END
		RETURN
	END

	SELECT * FROM fnProizvodCijena(NULL)
	SELECT * FROM fnProizvodCijena(3000.00)

/*
ZADATAK 7 [PROCEDURE]:
Napravite procedure koje rade CRUD operacije na tablici Grad tako da operacije umetanja i izmjene obavite u jednoj proceduri, 
a druge dvije operacije obavite u posebnim procedurama. Iskoristite procedure za umetanje, izmjenu, dohvaćanje i brisanje zapisa.
Uklonite procedure.
*/
CREATE OR ALTER PROC spGradIU
	@Operacija CHAR(1),
	@IDGrad int = NULL,
	@Naziv nvarchar(50) = NULL,
	@DrzavaID INT = NULL
AS
	BEGIN
		IF @Operacija = 'I'
			BEGIN
				INSERT INTO Grad(Naziv, DrzavaID) VALUES (@Naziv, @DrzavaID)
			END
		ELSE IF @Operacija = 'U'
			BEGIN
				UPDATE Grad SET Naziv=@Naziv, DrzavaID=@DrzavaID WHERE IDGrad=@IDGrad

			END
		ELSE
			BEGIN
				SELECT 'Neispravna operacija'
			END
	END

CREATE OR ALTER PROC spGradSelect @IDGrad INT = NULL
AS
	BEGIN
		IF @IDGrad IS NULL
			BEGIN
				SELECT * FROM Grad as g
				LEFT JOIN Drzava as d
				ON g.DrzavaID = d.IDDrzava
			END
		ELSE
			BEGIN
				SELECT g.IDGrad, g.Naziv, d.Naziv as Drzava FROM Grad as g
				LEFT JOIN Drzava as d
				ON g.DrzavaID = d.IDDrzava
				WHERE g.IDGrad=@IDGrad
			END
	END

CREATE OR ALTER PROC spGradDelete @IDGrad INT
AS
	BEGIN
		DELETE FROM Grad WHERE IDGrad=@IDGrad
	END

EXEC spGradIU
	@Operacija = 'I',
	@Naziv = 'Split',
	@DrzavaID = 1

EXEC spGradIU
	@Operacija = 'U',
	@IDGrad = 7,
	@Naziv = 'Dubrovnik',
	@DrzavaID = 1

EXEC spGradSelect
EXEC spGradSelect 1
EXEC spGradDelete 1
GO

DROP spGradIU
DROP spGradSelect
DROP spGradDelete
/* --------------------------------------------------------------------- */


