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