Pivotar tablas en SQL Server

En muchas ocasiones necesitamos obtener resultados de una consulta para presentar datos agregados a partir de ella. Pensemos por ejemplo en una típica tabla de artículos y en otra de compras relacionadas con dichos artículos, indicando las unidades compradas por meses. Creamos dichas tablas y nuestro objetivo será consultar las compras realizadas por meses de esos artículos:



Ahora vamos a insertar algunos registros de ejemplo para probar luego el efecto del PIVOT:



La sentencia que nos interesa sería algo como ésto:
SELECT * FROM COMPRAS PIVOT (SUM(unidades) FOR MES IN ([201201],[201202],[201203])) pvt

Y el resultado es el esperado: agrupación por artículo, obteniendo en columnas por meses la suma de artículos comprados en dichos meses:


¿Simple, verdad?. La "magia" reside en pivotar la tabla COMPRAS, ya que queremos obtener un resultado de uno de sus campos (suma de unidades) por cada valor de otro campo de la misma tabla. Ahora las posibilidades son infinitas. Te invito a empezar a sustituir muchas de tus actuales consultas por esta forma, siempre que sea posible, que te evitará bucles, mayor codificación, etc, mejorando así el performance general.

Para terminar diremos que existe la cláusula que realiza justo la operación inversa, y se llama UNPIVOT. Una posible consulta para despivotar nuestro ejemplo, podría ser la siguiente, obteniendo un resultado sumando las compras de cada artículo agrupado por artículo y mes.

SELECT ARTICULO,MES,UNIDADES FROM
(SELECT * FROM COMPRAS PIVOT (SUM(unidades) FOR MES IN ([201201],[201202],[201203])) pvt) AS t
UNPIVOT (unidades FOR MES IN ([201201],[201202],[201203])) unpvt

No hay comentarios :

Publicar un comentario

Buscar en el Blog: