You are on page 1of 10

GROUP BY - иста врста упита понови за сваку вредност у некој колони

1. Приказати укупан фонд часова у сваком од четири разреда.

SELECT razred, SUM(fond) as fond_casova


FROM predmet
GROUP BY razred;

2. Приказати најмању оцену из сваког предмета.


SELECT id_predmet, MIN(ocena) as min_ocena
FROM ocena
GROUP BY id_predmet;

3. Приказати број ученика у сваком од одељења.


SELECT razred, odeljenje, COUNT(*) as broj_ucenika
FROM ucenik
GROUP BY razred, odeljenje;

4. Приказати број девојчица у сваком разреду.


SELECT razred, COUNT(*) as broj_devojcica
FROM ucenik
WHERE pol = 'ж'
GROUP BY razred;

5. Приказати три најчешћа презимена.


SELECT prezime, COUNT(*) AS broj_ucenika
FROM ucenik
GROUP BY prezime
ORDER BY broj_ucenika DESC
LIMIT 3;

6. Прикажи укупан број изостанака за сваки статус изостанака (оправдане,


неоправдане, нерегулисане).
SELECT status, COUNT(*) as broj_izostanaka
FROM izostanak
GROUP BY status;
7. Прикажи највећи фонд часова неког предмета за сваки од разреда (приказати редни број
разреда и максимални фонд у колони под називом najveci_fond).

SEELCT razred, max(fond) as najveci_fond


FROM predmet
GROUP BY razred;

8. Прикажи три датума у којима је остварено највише изостанака (уз датум приказати и број
изостанака у колони под називом broj_izostanaka).

SEELCT datum, count(*) as broj_izostanaka


FROM izostanak
GROUP BY datum
ORDER BY broj_izostanaka DESC
LIMIT 3;

HAVING
Када желимо да филтрирамо податке пре груписања, користимо клаузулу WHERE.
Када желимо да филтрирамо податке након груписања помоћу GROUP BY и
израчунавања агрегатних статистика, користимо клаузулу HAVING.

1. Приказати одељења у којима има више од 30 ученика.


SELECT razred, odeljenje, COUNT(*) as broj_ucenika
FROM ucenik
GROUP BY razred, odeljenje
HAVING broj_ucenika >= 30;

2. Приказати одељења у којима има више од 20 девојчица.


SELECT razred, odeljenje, COUNT(*) as broj_devojcica
FROM ucenik
WHERE pol = 'ж'
GROUP BY razred, odeljenje
HAVING broj_devojcica > 20;
3. За свако женско име које носи више ученица приказати број ученица које носе то
име (резултат сортирати опадајуће по броју ученица).
SELECT ime, COUNT(*) AS broj
FROM ucenik
WHERE pol = 'ж'
GROUP BY ime
HAVING broj >= 2
ORDER BY broj DESC;

4. Прикажи сва одељења четвртог разреда у којима има бар четири ученика рођена
2004. године.
SELECT razred, odeljenje
FROM ucenik
WHERE razred = 4 AND datum_rodjenja between “2004-01-01” and “2004-12-31”
GROUP BY razred, odeljenje
HAVING COUNT(*) >= 2

5. Приказати све датуме за које постоје бар два нерегулисана изостанка (уз датум приказати и
број нерегулисаних изостанака).

SELECT datum, count(*) as broj_izostanaka


FROM izostanak
WHERE status="нерегулисан"
GROUP BY datum
HAVING broj_izostanaka>= 2;

6. Прикажи сва одељења четвртог разреда у којима има бар 15 дечака (приказати само разред
и одељење).

SELECT razred, odeljenje


FROM ucenik
WHERE razred = 4 and pol="м"
GROUP BY razred, odeljenje
HAVING count(*)>= 15 ;
ZADACI
1. Приказати укупан број оправданих изостанака које је направио ученик са
идентификатором 1 (колону назвати broj_izostanaka).

SELECT count(*) as broj_izostanaka


FROM izostanak
WHERE id_ucenik=1 and status="оправдан"
GROUP BY id_ucenik;

2. Приказати просечну оцену, заокружену на две децимале, на писменом задатку из


математике у првом разреду одржаном 15. октобра 2020. године (математика у првом
разреду има идентификатор 1).

SELECT round(avg(ocena),2)
FROM ocena
WHERE vrsta="писмени задатак" and id_predmet=1 and datum="2020-10-15"
GROUP BY vrsta, id_predmet,datum;

3. За сваки датум у ком је направљен неки изостанак одредити укупан број направљених
изостанака (колону назвати broj_izostanaka).

SELECT datum, count(*) as broj_izostanaka


FROM izostanak
GROUP BY datum
HAVING broj_izostanaka>0;

4. За сваки статус изостанака (оправдани, неоправдани, нерегулисани) одредити број таквих


изостанака у мају 2021. године.

SELECT status, count(*) as broj_izostanaka


FROM izostanak
WHERE datum between "2021-05-01" and "2021-05-31"
GROUP BY status;
5. За сваки статус изостанака одреди први и последњи датум када је такав изостанак
направљен (колоне назвати prvi и poslednji).

SELECT status, min(datum) as prvi, max(datum) as poslednji


FROM izostanak
GROUP BY status;

6. За сваки месец приказати број ученика рођених у том месецу (колоне


назвати mesec и broj).

SELECT strftime("%m",datum_rodjenja) as mesec, count(*) as broj


FROM ucenik
GROUP BY mesec;

7. За сваки месец у години y ком је неки ученик добио неку јединицу - приказати број
јединица које су ученици добили током тог месеца (колоне назвати mesec и broj).

SELECT strftime("%m",datum) as mesec, count(ocena) as broj


FROM ocena
WHERE ocena=1
GROUP BY mesec;

8. Прикажи датуме у којима има неоправданих изостанака, али да је то строго мање од 10 (уз
сваки датум приказати и број изостанака).

SELECT datum, count(*) as broj


FROM izostanak
WHERE status="неоправдан"
GROUP BY datum
HAVING broj<10;

9. Приказати све називе предмета који се предају током неколико разреда (приказати само
називе).

SELECT naziv
FROM predmet
GROUP BY naziv
HAVING count(razred)>1;
JOIN…ON…
1. За сваки изостанак начињен 14. маја 2021. године, приказати име и презиме
ученика, редни број часа и статус изостанка.
SELECT ime, prezime, cas, status
FROM izostanak i
JOIN ucenik u ON i.id_ucenik = u.id
WHERE datum = '2021-05-14';

2. Приказати све оцене из математике за први разред.

SELECT id_ucenik, ocena, datum, vrsta


FROM ocena
JOIN predmet ON ocena.id_predmet = predmet.id
WHERE predmet.naziv = 'Математика' AND predmet.razred = 1;

3. Приказати све оцене у читљивом формату (тако да се виде име и презиме ученика и
назив предмета)
SELECT p.naziv, u.ime, u.prezime, o.ocena, o.datum, o.vrsta
FROM ocena o
JOIN predmet p ON o.id_predmet = p.id
JOIN ucenik u ON o.id_ucenik = u.id;

4. Приказати све оцене на писменим задацима из предмета првог разреда у читљивом


формату.
SELECT p.naziv, u.ime, u.prezime, o.ocena, o.datum, o.vrsta
FROM ocena o
JOIN predmet p ON o.id_predmet = p.id
JOIN ucenik u ON o.id_ucenik = u.id
WHERE p.razred = 1 AND vrsta = 'писмени задатак';

5. Приказати све парове близанаца (под близанцима ћемо подразумевати све парове
ученика који се исто презивају и имају исти датум рођења).
SELECT ucenik1.ime as ime1, ucenik2.ime as ime2, ucenik1.prezime
FROM ucenik as ucenik1
JOIN ucenik as ucenik2 ON ucenik1.datum_rodjenja=ucenik2.datum_rodjenja and
ucenik1.prezime=ucenik2.prezime
WHERE ucenik1.id<ucenik2.id;
6. Приказати све регулисане изостанке у читљивом формату (у ком се види име и презиме
ученика и датум, час и статус изостанка).

SELECT ucenik.ime,ucenik.prezime,datum,cas,status
FROM izostanak
JOIN ucenik ON izostanak.id_ucenik=ucenik.id
WHERE status="оправдан" or status="неоправдан";

7. За сваког ученика приказати списак предмета које похађа (свака врста треба да садржи име
и презиме ученика, разред и одељење у које иде и назив једног предмета).

SELECT ime,prezime,predmet.razred,odeljenje,predmet.naziv
FROM ucenik
JOIN predmet ON ucenik.razred=predmet.razred

8. Приказати просечне оцене из свих предмета из првог разреда.

SELECT naziv, round(AVG(ocena), 2) AS prosek


FROM ocena
JOIN predmet on ocena.id_predmet = predmet.id
WHERE predmet.razred = 1
GROUP BY predmet.id;

9. Приказати просечне оцене из свих предмета (уређене опадајуће по просечној


оцени).
SELECT naziv, round(AVG(ocena), 2) AS prosek
FROM ocena
JOIN predmet on ocena.id_predmet = predmet.id
GROUP BY predmet.id
ORDER BY prosek DESC;

10. Приказати називе предмета и просечне оцене на писменим задацима за све


предмете код којих је просечна оцена на писменим задацима бар 3,50.
SELECT naziv, round(AVG(ocena), 2) AS prosek
FROM ocena
JOIN predmet ON ocena.id_predmet = predmet.id
WHERE ocena.vrsta = 'писмени задатак'
GROUP BY predmet.id
HAVING prosek >= 3.50;
11. За свако одељење приказати укупан број неоправданих изостанака.

SELECT ucenik.razred, ucenik.odeljenje, count(izostanak.status) as


broj_izostanaka
FROM izostanak
JOIN ucenik ON izostanak.id_ucenik=ucenik.id
WHERE izostanak.status="неоправдан"
GROUP BY ucenik.razred, ucenik.odeljenje;

12. Приказати просечну оцену (заокружено на две децимале) из математике за свако одељење.

SELECT ucenik.razred,ucenik.odeljenje,round(avg(ocena),2) as prosek


FROM ocena
JOIN ucenik ON ocena.id_ucenik=ucenik.id
JOIN predmet ON ocena.id_predmet=predmet.id
WHERE predmet.naziv="Математика"
GROUP BY ucenik.razred,ucenik.odeljenje;

14. Приказати у читљивом формату све оцене на контролним вежбама ученика одељења I2.
Приказати име и презиме ученика, назив предмета, датум добијања оцене и оцену која је добијена.

SELECT ucenik.ime, ucenik.prezime, predmet.naziv, ocena.datum, ocena


FROM ocena
JOIN ucenik ON ocena.id_ucenik=ucenik.id
JOIN predmet ON ocena.id_predmet=predmet.id
WHERE ucenik.razred=1 and odeljenje=2 and vrsta="контролна вежба";

15. Приказати просечну оцену на сваком писменом задатку у сваком одељењу (рачунати само
писмене задатке које је истовремено радило бар 25 ученика). Приказати разред, одељење, назив
предмета, датум писменог, просечну оцену и број ученика који су радили писмени.

SELECT
ucenik.razred,ucenik.odeljenje,predmet.naziv,ocena.datum,round(avg(ocena),2)
as prosek,count(ucenik.id) as broj_ucenika
FROM ocena
JOIN ucenik ON ocena.id_ucenik=ucenik.id
JOIN predmet ON ocena.id_predmet=predmet.id
WHERE vrsta="писмени задатак"
GROUP BY ucenik.razred,ucenik.odeljenje,predmet.naziv
HAVING broj_ucenika >=25;
16. За сваки предмет приказати месечни преглед броја петица (списак уредити по називима
предмета у азбучном редоследу, а за сваки предмет, по месецима, растуће). Приказати назив
предмета, разред, месец и број петица.

SELECT predmet.naziv, ucenik.razred, strftime("%m",ocena.datum) as mesec,


count(ocena.id) as broj
FROM ocena
JOIN ucenik ON ocena.id_ucenik=ucenik.id
JOIN predmet ON ocena.id_predmet=predmet.id
WHERE ocena=5
GROUP BY predmet.naziv,mesec, ucenik.razred
ORDER BY predmet.naziv, mesec asc;

17. Ситуација је алармантна када ученици неког одељења у неком месецу направе 5 или више
неоправданих изостанака. Приказати све такве случајеве. Приказати разред, одељење, месец и број
неоправданих изостанака.

SELECT ucenik.razred, ucenik.odeljenje, strftime("%m",datum) as mesec,


count(izostanak.id) as broj
FROM izostanak
JOIN ucenik ON izostanak.id_ucenik=ucenik.id
WHERE status="неоправдан"
GROUP BY ucenik.razred, ucenik.odeljenje,mesec
HAVING broj>=5;

18. За сваког ученика приказати просечну оцену из сваког предмета за који је добио бар две
оцене (приказати имена и презимена ученика, називе предмета и просечне оцене заокружене на
две децимале).

SELECT ucenik.ime, ucenik.prezime,predmet.naziv,round(avg(ocena),2) as prosek


FROM ocena
JOIN ucenik ON ocena.id_ucenik=ucenik.id
JOIN predmet ON ocena.id_predmet=predmet.id
GROUP BY ucenik.id, predmet.id
HAVING count(ocena.id)>=2;
19. Приказати број оцена из сваког предмета, укључујући и оне предмете из којих не постоји ни
једна оцена. Резултат сортирати опадајуће по броју оцена. Приказати назив предмета, разред и
број оцена.

SELECT predmet.naziv, predmet.razred, count(ocena.id) as broj_ocena


FROM ocena
LEFT JOIN predmet ON ocena.id_predmet=predmet.id
GROUP BY predmet.id
ORDER BY broj_ocena desc;

20. За сваког ученика приказати број оцена из рачунарства и информатике (за ученике који нису
још добили оцене из тог предмета приказати нулу).

SELECT ucenik.ime, ucenik.prezime,count(ocena.id) as broj_ocena


FROM ocena
LEFT JOIN ucenik ON ocena.id_ucenik=ucenik.id
LEFT JOIN predmet ON ocena.id_predmet=predmet.id
WHERE naziv="Рачунарство и информатика"
GROUP BY ucenik.id;

You might also like