Si trabajáis normalmente con datos seguro que habéis necesitado crear alguna vez una consulta que devuelva una tabla con datos cruzados «Transformar filas en Columnas».
En SQL 2005 tenemos una función llamada PIVOT que intenta recuperar la funcionalidad de MS Access TRANSFORM pero nos encontramos con un gran inconveniente, tenemos que conocer el nombre de las nuevas columnas que queremos recuperar.
Por ejemplo tenemos este código sacado de un artículo de Sebastian Contente…
SELECT Vendedor,isnull([Perfumes],0) as Cremas ,isnull([Desodorantes],0) as Desodorantes,
isnull([Cremas],0) as Perfumes
/*Select que define como se mostraran los tados y por que columna se agrupara (Vendedor)*/
FROM
( … ) po
/*Origen de los Datos*/
PIVOT
(
SUM(cantidad)
FOR Rubro IN
([Cremas] , [Perfumes] , [DEsodorantes])
) AS PVT
Podéis comprobar que utiliza PIVOT para recuperar tres nuevas columnas por cada tipo de producto y filtrado por vendedor sumando la cantidad a mostrar.
Pero Claro Tenemos que saber que existen estos registros para formar las nuevas columnas!!!
Que opciones tenemos para poder generar estas nuevas columnas dinámicamente?, bueno por Internet podemos encontrar varias formas y os recomiendo personalmente este artículo para sacarnos de dudas.
Este crack hasta ha hecho una aplicación para probar el rendimiento de las dos opciones y ha sacado esta conclusión.
Beginning performance test for crosstab techniques.
Please enter the # of iterations to perform:
75
Testing dynamic SQL crosstab procedure….
— Result: 25 seconds.
Testing static SQL crosstab procedure….
— Result: 22 seconds.
Testing C# crosstab transformation….
— Result: 8 seconds.
Testing complete.
Esta clarísimo cual es la forma más óptima para poder utilizar Crosstabs en nuestras aplicaciones y con un par de cambios podemos poner la función en nuestro DAL para reutilizarla fácilmente.
Bueno en definitiva si podéis pasaros por Jeff’s SQL Server Blog que es totalmente recomendable.
Saludos.