--1. izdvojiti indek, ime, prezime kao i status
-- status: -brucos ako nije polagao ni jedan ispit
-- 		 - nijedan polozen ako nije polozio ni jedan ispit(a nije bruzos)
--        - student
SELECT d.indeks, d.ime, d.prezime, CASE
									 WHEN NOT EXISTS(SELECT * FROM ispit i
									 				 WHERE i.indeks = d.indeks)
						 				 THEN 'brucos'
					 				 WHEN NOT EXISTS(SELECT * FROM ispit i
									 				 WHERE i.indeks = d.indeks
									 				 	AND i.ocena > 5 AND i.status = 'o')
					 				 	 THEN 'nijedan polozen'
				 				 	 ELSE 'student'
			 				 	    END
FROM dosije d;

-- 2. Koliko ima studenata koji su polozili vise od 10 espb

SELECT COUNT(*) br_studenata
FROM (SELECT i.indeks, sum(p.espb) br_bodova
	 FROM ispit i JOIN predmet p ON i.idpredmeta = p.id
	 WHERE i.ocena > 5 AND i.status = 'o'
	 GROUP BY i.indeks)
WHERE br_bodova > 10;

WITH statistike AS (
	SELECT i.indeks, sum(p.espb) br_bodova
 	FROM ispit i JOIN predmet p ON i.idpredmeta = p.id
 	WHERE i.ocena > 5 AND i.status = 'o'
 	GROUP BY i.indeks
)
SELECT COUNT(*)
FROM statistike
WHERE br_bodova > 10;

-- 3. laki < 6 espb, srednje teski izmedju 6 i 8 inace teski
--    nadjemo koliko ima kojih predmeta?
WITH tezina_predmeta AS (
	SELECT p.id, CASE
					WHEN p.espb < 6 THEN 'laki'
					WHEN p.espb BETWEEN 6 AND 8 THEN 'srednje teski'
					ELSE 'teski'
				END tezina
	FROM predmet p
)
SELECT tezina, COUNT(*) br_predmeta
FROM tezina_predmeta
GROUP BY tezina;

-- 4. za svaki predmet izdvojiti njegov id, br razlicitih studena koji su ga polagali
-- uz idenifikatore predmeta koje niko nije polaga izdvojiti 0

-- iz tabele ispit za predmete koji su nekad polagani izvucemo br studenata
-- za one koji nisu nikada polagani stavimo 0

SELECT i.idpredmeta, COUNT(DISTINCT i.indeks) br_studenata
FROM ispit i
GROUP BY i.idpredmeta
UNION
SELECT p.id, 0
FROM predmet p
WHERE p.id NOT IN (SELECT DISTINCT idpredmeta FROM ispit)
ORDER BY br_studenata;

-- BEZ UNIJE!
-- za svaki ispit broj studentaat koji ga je polozio <-
SELECT p.id, SUM(CASE 
					WHEN i.idpredmeta IS NOT NULL THEN 1
					ELSE 0
				 END)
FROM predmet p LEFT JOIN ispit i 
		ON p.id = i.idpredmeta
		AND i.ocena > 5 AND i.status > 'o'
GROUP BY p.id
ORDER BY 2;

--
WITH br_polaganja AS(
	SELECT i.idpredmeta, COUNT(DISTINCT i.indeks) br_studenata
	FROM ispit i
	GROUP BY i.idpredmeta
)
SELECT p.id, COALESCE(br_studenata, 0)
FROM predmet p LEFT JOIN br_polaganja bp
	ON p.id = bp.idpredmeta;

-- 5. za svakog studenta izdvojiti ime, prezime i br ispita koje je pao

SELECT d.ime, d.prezime, COUNT(*) as br_padova
FROM ispit i JOIN dosije d
	ON i.indeks = d.indeks
WHERE i.ocena = 5 AND i.status = 'o'
GROUP BY d.indeks, d.ime, d.prezime
UNION
SELECT d.ime, d.prezime, 0
FROM dosije d
WHERE d.indeks NOT IN (SELECT indeks FROM ispit
						WHERE ocena= 5 AND status = 'o');


WITH padovi AS (
	SELECT i.indeks, COUNT(idPredmeta) as br_padova
	FROM ispit i
	WHERE i.ocena = 5 AND i.status = 'o'
	GROUP BY i.indeks
)
SELECT d.ime, d.prezime, COALESCE(br_padova, 0)
FROM dosije d LEFT JOIN padovi p ON d.indeks = p.indeks;

-- 6. izdvojiti broj studenata koji su polozili neke predmete
-- u bar 2 razlicita roka

WITH pom AS(
	SELECT DISTINCT indeks, skgodina, oznakaroka
	FROM ispit
	WHERE ocena > 5 AND status = 'o'
),
pom2 AS( SELECT indeks
		 FROM pom
     	 GROUP BY indeks
		 HAVING COUNT(*) >= 2)
 SELECT COUNT(*)
 FROM pom2;

WITH pom AS(
	SELECT indeks, COUNT(DISTINCT (skgodina || oznakaroka)) br_rokova
	FROM ispit
	WHERE ocena > 5 AND status = 'o'
	GROUP BY indeks
)
SELECT COUNT(*)
FROM pom
WHERE br_rokova >=2;

-- izdvojiti indekse studenata koji su rodjeni u istom gradu kao
-- oni studenti koji su upisani na matf pre vise od  4 godine

WITH validni_gradovi AS(
	SELECT mestorodjenja
	FROM dosije
	WHERE YEAR(current date -  datupisa) = 4
)
SELECT d.indeks
FROM dosije d
WHERE d.mestorodjenja IN (SELECT * FROM validni_gradovi);

			
-- IZDVOJITI NAZIVE ISPITNIH ROKOVA U KOJIMA:
-- 	nijedan student nije pao ispit koji nosi 8 espb ili
--  postoji neki drugi ispitni rok iz iste godine u kome 
--  je neki student pao ispit koji nosi 8 espb

WITH osam_espb AS(
	SELECT id FROM predmet
	WHERE espb = 8
)
SELECT ir.naziv
FROM ispitnirok ir
WHERE NOT EXISTS (SELECT *
				  FROM ispit i
				  WHERE i.skgodina = ir.skgodina AND i.oznakaroka = ir.oznakaroka
				  	AND ocena = 5 AND status = 'o' AND i.idpredmeta IN (SELECT * FROM osam_espb))
	OR EXISTS(SELECT * 
			  FROM ispit i
			  WHERE i.skgodina = ir.skgodina AND i.oznakaroka <> ir.oznakaroka
				  	AND ocena = 5 AND status = 'o' AND i.idpredmeta IN (SELECT * FROM osam_espb));




