martes, 20 de febrero de 2018

Power Query: Columna dinámica

Seguimos con la herramienta Obtener y transformar/Power Query.
Hoy trabajaremos para conseguir, a partir de una tabla con campo 'Zona', 'Producto' e 'Importes', una nueva tabla resumen con importes acumulados de los 'productos' por cada 'zona' (a semejanza de una tabla dinámica'.

En particular nos aprovecharemos de una herramienta especialmente útil de Power Query: Columna dinámica / Unpivot.

Power Query: Columna dinámica



Como siempre, desde la tabla, cargamos los datos en el editor de consultas:
Desde la hoja de cálculo accedemos a la Ficha Datos > grupo Obtener y transformar > Desde una tabla.


Ya en editor de consulta, y con nuestra consulta habilitada, seleccionamos el campo 'Zona', y navegamos hasta el menú Transformar > grupo Cualquier columna > botón Columna dinámica

Power Query: Columna dinámica



Se abrirá una ventana de configuración donde ajustar la conversión.
Seleccionaremos como 'columna de valores' el campo numérico ('Importes'); y como función de valor agregado (que se empleará para agrupar los datos cruzados) la Suma.

Power Query: Columna dinámica



Hemos acabado. Podemos Cerrar y Cargar para obtener el resultado mostrado al inicio de la explicación.
Tenemos un tabla de referencia cruzada por zona y producto, y resumido por suma de importes acumulados...

Y como una tabla dinámica, nuevos elementos se incorporarán automáticamente en nuestro informe resumen.


A modo de curiosidad, si entramos en el editor avanzado de la consulta veremos:

let 
    Origen = Excel.CurrentWorkbook(){[Name="Tbl_Pdtos"]}[Content],
    #"Columna dinamizada" = Table.Pivot(Origen, List.Distinct(Origen[Zona]), "Zona", "Importes", List.Sum)
in
    #"Columna dinamizada"


Donde observamos el uso de la función Table.Pivot, que es precisamente la que habilita la posibilidad de crear nuevas columnas por cada elemento del campo indicado.

5 comentarios:

  1. Hola amigo, muchas gracias por tus aportes, son de gran ayuda, tengo una duda: como Pivotear valores de Texto? usando tu ejemplo tengo:

    Zona | Producto |
    ==================
    Norte | P1 |
    Norte | P2 |
    Sur | P3 |
    Sur | P4 |

    y quisiera obtener:

    Norte | Sur |
    ================
    P1 | P3 |
    P2 | P4 |

    de antemano muchas gracias por la ayuda que puedas prestarme.

    Saludos,

    MA

    ResponderEliminar
    Respuestas
    1. Hola Miguel
      en unos días (a finales de este mes) está programada la publicación de un post que creo te dará alguna pista de cómo conseguirlo...

      Más posibilidades sería con columnas condicionales... siempre que tengas un número finito de zonas

      Saludos

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Hola Ismael, muchas gracias por tu respuesta y estaré muy atento a ese post, te queria comentar que de tanto buscar lei que alguien recomendaba crear una columna adicional para poder agrupar y así lo hice y me funcionó. te dejo como lo resolvi:

      Tenemos la siguiente tabla:

      Zona | Texto
      ---------------
      Norte | TextoA
      Norte | TextoB
      Sur | TextoC
      Sur | TextoD
      Este | TextoE
      Oeste | TextoF
      Oeste | TextoG
      Oeste | TextoH

      y queremos que nos quede así:

      Norte | Sur | Este | Oeste
      ---------------------------------
      TextoA | TextoC | TextoE | TextoF
      TextoB | TextoD | null | TextoG
      null | null | null | TextoH

      Para eso debemos agregar a la tabla original un GRUPO que se reinicie por cada cambio de la Cabecera (Zona) p.e. Norte será 1 y 2, Sur será también 1 y 2, Este será 1 y Oeste será 1,2 y 3.

      Por que? se hace para agregar líneas a cada cabecera (Zona)

      Zona | Texto | Grupo
      ----------------------
      Norte | TextoA | 1
      Norte | TextoB | 2
      Sur | TextoC | 1
      Sur | TextoD | 2
      Este | TextoE | 1
      Oeste | TextoF | 1
      Oeste | TextoG | 2
      Oeste | TextoH | 3

      Paso para transformar ya en PowerQuery:
      1) Seleccionar la columna con la cabecera (Zona)
      2) le damos al botón de "COLUMNAS DINAMICAS"
      2) Seleccionar la columna con valores (Texto)
      4) en opciones avanzadas seleccionar->No agregar
      5) Las columnas no seleccionadas serán las filas (Grupo + n..)
      6) eliminamos la Columna creada (Grupo)
      **El resultado será el esperado**


      El codigo de PowerQuery es:
      =========================================
      let
      Origen = Excel.CurrentWorkbook(){[Name="MiTabla"]}[Content],
      #"Columna dinamizada" = Table.Pivot(Origen, List.Distinct(Origen[Zona]), "Zona", "Texto"),
      #"Columnas quitadas" = Table.RemoveColumns(#"Columna dinamizada",{"Grupo"})
      in
      #"Columnas quitadas"
      =========================================

      Espero haberme explicado bien y contribuir con la comunidad!

      Gracias por la atención.

      Eliminar
    4. Muchas gracias por compartirlo!!

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.