SQL – GROUP BY

As funções de agregação, em SQL, podem ser utilizadas com a instrução GROUP BY para agruparmos seus resultados.

O GROUP BY é utilizado em conjunto com as funções de agregação para agrupar seu ResultSet por uma ou mais colunas.

Sintaxe:


SELECT nome_coluna, funcao_de_agregacao(nome_coluna2)
FROM tabela
WHERE nome_coluna operador valor
GROUP BY nome_coluna

Exemplo:

Temos a seguinte tabela de ‘compra’:

id data preco cliente
1 2011/11/12 1000 Hallan
2 2011/10/23 1600 João
3 2011/09/02 700 Hallan
4 2011/09/03 300 Hallan
5 2011/08/30 2000 Pedro
6 2011/10/04 100 João

Agora, queremos a soma das compras (coluna preco) de cada cliente.

Devemos utilizar o GROUP BY para agrupar os clientes.

Utilizaremos, então, a seguinte instrução:


SELECT cliente, SUM(preco) FROM compra GROUP BY cliente;

O ResultSet, para a instrução acima, será:

cliente SUM(preco)
Hallan 2000
João 1700
Pedro 2000

Percebemos então que o GROUP BY deve ser utilizado sempre que queremos utilizar uma função de agregação para trazer um valor (no exemplo, a coluna preco) com alguma outra coluna onde não efetuamos nenhuma operação (no exemplo, a coluna cliente).

Um exemplo mais complexo

Veja a tabela ‘pessoa’:

id sobrenome nome endereco cidade
1 Silva Luis Rua Lauro Florianopolis
2 Souza Pedro Rua Schmidt Rio de Janeiro
3 Santos João Rua Nono São Paulo
4 Alves Silvano Rua Margarida Salvador
5 Souza Jack Rua das Araras Florianopolis

Temos também uma outra tabela, chamada ‘venda’:

id data id_pessoa
1 2011/11/12 3
2 2011/10/10 3
3 2011/09/08 1
4 2011/07/22 1
5 2011/08/30 5

Lembrando que a coluna id_pessoa da tabela venda é chave estrangeira para a a coluna id da tabela ‘pessoa’.

Temos também uma terceira tabela, chamada ‘venda_produtos’:

id produto valor id_venda
1 Agua 1000 1
2 Arroz 2000 1
3 Agua 1500 2
4 Fruta 3000 3
5 Feijão 500 5

A coluna id_venda é chave estrangeira para a a coluna id da tabela ‘venda’.

Desta forma, temos um relacionamento entre a tabela de venda_produto e a tabela de venda.

Queremos, agora, recuperar o nome e o sobrenome de cada pessoa e a soma (do valor) das vendas relacionadas a ela.

Devemos, então, utilizar a seguinte instrução:


SELECT pessoa.nome, pessoa.sobrenome, SUM(venda_produto.valor)
FROM pessoa
JOIN venda on venda.id_pessoa = pessoa.id
JOIN venda_produto on venda_produto.id_venda = venda.id
GROUP BY pessoa.nome, pessoa.sobrenome

O ResultSet da instrução acima será:

Nome Sobrenome SUM
João Santos 4500
Luis Silva 3000
Jack Souza 500

 

Neste exemplo, primeiramente, foi necessário efetuar uma junção (JOIN) entre as três tabelas relacionadas, pois os valores solicitados (nome, sobrenome e soma das vendas) se encontravam em tabelas diferentes.

Por ter utilizado uma função de agregação (SUM), foi necessário agrupar o restante das colunas, para obtermos a soma das vendas agrupadas por pessoa.

Referência: http://www.w3schools.com/sql/sql_groupby.asp

Deixe um Comentário

4 Comentários.

  1. Bom exemplo. Outro exemplo poderia ser o GROUP BY no nome do cliente e no nome do bairro, onde agruparia os nomes daquele bairro específico.

    Exemplo:

    Adilson Ilha da Figueira
    Adilson Velha

    Query:

    SELECT cliNom FROM cliente GROUP BY cliNom, baiNom

  2. qual a diferença entre o where e o having no sql?

    • O WHERE serve para filtros condicionais (onde isto é igual a aquilo, etc).
      O HAVING somente pode ser utilizado com o GROUP BY, e serve para filtros onde o WHERE não pode ser utilizado, como por exemplo funções agregadas.
      Exemplo:
      SELECT coluna_1, sum(coluna_2)
      FROM tabla
      WHERE coluna_1 = ‘%exemplo%’
      GROUP BY coluna_1
      HAVING sum(coluna_2) > 100

      Ou seja, o HAVING pode fazer um filtro no resultado da soma (função agregada).

      Espero ter ajudado.

      Abraço

  3. Muito bom, estou sob pressão no meu trabalho, vou usar amanhã um join com agupamento.Este exemplo vai ajudar muito.

    Obrigato!

Deixe um Comentário


NOTA - Você pode usar estesHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>