Sunteți pe pagina 1din 6

GRUPAREA DATELOR

Functii de grup

Functiile de grup returneaza o singura valoare pentru un grup sau set de linii dintr-un tabel. Putem
calcula astfel cea mai mare valoare dintr-un set de valori, putem determina numarul de inregistrari
ce respecta o anumita conditie.

TABELA VOTURI

JUDET CANDIDAT NUMAR_VOTURI


B 1 347016
B 2 1552
B 3 1374
IS 1 196508
IS 2 1038
IS 3 65084
SB 1 65084
SB 2 561
SB 3 533
B 4 96744
B 5 25656
B 6 13361
IS 4 35784
IS 5 5558
IS 6 4094
SB 4 19937
SB 5 4323
SB 6 2366
B 7 25937
B 8 4619
B 9 4323
IS 7 3684
IS 8 1291
IS 9 327
SB 7 4225
SB 8 765
SB 9 3797
B 10 2037
B 11 22687
B 12 514366
IS 10 1312
IS 11 3781
IS 12 12184
SB 10 660
SB 11 3768
SB 12 105993
SB 13 100
B 13
IS 13

TABELA JUDETE

COD_JUDET JUDET NUMAR_ALEGATORI


B BUCURESTI 1750192
IS IASI 650029
SB SIBIU 363380

Funcia COUNT(X)-determina numarul de valori ale lui x. Functia ignora campurile care sunt nule.

Ex: select COUNT(judet), COUNT(numar_voturi)

from voturi

COUNT(JUDET) COUNT(NUMAR_VOTURI)
39 37

Functia COUNT poate fi folosita si in combinatie cu clauza DISTINCT, pentru a numara doar valoarile
distincte dintr-un domeniu.

Ex: select COUNT(distinct judet)

from voturi

COUNT(DISTINCTJUDET)
3

Ex: select COUNT(distinct judet), count(candidat)

from voturi

COUNT(DISTINCT CANDIDAT) COUNT(CANDIDAT)


13 39

Functia MAX(X)-determina valoarea maxima a valorilor expresiei x.

Ex: select max(numar_voturi)

from voturi

MAX(NUMAR_VOTURI)
514366
Ex: select max(100*numar_voturi/numar_alegatori)

from voturi v, judete j

where v.judet=j.cod_judet

MAX(100*NUMAR_VOTURI/NUMAR_ALEGATORI)
30,23065125
Am obtinut astfel cel mai mare procent obtinut de un candidat intr-un judet. Pentru a afisa si
candidatul si judetul folosim comanda:

select 100*numar_voturi/numar_alegatori, j.judet, v.candidat

from voturi v, judete j

where v.judet=j.cod_judet

100*NUMAR_VOTURI/NUMAR_ALEGATORI JUDET CANDIDAT


19,82731038 BUCURESTI 1
0,088675985 BUCURESTI 2
0,078505673 BUCURESTI 3
30,23065125 IASI 1
0,159685183 IASI 2
10,01247637 IASI 3
17,91072706 SIBIU 1
0,154383841 SIBIU 2
0,146678408 SIBIU 3
5,527622112 BUCURESTI 4
1,465896313 BUCURESTI 5
0,763401958 BUCURESTI 6
5,504985162 IASI 4
0,855038775 IASI 5
0,629818054 IASI 6
5,486543013 SIBIU 4
1,189663713 SIBIU 5
0,651109032 SIBIU 6
1,481951694 BUCURESTI 7
0,263913902 BUCURESTI 8
0,247001472 BUCURESTI 9
0,566743945 IASI 7
0,198606524 IASI 8
0,050305448 IASI 9
1,1626947 SIBIU 7
0,210523419 SIBIU 8
1,044911663 SIBIU 9
0,116387231 BUCURESTI 10
1,296257782 BUCURESTI 11
29,38911845 BUCURESTI 12
0,201837149 IASI 10
0,581666356 IASI 11
1,874377912 IASI 12
0,181628048 SIBIU 10
1,036931036 SIBIU 11
29,16863889 SIBIU 12
0,027519401 SIBIU 13
BUCURESTI 13
IASI 13
Functia MIN(X)-determina valoarea minima a valorilor expresiei x.

Functia SUM(X)-determina suma valorilor expresiei x.

Pentru a afla numarul total de voturi valabil exprimate in judetul Sibiu vom scrie comanda:

select sum(numar_voturi)

from voturi

where judet='SB'

SUM(NUMAR_VOTURI)
212112
Functia AVG(x)-determina media valorilor expresiei x.

Vom afla procentul mediu obtinut de un candidat in toate judetele.

select avg(100*numar_voturi/numar_alegatori)

from voturi v,judete j

where (candidat=12) and (v.judet=j.cod_judet)

AVG(100*NUMAR_VOTURI/NUMAR_ALEGATORI)
20,14404508
Pentru candidatul 13 avem urmatoarea situatie:

select avg(numar_voturi)

from voturi

where (candidat=13)

AVG(NUMAR_VOTURI)
100
Pentru a lua in calcul cele trei linii cu inregistrarile candidatului 13 introducem comanda:

select avg(NVL(numar_voturi,0))

from voturi

where (candidat=13)
AVG(NVL(NUMAR_VOTURI,0))
33,33333333

Gruparea datelor. Clauza GROUP BY

Daca dorim sa calculam numarul total de voturi obtinut de fiecare candidat in toata tara, cu ce am
studiat pana acum putem proceda astfel:

select sum(numar_voturi)

from voturi

where (candidat=1)

SUM(NUMAR_VOTURI)
608608
select candidat, sum(numar_voturi) AS "TOTAL VOTURI"

from voturi

GROUP BY candidat

CANDIDAT TOTAL
VOTURI
1 608608
6 19821
11 30236
13 100
2 3151
4 152465
5 35537
8 6675
3 66991
7 33846
9 8447
10 4009
12 632543
Procentul mediu obtinut de catre fiecare candidat:

select candidat, avg(100*numar_voturi/numar_alegatori) AS "TOTAL


VOTURI"

from voturi v, judete j

where v.judet=j.cod_judet

GROUP BY candidat

CANDIDAT TOTAL
VOTURI
1 22,65622956
6 0,681443015
11 0,971618392
13 0,027519401
2 0,134248336
4 5,506383429
5 1,1701996
8 0,224347948
3 3,412553482
7 1,070463446
9 0,447406194
10 0,166617476
12 20,14404508

Reguli de folosire a clauzei GROUP BY

1. In clauza GROUP BY nu se accepta aliasele coloanelor


2. Toate campurile care apar in SELECT in afara functiilor de grup trebuie sa apara in clauza
GROUP BY
3. Nu se pot folosi functii de grup in clauza WHERE
Ex: SELECT * from voturi
WHERE numar_voturi=max(numar_voturi)
Se va afisa o eroare. Pentru a rezolva aceasta problema se va folosi o subinterogare:
select * from voturi
where numar_voturi=(select max(numar_voturi) from voturi)

JUDET CANDIDAT NUMAR_VOTURI


B 12 514366
4. In clauza GROUP BY pot sa apara si alte coloane care nu apar in SELECT
SELECT max(salriu) from ANGAJATI
GROUP BY departamente
5. Functiile de grup pot fi imbricate pentru a determina cel mai mare numar total de voturi
obtinute de catre un candidat
select max(sum(numar_voturi)) from voturi
group by candidat

MAX(SUM(NUMAR_VOTURI))
632543

S-ar putea să vă placă și