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

SQL: usando TRANSFORM para agrupar também em colunas

Há situações em que o programador precisa não só obter informações agrupadas por linhas, mas também por colunas.  Veja por exemplo o caso de se querer exibir uma grade com a quantidade de vendas feitas por cada vendedor nos últimos anos. Para obter este resultado, uma consulta teria que gerar um registro contendo o vendedor e um campo para o total das vendas do vendedor em cada ano do período considerado. Veja abaixo como poderia ficar.

VENDEDOR 1999 2000 2001 2002
Ana Elisa Gonçalves 18.327,50 31.975,45 28.674,80 23.100,00
Carlos André Mattos 21.114,00 23.328,00 20.543,30 28.250,90
Renato Prado 33.179,00 20.956,34 35.490,00 27.600,00
Rosa Figueira Sanches 19.326,00 19.885,00 25.546,00 32.822,00

Usando o comando Transform do Access SQL, podemos obter o resultado acima. Veja a sintaxe de uma consulta que retornaria um recordset conforme o que está exibido na tabela acima:

Transform SUM(VxV.Valor)  

SELECT V.Vendedor From Vendedores As V Inner Join VendasXVendedor As VxV  ON V.CodVendedor = VxV.CodVendedor  GROUP BY V.Vendedor  

PIVOT  Year(VxV.DataVenda) IN (1999, 2000, 2001, 2002)

O comando Transform agrupa os valores da função agregada SUM (VxV,Valor) por vendedor conforme informado na cláusula GROUP BY do SELECT, mas também agrupa em colunas pelo valor Year(VxV.DataVenda) que está contido após a cláusula PIVOT. A cláusula PIVOT não precisa ser seguida da lista contida após a palavra chave IN, mas se houver uma lista, os agrupamentos em colunas serão feitos para os casos em que o valor do campo informado na cláusula PIVOT estiver presente na lista e, no caso de não haver nenhuma ocorrência de um dos valores da lista, mesmo assim será gerada uma coluna (campo) no registro relativa àquele valor da lista. Assim, se nenhum vendedor tivesse tido alguma venda em 2002, mesmo assim seria gerada uma coluna com valores nulos para cada registro intitulada '2002'.