A instrução GROUP BY identifica uma coluna selecionada a ser usada para agrupar os resultados.
Separa os dados em grupos pelos valores da coluna especificada e retorna uma linha de resultados para cada grupo.
Você pode usar GROUP BY com mais de um nome de coluna (separe os nomes de coluna com vírgulas).
Sempre coloque GROUP BY depois de FROM e WHERE em uma consulta e antes de HAVING e ORDER BY.
Todas as colunas selecionadas sem uma agregação associada devem aparecer na cláusula GROUP BY.
O GROUP BY acumula resultados por grupo, mas não necessariamente ordena os grupos;
é necessária uma instrução ORDER BY para fazer isso.
Ao recuperar múltiplas linhas de uma tabela, as cláusulas GROUP BY, HAVING e ORDER BY podem ser usadas para indicar:
- Como você deseja que as linhas sejam agrupadas (GROUP BY)
- Uma condição que as linhas, como um grupo, devem atender (HAVING)
- A ordem na qual você deseja que as linhas sejam retornadas a você (ORDER BY)
Por exemplo, a consulta a seguir seleciona o salário médio para cada departamento:
SELECT DEPT
, AVG(SALARY)
FROM Q.STAFF
GROUP BY DEPT
Essa consulta produz o seguinte relatório:
DEPT COL1
------ ------------------
10 20865.8625000000
15 15482.3325000000
20 16071.5250000000
38 15457.1100000000
42 14592.2625000000
51 17218.1600000000
66 17215.2400000000
84 16536.7500000000
No exemplo acima, GROUP BY divide a tabela em grupos de linhas com o mesmo número de departamento e retorna uma linha de resultados para cada grupo.
A coluna DEPT pode ser selecionada sem uma função integrada porque ela é usada com o GROUP BY, e porque cada membro de cada grupo tem o mesmo
valor na coluna DEPT.
Todos os nomes de culna incluídos em uma cláusula do SELECT devem ter uma função integrada associada ou devem aparecer na cláusula GROUP BY.
Por exemplo, se o DEPT não for usado na cláusula GROUP BY, a lista de salários médios terá pouco significado.
A consulta a seguir está correta:
SELECT DEPT
, AVG(SALARY)
, JOB
FROM Q.STAFF
GROUP BY DEPT, JOB
A consulta a seguir está incorreta:
SELECT DEPT
, AVG(SALARY)
, JOB
FROM Q.STAFF
GROUP BY DEPT
Geralmente, o GROUP BY produz uma linha de um relatório para cada valor diferente da coluna especificada na cláusula GROUP BY.
Quando há várias colunas nomeadas na cláusula GROUP BY, uma nova linha é produzida no relatório toda vez que um valor em uma dessas colunas é alterado.
Entretanto, se houver valores nulos na coluna, cada valor nulo será tratado como um grupo separado, consistindo em um membro.
O uso de GROUP BY no SQL é uma alternativa ao uso do código de uso GROUP no formulário.
GROUP BY fornece uma extensão ao agrupamento que pode ser especificado no formulário e permite a seleção de dados condicional, que não pode ser feita no formulário.
Por exemplo, para ver o salário menor, maior e médio do total de salários do departamento:
- Escreva e execute esta consulta:
SELECT DEPT
, SUM(SALARY)
, SUM(SALARY)
, SUM(SALARY)
FROM Q.STAFF
GROUP BY DEPT
- Use esses códigos de uso no formulário:
NUM COLUMN HEADING USAGE
--- ----------------------------------- -------
1 DEPT
2 SUM(SALARY) MINIMUM
3 SUM(SALARY)1 AVERAGE
4 SUM(SALARY)2 MAXIMUM
O relatório contém quatro colunas, das quais as últimas três são quase idênticas.
Todas as três mostram o salário total de cada departamento mas a linha final mostra os totais mínimo, médio e máximo.
Exemplos adicionais:
- Para listar o menor e maior salário por cargo, para cada departamento, excluindo os gerentes, use uma consulta com a seguinte:
SELECT DEPT
, JOB
, MIN(SALARY)
, MAX(SALARY)
FROM Q.STAFF
WHERE JOB < > 'MGR'
GROUP BY DEPT, JOB
- Para listar o número de funcionários com esse número de anos e seus salários médios, para cada número de anos de serviço, use uma consulta como a seguinte:
SELECT YEARS
, COUNT(*)
, AVG(SALARY)
FROM Q.STAFF
GROUP BY YEARS
A palavra-chave HAVING deve ser usada com os dados agrupados.
Quando a instrução HAVING e a instrução GROUP BY forem ambas usadas, a instrução HAVING deverá vir após a instrução GROUP BY.
- Para listar o salário menor, maior e médio em cada departamento, excluindo os gerentes, para departamentos com uma média salarial maior do que $12.000, use
uma consulta como a seguinte:
SELECT DEPT
, MIN(SALARY)
, MAX(SALARY)
, AVG(SALARY)
FROM Q.STAFF
WHERE JOB < > 'MGR'
GROUP BY DEPT
HAVING AVG(SALARY) > 12000
- Para listar, para cada número de anos de serviço, o número de funcionários com aquele número de anos e seus salários médios, mas apenas para grupos com mais
de dois funcionários, use uma consulta como a seguinte:
SELECT YEARS, COUNT(*), AVG(SALARY)
FROM Q.STAFF
GROUP BY YEARS
HAVING COUNT(*) > 2
Veja também:
© Copyright IBM Corp.