-- za svaki predmet izdovijit koliko je studenata polozilo taj predmet SELECT p.id, p.oznaka, (SELECT COUNT(*) FROM ispit i WHERE i.idpredmeta = p.id AND i.ocena > 5 AND i.status = 'o') FROM predmet p; -- SLOZENI UPITI --WITH ime_tabele AS ( -- UPIT --) --SELECT * --FROM ime_tabele -- 1. predmeti su rasporedjeni u sledece kategorije: -- 1. laki - espb < 6 -- 2. srednje teskie espbe izmedju 6 i 8 -- 3. teski inace -- izdvojiti broj predmeta za svaku kategoriju SELECT CASE WHEN espb < 6 THEN 'laki' WHEN espb BETWEEN 6 AND 8 THEN 'srednje teski' ELSE 'teski' END as tezina, COUNT(*) FROM predmet GROUP BY CASE WHEN espb < 6 THEN 'laki' WHEN espb BETWEEN 6 AND 8 THEN 'srednje teski' ELSE 'teski' END; -- napravimo tabelu u kojo imamo id_predmeta i njegovu tezinu WITH klasifikacija AS( SELECT CASE WHEN espb < 6 THEN 'laki' WHEN espb BETWEEN 6 AND 8 THEN 'srednje teski' ELSE 'teski' END as tezina, id FROM predmet ) SELECT tezina, COUNT(*) FROM klasifikacija GROUP BY tezina; -- 2. koliko je studenata polozilo vise od 20 espb WITH polozeno AS ( SELECT i.indeks, SUM(p.espb) polozeno_poena 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 polozeno WHERE polozeno_poena > 20; -- 3. Naci broj ispitnih rokova u kojima su studenti polozili -- bar 2 razlicita predmeta WITH rokovi AS ( SELECT i.skgodina, i.oznakaroka, COUNT(DISTINCT i.idpredmeta) broj_polozenih_ispita FROM ispit i WHERE i.ocena > 5 AND i.status = 'o' GROUP BY i.skgodina, i.oznakaroka ) SELECT COUNT(*) FROM rokovi WHERE broj_polozenih_ispita >= 2; SELECT COUNT(*) FROM ispitnirok -- 4. uz svaki predmet izdvojiti id i br studenata koji su ga polagali -- a) sa agregatnim funkcijama -- b) skupovnim operatorima -- v) pomocnim tabelama --b) SELECT i.idpredmeta, COUNT(DISTINCT indeks) br_studenata FROM ispit i GROUP BY i.idpredmeta UNION SELECT p.id, 0 FROM predmet p WHERE NOT EXISTS(SELECT * FROM ispit i WHERE i.idpredmeta = p.id) ORDER BY 2 DESC; -- a) SELECT p.id, COUNT(DISTINCT indeks) FROM predmet p LEFT JOIN ispit i ON p.id = i.idpredmeta GROUP BY p.id; -- c) pomocna tabela? WITH statistika_ispit AS( SELECT i.idpredmeta, COUNT(DISTINCT indeks) br_studenata FROM ispit i GROUP BY i.idpredmeta ) SELECT p.id, coalesce(br_studenata, 0) FROM predmet p LEFT JOIN statistika_ispit si ON p.id = si.idpredmeta; -- 5. za svakog studenta izdvojiti broj ispita koje je pao -- ako nije pao ni jedan ispit staviti 0 -- c) pomocna tabela WITH pali_ispiti AS (SELECT i.indeks as indeks , SUM(CASE coalesce(i.ocena,5) WHEN 5 THEN 1 ELSE 0 END ) AS broj_padanja FROM ispit i GROUP BY i.indeks) SELECT d.ime, d.prezime, coalesce(pi.broj_padanja, 0) FROM dosije d LEFT JOIN pali_ispiti pi ON d.indeks = pi.indeks; -- b) skupovne opetacije SELECT d.ime, d.prezime, COUNT(*) FROM dosije d JOIN ispit i ON d.indeks = i.indeks WHERE i.ocena = 5 OR i.ocena is NULL GROUP BY d.indeks, d.ime, d.prezime UNION SELECT d.ime, d.prezime, 0 FROM dosije d WHERE NOT EXISTS(SELECT * FROM ispit i WHERE i.indeks = d.indeks AND( i.ocena = 5 OR i.ocena is null)); -- 6. izdvojiti broj studenata koji su polzili neke predmete -- u bar 2 razlicita roka WITH broj_rokova AS ( SELECT indeks, COUNT(DISTINCT (char(skgodina) || oznakaroka)) br_rokova FROM ispit WHERE ocena > 5 AND status = 'o' GROUP BY indeks ) SELECT COUNT(*) FROM broj_rokova WHERE br_rokova >= 2; -- bez pomocnih tabela! SELECT COUNT(DISTINCT i.indeks) FROM ispit i WHERE i.ocena > 5 AND i.status = 'o' AND EXISTS(SELECT * FROM ispit i1 WHERE i1.indeks = i.indeks AND i1.ocena > 5 AND i1.status = 'o' AND (i1.skgodina <> i.skgodina OR i1.oznakaroka <> i.oznakaroka)); ----------- VEZBA ------------------ -- 2 napisati upit u SQL kojim se izdvajaju nazivi ispitnih rokova -- u kojima nijedan student nije pao na ispitu iz predmeta koji nosi 8 espb -- ili za taj rok postoji neki drugi rok odrzan u istoj godini -- u kome je barem jedan student pao neki predmet od 8 bodova -- urediti prema nazivu roka; -- -- padanje <=> ocena = 5 -- WITH osam_espb AS( SELECT id FROM predmet WHERE espb = 8 ) SELECT 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 ocena = 5 AND status = 'o' AND i.skgodina = ir.skgodina AND i.oznakaroka <> ir.oznakaroka AND i.idpredmeta IN (SELECT * FROM osam_espb)); -- izdvojiti indekse studentaa koji su rodjeni u istom gradu kao oni -- studenti koji su upisani na matf pre vise od 4 godine SELECT d.indeks FROM dosije d WHERE EXISTS(SELECT * FROM dosije d2 WHERE d2.mestorodjenja = d.mestorodjenja AND d2.datupisa + 5 YEARS + 5 MONTHS < CURRENT DATE ); YEARS(current_date - datupisa) > 4...