Postavku i bazu možete preuzeti ovde.
/* Resenje redovnog kolokvijuma 2015-2016 */ use socialNetwork -- 1. zadatak --I nacin select max(p.datumObjave) from Post p join tipPosta tp on p.idTipa = tp.idTipa and tp.tip = 'slika' -- II nacin select max(datumObjave) from post where idTipa in ( select idTipa from tipPosta where tip like 'slika' ) -- 2. zadatak -- I nacin select k.ime, COUNT(p.idKorisnika2) as brojPrijatelja from Korisnik k join Prijatelji p on k.id = p.idKorisnika1 group by k.ime, k.id --II nacin select k.ime , ( select count(*) from Prijatelji p where k.id = p.idKorisnika1 ) as broj_prijatelja from Korisnik k -- 3. zadatak -- I nacin select ime from Korisnik where id in ( select distinct idKorisnika1 from Prijatelji where DATEPART(MONTH,getdate()) = DATEPART(month,datum) ) -- II nacin select k.ime from korisnik k where exists ( select * from prijatelji p where p.idkorisnika1=k.id and datepart(month,p.datum) = datepart(month,getdate()) ) -- 4. zadatak -- I nacin -- I nacin --ukupan broj slika po korisniku create view broj_slika_po_korisniku as select idVlasnika, count(*) as 'brojSlika' from post p join tipPosta tp on p.idTipa = tp.idTipa where tp.tip like 'slika' group by idVlasnika --ukupan broj lajkova na svim slikama po korisniku create view ukupan_broj_lajkova_slika_po_korisniku as select idVlasnika as 'idVlasnika', count(*) as 'brojLajkova' from lajk l join post p on l.idPosta = p.id join tipPosta tp on p.idTipa = tp.idTipa where tp.Tip like 'slika' group by idVlasnika select bs1.idVlasnika, brojLajkova*1.0/brojSlika ProsekLajkova from broj_slika_po_korisniku bs1 join ukupan_broj_lajkova_slika_po_korisniku bl1 on bs1.idVlasnika = bl1.idVlasnika where brojLajkova*1.0/brojSlika >= 3 -- II naci /* Za svaku postovanu sliku nekog korisnika izracunaj koliko je dobio lajkova za nju. */ create view LajkoviPoSlici as select p.idvlasnika, l.idposta,count(*) BrLajkova from post p join tipposta tp on p.idtipa=tp.idtipa and tp.tip like 'slika' join lajk l on l.idposta=p.id group by p.idvlasnika, l.idposta /* Za svakog korisnika izracunaj koliko ima ukupno lajkova i to podeli sa brojem slika, a to je ekvivalentno trazenju srednje vrednosti broja lajkova za sve njegove slike. */ select idvlasnika,avg(brlajkova * 1.0) 'ProsekLajkova' from LajkoviPoSlici group by idvlasnika having avg(brlajkova * 1.0) > 3 -- 5. zadatak --jedna osoba spojena sa svim svojim prijateljima i svim prijateljima svojih prijatelja create view prijateljiPrijatelja as select p1.idKorisnika1 as 'osoba', p1.idKorisnika2 as 'prijatelji', p2.idKorisnika2 as 'prijatelji prijatelja' from Prijatelji p1 join Prijatelji p2 on p1.idKorisnika2 = p2.idKorisnika1 and p1.idKorisnika1 != p2.idKorisnika2 select osoba, count([prijatelji prijatelja]) as 'brojPotencijalnihPrijatelja' from prijateljiPrijatelja p1 left join prijatelji p on p1.osoba = p.idKorisnika1 and p1.[prijatelji prijatelja] = p.idKorisnika2 where p.idKorisnika1 is null group by osoba --6. zadatak create view sest1 as select p1.idKorisnika1 as 'kor1', p2.idKorisnika1 as 'kor2', count(*) as 'brojZajednickihPrijatelja' from Prijatelji p1 join Prijatelji p2 on p1.idKorisnika1 != p2.idKorisnika1 and p1.idKorisnika2 = p2.idKorisnika2 group by p1.idKorisnika1,p2.idKorisnika1 create view sest2 as select s.kor1,s.kor2,s.brojZajednickihPrijatelja from sest1 s left join Prijatelji p on s.kor1 = p.idKorisnika1 and s.kor2 = p.idKorisnika2 where p.idKorisnika1 is null select s2_1.* from sest2 s2_1 left join sest2 s2_2 on s2_1.kor1 = s2_2.kor1 and s2_1.kor2 != s2_2.kor2 and s2_1.brojZajednickihPrijatelja < s2_2.brojZajednickihPrijatelja where s2_2.kor1 is null --7. zadatak create view sedmi1 as select idVlasnika, p.id, count(*) as 'brojLajkovaPoPostu' from post p join lajk l on p.id = l.idPosta where DATEDIFF(DAY,p.datumObjave,getdate())<=(365*3+30) group by idVlasnika, p.id create view sedmi2 as select idVlasnika, p.id, count(*) as 'brojLajkovaPoPostu' from post p join lajk l on p.id = l.idPosta where DATEDIFF(DAY,p.datumObjave,getdate())>(365*3+30) group by idVlasnika, p.id create view sedmi3 as select idVlasnika, avg(brojLajkovaPoPostu*1.0) as 'prosek' from sedmi1 group by idVlasnika create view sedmi4 as select idVlasnika, avg(brojLajkovaPoPostu*1.0) as 'prosek' from sedmi2 group by idVlasnika select case when s3.idVlasnika is null then s4.idVlasnika else s3.idVlasnika end as 'idVlasnika', case when s3.prosek > s4.prosek then 'raste' when s3.prosek <= s4.prosek then 'opada' when s3.prosek is null then 'opada' when s4.prosek is null then 'raste' end as 'popularnost' from sedmi3 s3 full outer join sedmi4 s4 on s3.idVlasnika = s4.idVlasnika