--1.izdvojiti informacije o svim predmetima koji nose najvise bodova
SELECT *
FROM predmet p
WHERE p.espb >= ALL(SELECT espb FROM predmet);

-- SELECT espb FROM predmet je nekorelisani podupit -> moze sam za sebe da se izvrsi

--2. izdvojiti informacije o svim predmetima osim o onima koji nose najvise bodova

SELECT *
FROM predmet p
WHERE p.espb < ANY(SELECT espb FROM predmet);

SELECT *
FROM predmet p
WHERE p.espb < SOME(SELECT espb FROM predmet);

-- ANY i SOME rade iste stvari

--(NOT)EXISTS(SELECT....) <- proverava postoji li neki rezultat ovog podupita
SELECT *
FROM predmet p
WHERE EXISTS(SELECT *
			 FROM predmet p1
			 WHERE p1.espb > p.espb);

-- sada imamo KORELISANI podupit <- uglavnom manje efikasno

--3. izdvojiti informacije o  najskorije diplomiranim studentima
--zelimo da njegov datum diplomiranja bude >= od svih ostalih datuma diplomiranja
SELECT *
FROM dosije d
WHERE d.datdiplomiranja >= ALL(SELECT datdiplomiranja 
                               FROM dosije 
							   WHERE datdiplomiranja IS NOT NULL);

-- BITNO: bez IS NOT NULL nece raditi zato sto x >= NULL je netacno

--4. izdvojiti nazive predmeta koje je polagao student sa indeksom 20170022

SELECT DISTINCT p.naziv
FROM predmet p JOIN ispit i
	ON p.id = i.idpredmeta
WHERE indeks = 20170022;

-- moramo distinct jer je mozda neke ispite polagao vise puta

--4. - sa podupitima

SELECT p.naziv
FROM predmet p
WHERE EXISTS(SELECT *
			 FROM ispit i
			 WHERE i.idpredmeta = p.id
				AND i.indeks = 20170022; )

--4. sa operatorom ANY
 
SELECT p.naziv
FROM predmet p JOIN ispit i
	ON p.id = i.idpredmeta
WHERE 2017022 = ANY(SELECT i.indeks
					FROM ispit i1
					WHERE i1.idpredmeta = p.id);

-- sa nekorelisanim podupitom:

SELECT p.naziv
FROM predmet p
WHERE p.id = ANY(SELECT i.idpredmeta
				 FROM ispit i
				 WHERE i.indeks = 2017022);

-- IN

SELECT p.naziv
FROM predmet p
WHERE p.id = IN(SELECT i.idpredmeta
				FROM ispit i
				WHERE i.indeks = 2017022);

--5.izdvojiti indekse,imena i prezimena studenata koji nisu polagali predmet ciji je identifikator 2166

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE d.indeks NOT IN (SELECT i.indeks
						FROM ispit i
						WHERE i.idpredmeta = 2166);

--drugi nacin

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE NOT EXISTS(SELECT *
		         FROM ispit i
		         WHERE i.idpredmeta = 2166
				 	AND i.indeks = d.indeks);

-- 6. izdvojiti indekse, imena i prezimena studenata koji su 
--    polagali neki predmet koji nosi 5 espb
SELECT DISTINCT d.indeks, d.ime, d.prezime
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
	JOIN predmet p
		ON i.idpredmeta = p.id
WHERE p.espb = 5;

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE d.indeks IN (SELECT i.indeks
                   FROM ispit i
				   WHERE i.idpredmeta IN (SELECT p.id
				                          FROM predmet p
										  WHERE p.espb = 5));

--7. prikazi brojeve indeksa studenata koji su polozili bar one predmete 
--   koje i student sa brojem indeksa 20140026

SELECT d.indeks
FROM dosije d
WHERE NOT EXISTS(SELECT *
                 FROM ispit i1 
                 WHERE i1.indeks = 20140026 AND
		            i1.status = 'o' AND  i1.ocena > 5
		            AND NOT EXISTS (SELECT *
		                            FROM ispit i2 
		                            WHERE i2.indeks = d.indeks AND
		                                AND i2.idpredmeta = i1.idpredmeta
		                                  i2.status = 'o' AND  i2.ocena > 5));

SELECT d.indeks
FROM dosije d
WHERE NOT EXISTS(SELECT * FROM predmet p
                 WHERE EXISTS (SELECT * FROM ispit i
				               WHERE i.indeks = 20150168
							        AND i.ocena > 5 AND i.status = 'o'
									AND i.idpredmeta = p.id)
					AND NOT EXISTS (SELECT * FROM ispit i
					                WHERE i.indeks = d.indeks
									AND i.ocena > 5 AND i.status = 'o'
									AND i.idpredmeta = p.id))


--8. izdvojiti naziv predmeta ciji je kurs organizovan u svim godinama koje postoje u bazi podataka

SELECT p.naziv
FROM predmet p
WHERE NOT EXISTS(
	SELECT * FROM skolskagodina sg
	WHERE NOT EXISTS(SELECT * 
	                FROM kurs k
		            WHERE k.idpredmeta = p.id
		            AND sg.skgodina = k.skgodina
					));

--9. izdvojiti podatke o predmetima koje su polagali svi studenti iz Berana koji studiraju smer
--   sa oznakom I4

SELECT *
FROM predmet p
WHERE NOT EXISTS(SELECT *
                FROM dosije d JOIN studijskiprogram sp
				    ON d.idprograma = sp.id
			    WHERE d.mestorodjenja = 'Berane' AND sp.oznaka = 'I4'
				    AND NOT EXISTS(SELECT *
					               FROM ispit i
								   WHERE i.indeks = d.indeks
								        AND i.idpredmeta = p.id));

--10. za studente koji su polagali ispit u roku odrzanom 2018/2019 
--    izdvoji podatke o polozenim ispitima
--    izdvojiti indeks, ime, prezime, naziv ispita, oznaka rok, i skgodina

SELECT d.indeks, d.ime, d.prezime, p.naziv, i.oznakaroka, i.skgodina
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
	JOIN predmet p
	ON i.idpredmeta = p.id
WHERE i.ocena > 5 AND i.status = 'o'
	AND EXISTS(SELECT * FROM ispit i1
	           WHERE i1.indeks = d.indeks
			        AND i1.skgodina = 2018)
ORDER BY d.indeks;



--CASE IZARAZ


--11. za svaki ispit izdvojiti indeks, idpredmeta , dobijenu ocenu. 
-- vrednost ocene ispisati slovima. ako je predmet nepolozen, umesto ocene ispisi nepolozen

SELECT i.indeks, i.idpredmeta, CASE i.ocena
				WHEN 6 THEN 'sest'
				WHEN 7 THEN 'sedam'
				WHEN 8 THEN 'osam'
				WHEN 9 THEN 'devet'
				WHEN 10 THEN 'deset'
				ELSE 'nepolozen'
				END AS ocena
FROM ispit i;

--12. ispit je lak ako nosi < 6 espb
--		srednje tezak  ako nosi izmedju 6 i 8 espb
-- 		tezak ako nosi > 8
--   izdvojiti nazive predmeta, broj espb koji nosi kao i njihovu tezinu

SELECT naziv, espb, CASE
					    WHEN espb < 6 THEN 'lak'
						WHEN espb BETWEEN 6 AND 8 THEN 'srednje tezak'
						ELSE 'tezak'
					END AS 'TEZINA ISPITA'
FROM predmet;


--12. izdvojiti ime, prezime, indeks, status za svakog studenta.
-- status studenta moze biti:
--	brucos (nije polagao nijedan ispit)
--	nijedan polozen (nema polozenih predmeta)
--	student (inace)
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 status
FROM dosije d;
