Садржај
2.8 SQL: Сложенији угњеждени упити - Додатно
3.0 SQL: Промена садржаја базе
3.2 SQL: Ажурирање података у табелама
3.3 SQL: Брисање података из табела
6.0 Библиотека Flask - пројектни задатак

Груписање и израчунавање статистика појединачних група (GROUP BY)

У претходном поглављу смо видели како агрегатне функције могу да се примене на филтриране податке (податке који задовољавају неки услов). Видели смо, на пример, како можемо да израчунамо укупан фонд часова предмета у првом разреду или како можемо да одредимо просек свих датих оцена из неког појединачног предмета. Често се јавља потреба да се иста врста упита понови за сваку вредност у некој колони. На пример, сасвим је природно пожелети да се одреди фонд часова предмета не само у првом, већ у сваком од четири разреда, или да се израчуна просечна оцена из сваког појединачног предмета. Уместо да се поставља више сродних упита, овакве статистике је могуће израчунати коришћењем груписања и израчунавања статистика по групама. У језику SQL се за то користи клаузула GROUP BY. Прикажимо њену употребу на неколико примера.

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

SELECT razred, SUM(fond) as fond_casova
FROM predmet
GROUP BY razred;

Извршавањем упита добија се следећи резултат:

razred

fond_casova

1

33

2

33

3

31

4

33

Извршавање овог упита можемо себи да представимо на следећи начин.

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

  • Агрегатна функција SUM се примени засебно на сваку групу.

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

Груписање и израчунавање збира елемената сваке групе

У примеру приказаном на слици се добијају 4 групе, од којих свака одговара по једном разреду.

Напоменимо да СУБП, може ради постизања веће ефикасности, да ове операције извршава и другачијим редоследом, али резултат мора да буде исти као када се рачунање обавља онако како је овде описано. На пример, могуће је да се формирање група и рачунање збирова по групама извршава једновремено (користећи по потреби и неке напредније структуре података).


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

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

Извршавањем упита добија се следећи резултат:

id_predmet

min_ocena

1

1

2

1

3

2

4

1

5

1

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

Груписање може да се изврши и по вредности н-торке колона.


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

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

Извршавањем упита добија се следећи резултат:

razred

odeljenje

broj_ucenika

1

1

28

1

2

33

1

3

29

2

1

32

2

2

26

У овом случају се за сваки пар вредности (razred, odeljenje) креира посебна група врста и затим се одреди број елемената (врста) у свакој од тих група.

Груписање и израчунавање статистика по групама може да се обави и након филтрирања (тј. селекције неких врста).


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

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

Извршавањем упита добија се следећи резултат:

razred

broj_devojcica

1

56

2

51

3

34

4

44

У овом упиту се из табеле ученика бирају само оне врсте које описују девојчице (код којих је вредност у колони pol једнака ж), а затим се те врсте групишу у четири групе на основу разреда и затим се одређује број елемената у свакој од те четири групе.

Груписани резултати се могу сортирати, може се ограничавати број врста у резултату и слично.

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

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

Извршавањем упита добија се следећи резултат:

prezime

broj_ucenika

Милић

8

Цветковић

7

Ристић

7

Вежба

Покушај да самостално напишеш наредних неколико упита. Решења можеш да тестираш овде, а можеш све задатке да урадиш и у систему SQLite Studio.

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



Прикажи највећи фонд часова неког предмета за сваки од разреда (приказати редни број разреда и максимални фонд у колони под називом najveci_fond).



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



(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+