domingo, 18 de noviembre de 2018

► Transponer un Excel con código de script.


Tenemos esta tabla Excel :


Y queremos obtener la siguiente tabla simple. 



Ojo. Con un gráfico de tabla pivotante, con dimensiones Género y Localidad y pivotando esta última y por expresión hacer un SUM(Población), no podríamos obtener la columna “Media”. Sólo lo podemos hacer con una tabla simple. Pero antes tenemos que conseguir poner cada localidad en una columna para poderlas operar entre si.  De esta forma la “Media” siempre se calculará en función de las localidades seleccionadas por el usuario.
Tenemos que conseguir crear en memoria esta tabla:



El “asistente de archivo” de QlikView no tiene la opción de hacerlo, aunque si puede hacer lo contrario, o sea, a través de la  opción de “Tabla cruzada” podemos ir del punto 2 al punto 1.

Tampoco con la opción “trasponer” podemos hacerlo ya que no nos permite elegir qué campos trasponer y cuáles no.

Una forma de hacerlo es con el siguiente script:

// Cargamos los datos del excel

EXCEL_ORIGINAL:

LOAD Género           AS Genero_orig

     Población        AS Poblacion_orig
     Localidad        AS Localidad_orig
FROM
[C:\Users\jmmayoral\Documents\Qlikview\dummy.xlsx]
(ooxml, embedded labels, table is Hoja1);


// A partir de esa carga, creamos la que será la definitiva, pero sin el campo que vamos a trasponer
// ni el campo de los valores.
// en nuestro caso queda fuera "Localidad" y "poblacion"
TABLA_FINAL:
LOAD Genero_orig      AS Género
RESIDENT EXCEL_ORIGINAL;

// Creamos ahora una tabla con todos los valores distintos del campo a trasponer
//
LOCALIDADES:
Load Distinct Localidad_orig as Localidad
RESIDENT EXCEL_ORIGINAL;


//Con un bucle recorremos cada valor de la tabla
FOR i=1 to NoOfRows('LOCALIDADES')
     LET vLocalidad=Peek('Localidad',-$(i),'LOCALIDADES'); //aquí toma el nombre de la division.

     LEFT JOIN (TABLA_FINAL)
     LOAD  Genero_orig         as Género, //Lista con todos los campos excepto el traspuesto y el del valor
           Poblacion_orig      as [$(vLocalidad)]    //Creamos una columna nueva llamada como la Localidad que estamos procesando
     RESIDENT  EXCEL_ORIGINAL
     WHERE  Localidad_orig = '$(vLocalidad)';

NEXT i

Drop table EXCEL_ORIGINAL, LOCALIDADES;



No hay comentarios:

Publicar un comentario