Este documento apresenta exemplos de consultas SQL utilizando as cláusulas GROUP BY e HAVING. GROUP BY agrupa os registros por coluna(s) especificada(s) para gerar estatísticas de resumo. HAVING filtra esses grupos de acordo com condições, assim como WHERE filtra linhas. Os exemplos mostram como contar vendas por vendedor, encontrar as menores e maiores vendas, médias por data, e selecionar vendedores com mais de 2 vendas em datas específicas.
1. 4) Quantas vendas cada vendedor fez?
SELECT vendedor, COUNT(*) FROM vendas GROUP BY vendedor;
5) Qual a menor e a maior venda?
SELECT min(valor), MAX(valor) FROM vendas;
6) Qual a menor e a maior venda de cada vendedor?
SELECT vendedor, MIN(valor), MAX(valor) FROM vendas GROUP BY vendedor;
7) Qual a média das vendas dos dias 15 e 17?
SELECT data, AVG(valor) FROM vendas
WHERE data IN ('2008-04-15', '2008-04-17')
GROUP BY data;
8) Em quais dias as vendas superaram 3.000?
SELECT data, SUM(valor) FROM vendas
GROUP BY data HAVING SUM(valor) >3000;
9)Em quais dias, no período de 14 a 16/04/2008, a média das vendas foi menor que
2000?
SELECT data, AVG(valor) FROM vendas
WHERE data BETWEEN '2008-04-14' AND '2008-04-16'
GROUP BY data HAVING AVG(valor) <2000;
10)Que vendedores fecharam mais de 2 vendas nos dias 14, 16 e 18/04/2008?
SELECT vendedor, COUNT(*) FROM vendas
WHERE data IN ('2008-04-14', '2008-04-16', '2008-04-18')
GROUP BY vendedor HAVING COUNT(*) >2;
2. GROUP BY e HAVING
A instrução SELECT possui duas cláusulas poderosas, pouco compreendidas e usadas:
GROUP BY e HAVING.
A cláusula GROUP BY organiza dados em grupos, produzindo sumários. A cláusula
HAVING estabelece condições para listar esses grupos. Dizemos que a cláusula
HAVING está para a cláusula GROUP BY, assim como a cláusula WHERE está para o
comando SELECT.
A sintaxe do comando SELECT com as cláusulas GROUP BY e HAVING é:
SELECT <coluna(s)>
FROM <tabela>
WHERE <condições>
GROUP BY <coluna(s)>
HAVING <condições>
Exemplo:
Crie a seguinte tabela a seguir:
VENDEDOR DATA VALOR
Fulano 14/04/2009 600
Fulano 16/04/2009 1000
Fulano 18/04/2009 800
Beltrano 15/04/2009 1200
Beltrano 17/04/2009 1600
Cicrano 14/04/2009 1000
Cicrano 16/04/2009 1200
Cicrano 17/04/2009 1600
Cicrano 18/04/2009 1400
Cicrano 15/04/2009 1800
1) Qual o total das vendas?
SELECT SUM(valor) FROM vendas;
2) Qual o total das vendas de cada vendedor?
SELECT vendedor, SUM(valor) FROM vendas GROUP BY vendedor;
3) Quantas vendas foram feitas?
SELECT COUNT(*) FROM vendas;