jueves, 5 de mayo de 2022

Power Query: Columnas a agrupar dinámicamente

Un caso fuera de lo habitual es poder elegir, de acuerdo a una lista, qué campos de una tabla de trabajo queremos agrupar/agregar.
Power Query: Columnas a agrupar dinámicamente

Partimos de una tabla de acciones detalladas, de acuerdo a una serie de conceptos: País, Ciudad, Año... y unas acciones o tareas desglosadas: Comercial, Estado de cuenta o Acción.
De esta tabla principal queremos obtener una comparativa de ciertos campos (comercial o estado o acción) respecto a los años 2022 y 2023 que aparezcan.
Para forzar qué campos emplearemos para una u otra cosa, dispondremos de una segunda tabla (en azul, a la derecha de la imagen) con dos campos...

Comezaremos cargando las dos tablas y ya dentro del editor de power query realizamos algunas tareas...

En primer lugar generaremos un par de listas a partir de la tabla azul 'TblCampos_a_Mostrar'...
Una primera lista solo con los campos que rigen la agrupación ('LstCamposAgrupacion'), y una segunda con los campos que queremos comparar/agrupar ('LstCamposComparar').
Así pues nuestras dos consultas que generan sendas listas serían:
//LstCamposAgrupacion
  let
    Origen = TblCamposMostrar,
    FilasFiltradas = Table.SelectRows(Origen, each ([Agrupar] = "Sí"))[Listado_campos_mostrar]
in
    FilasFiltradas
y
//LstCamposComparar
  let
    Origen = TblCamposMostrar,
    FilasFiltradas = Table.SelectRows(Origen, each ([Agrupar] = "Para_comparar"))[Listado_campos_mostrar]
in
    FilasFiltradas

dos consultas muy simples para filtrar los elementos deseados...

Finalmente creamos una consulta vacía nueva donde escribimos el código que permite la agrupación variable de columnas:
let
    //cargamos en buffer la tabla para evitar alteraciones de orden a la hora de agrupar
    Tabla=Table.Buffer(TblACCIONES),

    //realizamos la acción dinámica de agrupación
    FilasAgrupadas=Table.Group(Tabla, LstCamposAgrupacion, 
                List.Transform(
                    LstCamposComparar,
                    (Col) => {Col & "(2022-2023)", (Local) => Text.Combine(Table.Column(Local, Col),"-"), type nullable text}
                )  )
in
    FilasAgrupadas

En el ejemplo he optado por una transformación diferente a las habituales (de suma, promedio, etc.), donde aplico un concatenado de texto (Text.Combine) que permite mostrar la situación del 2022 vs 2023.

Pero lo realmente interesante es cómo hemos incluido dentro de la acción de agrupar Table.Group, la función List.Transform que se encarga de operar solo sobre la lista de campos a comparar elegida.
La combinación de estas dos funciones de GROUP y TRANSFORM sobre las listas elegidas en los primeros pasos del desarrollo nos retorna lo que queríamos...
Una agrupación sobre los campos de la 'LstCamposAgrupacion' y una agregación (concatenado en el ejemplo= sobre la 'LstCamposComparar'.

No hay comentarios:

Publicar un comentario

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