SQL em Oracle > DML > Funções > Funções de grupo > A cláusula GROUP BY
A cláusula GROUP BY tl_logo2.jpg

A cláusula GROUP BY é usada para agrupar (ou agregar) as linhas da tabela segundo um critério escolhido pelo utilizador, podendo depois ser aplicada uma função de grupo a cada um dos grupos. Usando GROUP BY não é possível seleccionar linhas individuais.

O exemplo abaixo determina o salário médio de cada função (JOB):

select job, avg(sal)
from emp
group by job;
JOB       AVG(SAL)               
--------- ---------------------- 
CLERK     1037,5                 
SALESMAN  1400                   
PRESIDENT 5000                   
MANAGER   2758,333333333333333333333333333333333333 
ANALYST   3000                   

5 rows selected

É possível contar o número de linhas que cada grupo contém. Por exemplo, quantas pessoas há em cada função?

select job, count(*)
from emp
group by job;
JOB       COUNT(*)               
--------- ---------------------- 
CLERK     4                      
SALESMAN  4                      
PRESIDENT 1                      
MANAGER   3                      
ANALYST   2                      

5 rows selected

As duas consultas anteriores podem ser fundidas. Nesse caso pretendemos saber qual o salário médio de cada função e quantas pessoas nela trabalham:

select job, avg(sal), count(*)
from emp
group by job;
JOB       AVG(SAL)                                  COUNT(*)               
--------- ----------------------------------------- ---------------------- 
CLERK     1037,5                                    4                      
SALESMAN  1400                                      4                      
PRESIDENT 5000                                      1                      
MANAGER   2758,333333333333333333333333333333333333 3                      
ANALYST   3000                                      2                      

5 rows selected

Utilizando a cláusula WHERE podem-se excluir linhas antes de as dividir em grupos. Por exemplo apresentar o salário médio de cada função (job) excluindo os MANAGER:

select job, avg(sal), count(*)
from emp
where job != 'MANAGER'
group by job;
JOB       AVG(SAL)               COUNT(*)               
--------- ---------------------- ---------------------- 
CLERK     1037,5                 4                      
SALESMAN  1400                   4                      
PRESIDENT 5000                   1                      
ANALYST   3000                   2                      

4 rows selected

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-02-26