Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

SQL: usando Having para agrupar com mais critério

Embora a linguagem SQL não seja um bicho de sete cabeças, muitos programadores têm dificuldades em usar recursos comuns desta linguagem e até mesmo deixam passar desapercebidas por anos algumas facilidades que estão ao seu alcance. Por esta razão, é sempre bom lembrar de alguns recursos da linguagem SQL que ficam esquecidos por muitos. Um destes recursos é a cláusula HAVING, que é usada em combinação com a cláusula GROUP BY. A cláusula GROUP BY nos permite criar consultas que retornam alguns campos pelos quais queremos agrupar valores e também os totais resultantes do agrupamento. Para gerar os totais usamos funções agregadas da linguagem SQL, tais como SUM, MAX, MIN, AVG, COUNT e outras expressões aritméticas aceitas. A cláusula GROUP BY apenas cuida dos campos pelos quais será feito o agrupamento, mas não dos critérios de filtragem dos registros a serem considerados para o agrupamento. Os critérios para selecionar os registros a serem considerados são postos  na cláusula WHERE. Os critérios da cláusula WHERE são examinados antes de se dar o agrupamento. Há situações, porém, em que não só queremos poder filtrar os registros que serão considerados no agrupamento, mas também filtrar certos grupos baseando-nos nos valores dos totais gerados para cada grupo. Isto pode ser feito usando-se a cláusula HAVING. Esta cláusula nos permite informar critérios de filtragem baseados nos valores das próprias totalizações geradas para os grupos. Os critérios de filtragem da cláusula HAVING são aplicados após os agrupamentos terem sido feitos. A cláusula HAVING vem sempre após a cláusula GROUP BY e usa , em seus critérios, expressões que aparecem no SELECT para gerar os totais dos grupos. Veja um exemplo:

SELECT SUM(ValorTotaldoPedido) As BaseParaPremiacao, CodVendedor FROM Pedidos WHERE DataPedido BETWEEN #12/01/2002# AND #12/31/2002# GROUP BY CodVendedor HAVING SUM(ValorTotaldoPedido) > 10000.00

A consulta acima retorna um conjunto de registros relativos ao mes de dezembro de 2002 que contém o total dos pedidos para cada vendedor -  SUM(ValorTotaldoPedido) As BaseParaPremiacao - e mais o código do vendedor. Porém, como se trata de uma consulta para determinar quais vendedores merecem ser premiados, neste conjunto só estarão incluídos os vendedores que atendam ao critério para premiação. O critério para premiação é : vendedores com total de pedidos maior que R$ 10.000,00 e está expresso na cláusula HAVING na forma SUM(ValorTotaldoPedido) > 10000.00. A expressão SUM(ValorTotaldoPedido)  soma os valores totais de pedidos por CodVendedor e gera um total para cada CodVendedor. Mas, na cláusula HAVING estamos selecionando apenas os registros em que o total do vendedor seja maior que R$ 10.000,00.