SQL em Oracle > DML > Funções > Funções de grupo > Cuidados com funções de grupo e cláusula GROUP BY
Cuidados com funções de grupo e cláusula GROUP BY |
|
Se uma consulta utiliza funções de grupo e/ou a cláusula GROUP BY então
entra em "modo de grupo" o que significa que na clausula SELECT o utilizador
apenas pode utilizar funções de grupo ou colunas que também tenham sido
incluídas na clausula GROUP BY. Isto porque não se podem misturar resultados
individuais com resultados de grupo.
Suponha que quer determinar o maior salário de cada departamento usando
o a consulta abaixo:
select ename, job, max(sal)
from emp
group by job;
|
select ename, job, max(sal)
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
|
- Obtem um erro porque o query usa GROUP BY e nessa clausula
não foi colocada a coluna ENAME;
- A coluna ENAME devolve um valor para cada linha da tabela. A função
MAX(SAL) conjugada com a coluna JOB, que foi colocada na clásula
GROUP BY, vai devolver o salário máximo de cada grupo de empregados
que executam a mesma função (JOB). Isto agrupa as linhas em conjuntos e
devolve uma linha para cada conjunto, o que é um modo de funcionamento
incompatível com a devolução de todas as linhas;
- Isto criou um conflito entre o "modo de linha" e o
"modo de grupo". Para o corrigir temos que retirar a
coluna ENAME;
Suponha que quer determinar o menor salário da tabela e o respectivo
departamento:
select deptno, min(sal) from emp;
|
select deptno, min(sal) from emp
*
ERROR at line 1:
ORA-00937: not a single-group group function
|
- A função MIN(SAL) vai determinar o menor salário para toda a tabela;
- A coluna DEPTNO devolve o número de departamento de cada empregado da
tabela;
- Novamente temos um conflito entre o "modo de linha" e o #modo de grupo"
que só pode ser resolvido eliminando a coluna DEPTNO;
- O problema proposto será resolvido recorrendo a uma subconsulta;
Topo
Realizado por Turtle Learning ®. Última alteração em 2011-02-26