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
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
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
Muito bom, estou sob pressão no meu trabalho, vou usar amanhã um join com agupamento.Este exemplo vai ajudar muito.
Obrigato!
Olá pessoal, estou precisando muito da ajuda de vcs, vendo o exemplo acima da tabela de compra, precisaria obter o prazo medio que cada um compra, nao sei como fazer isso, ja tentei de tudosem sucesso.