-- 1. izdvojiti ukupan broj studenata, min i max
SELECT COUNT(*)  broj, MIN(indeks) min_indeks, MAX(indeks) max_indeks
FROM dosije;

-- 2. izdvojiti broj diplomiranih studenata
SELECT COUNT(datdiplomiranja)
FROM dosije;

-- 3. koliko razlicitih mesta rodjenja ima na fakulte
SELECT COUNT(DISTINCT mestorodjenja)
FROM dosije;

-- SUM AVG

-- 4. za studente koji su nesto polozili izdvojimo
-- br indeksa kao i broj sakupljenih espb
-- kao i ime i prezime
SELECT i.indeks, d.ime, d.prezime, SUM(p.espb)
FROM ispit i JOIN predmet p
	ON i.idpredmeta = p.id
	JOIN dosije d
		ON i.indeks = d.indeks
WHERE i.ocena > 5 AND i.status = 'o'
GROUP BY i.indeks, d.ime, d.prezime;

-- 5. isto kao 4. samo hocemo da izdvojimo informacije
-- samo za one studente koji imaju bar 20 espb
SELECT i.indeks, d.ime, d.prezime, SUM(p.espb) osvojeni_poeni
FROM ispit i JOIN predmet p
	ON i.idpredmeta = p.id
	JOIN dosije d
		ON i.indeks = d.indeks
WHERE i.ocena > 5 AND i.status = 'o'
GROUP BY i.indeks, d.ime, d.prezime
HAVING SUM(p.espb) >= 20
ORDER BY osvojeni_poeni;

-- 6. izdvojiti ime, prezime, indeks kao i broj espb za svekog studenta 
-- broj polozenih ispit:
SELECT d.indeks, d.ime, d.prezime, SUM(CASE
											WHEN p.espb IS NULL THEN 0
											ELSE p.espb
										END) osvojeni_poeni
FROM ispit i JOIN predmet p
	ON i.idpredmeta = p.id
	RIGHT JOIN dosije d
		ON i.indeks = d.indeks AND i.ocena > 5 AND i.status = 'o'
GROUP BY d.indeks, d.ime, d.prezime
HAVING SUM(CASE
			WHEN p.espb IS NULL THEN 0
			ELSE p.espb
  		   END) > 20
ORDER BY osvojeni_poeni;

-- 7. za svaki predmet izdvojiti koliko ga je studenata polozilo
SELECT p.id, p.oznaka, 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, p.oznaka;

-- 8. za svakog studenta koji je nesto polozio iracunati prosek
SELECT d.indeks, d.ime, d.prezime, AVG(i.ocena + 0.0) prosek
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
ORDER BY 4;

-- 9, za svaki od isptinih rokova i za svaki polagani predmet u rom roku odredimo
--    broj uspesnih polaganja
SELECT i.idpredmeta, i.skgodina, i.oznakaroka, SUM(
												 CASE
												 	WHEN i.ocena > 5 AND i.status = 'o'
												 			THEN 1
												    ELSE 0
												 END
												) 
FROM ispit i
GROUP BY i.idpredmeta, i.skgodina, i.oznakaroka;
-- OVIME BI ELIMINSALI ONE KOJI NEMAJU USPESNIH POLAGANJA;
SELECT i.idpredmeta, i.skgodina, i.oznakaroka, COUNT(*)
FROM ispit i
WHERE i.ocena > 5 AND i.stauts = 'o'
GROUP BY i.idpredmeta, i.skgodina, i.oznakaroka;


-- 7'. za svaki predmet izdvojiti koliko ga je studenata polozilo
SELECT p.id, p.oznaka, COUNT(*)
FROM predmet p JOIN ispit i
	ON p.id = i.idpredmeta 
WHERE i.ocena > 5 AND i.status = 'o'
GROUP BY p.id, p.oznaka
UNION
SELECT p.id, p.oznaka, 0
FROM predmet p
WHERE p.id NOT IN (SELECT idpredmeta
				   FROM ispit
				   WHERE ocena > 5 AND status = 'o');

-- 10. za svakog studenta koji je polagao neki ispit
--     izdvojiti koliko je dobio osmica

SELECT d.indeks, d.ime, d.prezime, COUNT(*) br_osmica
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
WHERE i.ocena = 8
GROUP BY d.indeks, d.ime, d.prezime;

SELECT d.indeks, d.ime, d.prezime, (SELECT COUNT(*)
									FROM ispit i
									WHERE i.indeks = d.indeks
										AND i.ocena = 8)
FROM dosije d;

-- dodamo broj devetki:
SELECT d.indeks, d.ime, d.prezime, SUM(
									CASE ocena
										WHEN 8 THEN 1
										ELSE 0
									END									
									) br_osmica, SUM(
													CASE ocena
														WHEN 9 THEN 1
														ELSE 0
													END									
													) br_devetki
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
GROUP BY d.indeks, d.ime, d.prezime;


-- dodamo broj padanja padanje - dobio je 5 ili je ocena NULL:
SELECT d.indeks, d.ime, d.prezime, SUM(
									CASE ocena
										WHEN 8 THEN 1
										ELSE 0
									END									
									) br_osmica, 
									SUM(
										CASE ocena
											WHEN 9 THEN 1
											ELSE 0
										END									
									) br_devetki,  
									SUM( 
										CASE COALESCE(ocena, 5)
											WHEN 5 THEN 1
											ELSE 0
										END) br_padanja
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
GROUP BY d.indeks, d.ime, d.prezime;

SELECT d.indeks, d.ime, d.prezime, SUM(
									CASE ocena
										WHEN 8 THEN 1
										ELSE 0
									END									
									) br_osmica, 
									SUM(
										CASE ocena
											WHEN 9 THEN 1
											ELSE 0
										END									
									) br_devetki,  
									SUM( 
										CASE 
											WHEN NULLIF(ocena, 5) IS NULL THEN 1
											ELSE 0
										END) br_padanja
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
GROUP BY d.indeks, d.ime, d.prezime;


-- 11. ZA PREDMET KOJI JE PRVI POLAGAN
-- IZDVOJITI OZNAK PREDMETA, IME I PREZIME STUDENATA KOJI SU GA IKADA UPISALI

SELECT p.id, p.oznaka, d.ime, d.prezime
FROM predmet p, dosije d
WHERE EXISTS(SELECT * FROM upisankurs k 
			WHERE k.indeks = d.indeks
				AND k.idpredmeta = p.id)
	AND EXISTS(SELECT * FROM ispit i1
				WHERE i1.idpredmeta = p.id
					AND NOT EXISTS(SELECT *
									FROM ispit i2
									WHERE i2.datpolaganja < i1.datpolaganja));
SELECT p.id, p.oznaka, d.ime, d.prezime
FROM predmet p, dosije d
WHERE EXISTS(SELECT * FROM upisankurs k 
			WHERE k.indeks = d.indeks
				AND k.idpredmeta = p.id)
	AND EXISTS(SELECT * FROM ispit i1
				WHERE i1.idpredmeta = p.id
					AND i1.datpolaganja = (SELECT MIN(datpolaganja)
												FROM ispit));
				
NULIFF(x, y)		
-- 12. izdvojiti indeks, ime, prezime studenata koji su polozili bar 3 predmeta

SELECT d.indeks, d.ime, d.prezime
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
WHERE i.ocena > 5 AND i.status = 'o'
GROUP BY d.indeks, d.ime, d.prezime
HAVING COUNT(*) >= 3;








