DB2 - Banco de dados - Instruções e Funções Básicas - GROUP BY


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

GROUP BY

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:

  1. Escreva e execute esta consulta:
    
       SELECT DEPT
       ,      SUM(SALARY)
       ,      SUM(SALARY)
       ,      SUM(SALARY)
       FROM   Q.STAFF
       GROUP  BY DEPT
  2. 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:

  1. 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
  2. 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.

  3. 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
  4. 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.