Más de una vez nos hemos encontrado en la situación de tener que unpivotar una tabla, teniendo así que recurrir o bien al componente “Unpivot” de SSIS o incluso a tener que guardar los datos en tabla y realizar posteriormente una lectura de esta misma utilizando T-SQL para unpivotarla, con los problemas que ambas soluciones nos puedan conllevar con un gran volumen de datos.
Dentro del ejemplo que queremos mostrar, lo primero que deberemos hacer es ver la estructura de la tabla y su contenido:
– Estructura: tendremos una tabla que contendrá cuatro campos
Por un lado tendremos el NIF del ciente, y por otro tres columnas que nos indican las líneas de negocio de los tres últimos meses asociadas a ese cliente.
– Contenido: para este ejemplo solamente tendremos una línea para que la visualización de los datos sea lo más entendible posible.
SELECT [NIFCliente]
,[LineaNegocio_M1]
,[LineaNegocio_M2]
,[LineaNegocio_M3]
FROM [dbo].[LineasDeNegocio]
Una vez vista la estructura y contenido de las tablas, deberemos entender el problema y la solución. El problema surge en querer unpivotar las columnas de la tabla que nos indican las líneas de negocio respecto del cliente, y la solución la veremos sobre un paquete de SSIS donde no utilizaremos el componente UnPivot.
Comenzaremos dentro de un “Data Flow” con un “Ole DB Source” para leer los datos de la tabla (en nuestro caso en SQL Server 2008), estos datos los replicaremos mediante un “MultiCast” en tres buffers distintos para manejar las tres líneas de negocio mediante “Derived Column”, que posteriormente uniremos con el componente “Union All” de una manera un tanto peculiar que luego explicaremos más a fondo.
Esta sería la estructura de nuestro “Data Flow”:
Veamos un poco más detenidamente la función que cumplen los tres “Derived Column” y el “Union All” en la construcción del “Unpivot”.
- Derived Column: en cada uno de los tres generaremos una columna derivada llamada IdLineaNegocio que contendrá los valores “M1”,”M2” y “M3” para que podamos identificar el mes al que corresponde cada línea de negocio asociadas a un cliente.
- Union All: aquí no deberemos conservar los tres outputs que nos pondría este componente tal y como lo entiende por la entrada de datos que tiene, deberemos borrar las tres salidas referentes a las líneas de negocio:
Y crear solamente una única salida para las líneas de negocio que sin embargo contedría los tres valores de entrada, quedando la estructura interna del componente como en la siguiente figura:
Una vez hecho todo esto, ya tendríamos unpivotada nuestra tabla inicial:
Espero que sirva de ayuda.