Uma característica muito importante do SQL é o poder de agrupar linhas com base em valores de determinadas colunas. Dessa forma, não estaremos trabalhando na pesquisa em todas as linhas da tabela, como fizemos anteriormente, mas sim em grupos menores. Para isso, utilizamos as funções de grupo já mostradas, com a cláusula GRUPO BY no comando SELECT. A cláusula GRUPO BY  deve vir antes da cláusula ORDER BY  e depois do WHERE (se houver necessidade de utilizá-los).

            Como exemplo, podemos querer saber quantos pedidos foram vendidos, para isso iremos fazer a busca na tabela pedido e agrupar por CODVENDA:

 

SELECT CODVENDA, COUNT(*) FROM PEDIDO

GRUPO BY CODVENDA;

 

            Para sabermos quanto um determinado cliente nos comprou, precisamos agrupar por CODCLIENTE,  veja como fica essa instrução:

 

SELECT CODCLIENTE, SUM(TOTALPEDIDO) FROM PEDIDO

GROUP BY CODCLIENTE;

 

 

Podemos realizar mais de uma função de grupo dentro de um mesmo SELECT. Aqui, além da média do preço de venda, temos a quantidade de registros da tabela PEDIDO.

 

SELECT CODVENDA, AVG(PRECOVENDA), COUNT(*) FROM PEDIDO

GROUP BY CODVENDA;

 

 

Agrupamento com mais de uma tabela

 

            Podemos unir mais de uma tabela seguindo as mesmas regras vistas anteriormente, veja o exemplo a seguir:

 

SELECT PEDIDO.CODVENDA, PEDIDO.CODCLIENTE, CLIENTE.NOME, SUM(TOTALPEDIDO) FROM PEDIDO, CLIENTE

WHERE PEDIDO.CODCLIENTE = CLIENTE.CODCLIENTE

GROUP BY PEDIDO.CODVENDA, PEDIDO.CODCLIENTE, CLIENTE.NOME;

 

Obs.: Devemos colocar todas as colunas que fazem parte do comando SELECT na cláusula GROUP BY, exceto, naturalmente, a função de grupo. Adote isso como regra para evitar problemas com o comando. Não é obrigatório, contudo, a utilização de colunas da cláusula GROUP BY no comando SELECT. De qualquer forma, é aconselhável utilizar a coluna no comando SELECT para facilitar o entendimento do resultado da busca. Dessa forma, o comando a seguir é válido:

 

SELECT AVG(PRECOVENDA), COUNT(*) FROM PEDIDO

GROUP BY CODVENDA;

 

Restrigindo resultados

            Os resultados dos dados agrupados podem ser restritos. Até agora foi visto que toda a tabela era afetada pelo comando GROUP BY. Contudo, nem sempre isso é desejável. Há duas maneiras de fazer isto: uma é utilizar a cláusula WHERE em conjunto com o GROUP BY; a outra é utilizar HAVING. Veja no exemplo a seguir como fica:

 

Queremos saber o total de cliente, que o preço de venda foi inferior a 15:

 

SELECT CODCLIENTE, COUNT(*) FROM PEDIDO

WHERE PRECOVENDA < 15

GROUP BY CODCLIENTE;

 

 

Podemos utilizar a cláusula HAVING após o GROUP BY, para obter o mesmo resultado. Assim:

 

SELECT CODCLIENTE, COUNT(*) FROM PEDIDO

GROUP BY CODCLIENTE

HAVING PRECOVENDA < 15;

 

 

Você deve estar pensando na diferença em se utilizar um ou outro comando. Na realidade, como se pode ver, o resultado final é exatamente igual. O tempo de execução também é igual. Mas há uma diferença básica entre os dois métodos:

            Ao utilizarmos a cláusula WHERE,  as linhas são filtradas antes do agrupamento. Ao utilizarmos o HAVING,  as linhas são filtradas depois do agrupamento.

 

Conversão de tipos de dados

            Frequentemente é necessário realizar uma conversão entre tipos de dados para determinadas situações. Para isso, utilizamos a função CAST.

            A media de preço de venda, utiliza diversas casas decimais. Seria desejável que aparecessem apenas duas casas decimais. Isso pode ser feito convertendo o resultado para o formato decimal e utilizando apenas 2 casas depois da vírgula. O comando ficaria assim:

 

SELECT CAST(AVG(PRECOVENDA) AS DECIMAL (10,2)) RESULTADO FROM PEDIDO;

 

            Há outras situações em que isso pode ser muito importante, como na conversão de alfanuméricos para data:

 

SELECT CAST(‘11/02/2009’ AS DATE) RESULTADO FROM PEDIDO;

 

            Podemos também converter alfanuméricos em numéricos:

 

SELECT CAST(‘12’ AS INTEGER) * 6 RESULTADO FROM PEDIDO;

 

Fico por aqui, no próximo artigo falarei de subquery, até lá.