-- merge -- 1. --- a) kreirati tabelu predmetstudenti koja -- sadrzi informacije o broju studenata koji su -- uspesno polozili ispit iz tog predmeta -- idPredmeta brojstudenata --- primarni i kljuc i strani kljuc na tabelu predmet CREATE TABLE predmetstudenti( idpredmeta INTEGER NOT NULL PRIMARY KEY, brstudenata INTEGER, FOREIGN KEY fk_ps_predmet(idpredmeta) REFERENCES predmet ); -- b) poupiniti tabelu predmetstudenti sa obaveznim -- predmetima sa osnovnih akademskih studija Informatike -- prilikom popunjavanja vrednost u koloni brStudenata postaviti na 5 INSERT INTO predmetstudenti(idpredmeta, brstudenata) SELECT pp.idpredmeta, 5 FROM predmetprograma pp JOIN studijskiprogram sp ON pp.idprograma = sp.id JOIN nivokvalifikacije nk ON sp.idnivoa = nk.id WHERE sp.naziv = 'Informatika' AND nk.naziv = 'Osnovne akademske studije' AND pp.vrsta = 'obavezan'; SELECT * FROM predmetstudenti; -- c) dopuniti sadrzaj tabelel predmemt studenti sa validniim -- informacijam aiz baze, azurirati podatke za vec postojece -- podatke i dodajemo nove redove za ostale MERGE INTO predmetstudenti ps USING ( SELECT p.id, COUNT(i.indeks) br FROM predmet p LEFT JOIN ispit i ON p.id = i.idpredmeta AND i.ocena > 5 AND i.status = 'o' GROUP BY p.id ) AS real_data ON ps.idpredmeta = real_data.id WHEN MATCHED THEN UPDATE SET ps.brstudenata = real_data.br WHEN NOT MATCHED THEN INSERT VALUES (real_data.id, real_data.br) ELSE IGNORE; SELECT * FROM predmetstudenti; -- d) obrisati tabelu predmetstudenti DROP TABLE predmetstudenti; -- 2. -- a)Napraviti tabelu studentPodaci u kojoj se cuvaju sledece informacije: -- indeks, br polozenih ispita, prosek, datum upisa -- indeks je primarni kljuc i strani na tabelu dosije CREATE TABLE studentPodaci ( indeks INTEGER NOT NULL PRIMARY KEY, br_polozenih SMALLINT, prosek FLOAT, datupisa DATE, FOREIGN KEY (indeks) REFERENCES dosije); -- b) ubaciti u tabelu sledece informacije: -- sve osim datupisa za studente sa prosekom preko 8 -- za studente koji imaju status diplomirao: -- br polozenih = 40 prosek 10 datupisa nepoznat INSERT INTO studentPodaci(indeks, br_polozenih, prosek) WITH diplomirani AS( SELECT d.indeks FROM dosije d WHERE d.idstatusa = (SELECT id FROM studentskistatus WHERE naziv = 'Diplomirao') ) SELECT i.indeks, COUNT(i.idpredmeta), AVG(i.ocena +0.0) FROM ispit i WHERE i.ocena > 5 AND i.status = 'o' AND i.indeks NOT IN (SELECT * FROM diplomirani) GROUP BY i.indeks HAVING AVG(i.ocena +0.0) > 8 UNION SELECT indeks, 40, 10.0 FROM diplomirani; SELECT * FROM studentPodaci; -- c) ubaciti u tabelu sledece informacije -- 1)studentima koji imaju status diplomiranog studenta -- azurirati datum upisa -- 2) studentima koji su vec u tabeli i na budzetu su -- azurirati br polozneih ispita i prosek -- 3) studente koji su vec u tabeli i imaju status ispisan -- obrisati unos iz tabele -- 4) studentima koji se ne nalzaze u tabeli uneti indeks -- validan br_pp i prosek -- ostale ne dirati MERGE INTO studentPodaci sp USING ( SELECT d.indeks, ss.naziv, d.datupisa, AVG( CASE WHEN ocena > 5 AND status = 'o' THEN ocena + 0.0 ELSE NULL END ) prosek, SUM( CASE WHEN ocena > 5 AND status = 'o' THEN 1 ELSE 0 END ) br_polozenih FROM (dosije d JOIN studentskistatus ss ON d.idstatusa = ss.id) LEFT JOIN ispit i ON d.indeks = i.indeks GROUP BY d.indeks, d.datupisa, ss.naziv ) as pom ON sp.indeks = pom.indeks WHEN MATCHED AND pom.naziv = 'Diplomirao' THEN UPDATE SET sp.datupisa = pom.datupisa WHEN MATCHED AND pom.naziv = 'Budzet' THEN UPDATE SET (sp.br_polozenih, sp.prosek) = (pom.br_polozenih, pom.prosek) WHEN MATCHED AND pom.naziv = 'Ispisan' THEN DELETE WHEN NOT MATCHED AND pom.naziv <> 'Ispisan' THEN INSERT (indeks, br_polozenih, prosek) VALUES (pom.indeks, pom.br_polozenih, pom.prosek) ELSE IGNORE; SELECT * FROM studentPodaci; ---------------------------------------------- -- Napisati upit na SQL koji za skolsku goindu i studijski program -- osnovnih studija izracunava koliki je procenat studenata koji su godine -- upisali fakultet upisan upravo na taj studijski program, kao i -- prosecnu ocenu studenata tog studijskog programa u toku te sk godine -- oznaku i nzaiv studijskog programa -- skolsku godinu ukupan broj upisanih na fakultet -- procenat na smeru, prosek WITH upisaniPoGoidni AS( SELECT indeks / 10000 godina, COUNT(*) brStud FROM dosije GROUP BY indeks / 10000), studijskiProgramStat AS( SELECT d.idprograma, indeks / 10000 godina, COUNT(*) brStud FROM dosije d GROUP BY d.idprograma, indeks / 10000), prosekPoProgramu AS ( SELECT d.idprograma, i.skgodina, avg(i.ocena + 0.0) prosek FROM dosije d JOIN ispit i ON d.indeks = i.indeks WHERE ocena > 5 AND status= 'o' GROUP BY d.idprograma, i.skgodina) SELECT sp.id, sp.naziv, upg.brStud, sps.brStud * 100.0 / upg.brStud, ppp.prosek FROM studijskiprogram sp JOIN nivokvalifikacije nk ON sp.idnivoa = nk.id JOIN studijskiProgramStat sps ON sp.id = sps.idprograma JOIN prosekPoProgramu ppp ON sps.idprograma = ppp.idprograma AND sps.godina = ppp.skgodina JOIN upisaniPoGoidni upg ON upg.godina = sps.godina WHERE nk.naziv = 'Osnovne akademske studije';