martes, 8 de septiembre de 2020

Power Query: Text.Combine para unir datos de distintas filas

Avanzando con el potencial de Power Query, hoy veremos una de sus funciones M más curiosas: Text.Combine con su sintáxis:
Text.Combine(texts as list, optional separator as nullable text) as text
La cual nos devuelve el resultado de combinar una lista de valores de texto, como una única cadena de texto; además podemos especificar un separador opcional entre los elementos de esa lista.

Nuestro objetivo hoy, para emplear esta función, es pasar de una tabla de información con registros repartidos entre distintas filas, a un nuevo listado final con la información agregada y combinada de esas filas diferentes.
Podemos verlo en la imagen siguiente:
Power Query: Text.Combine para unir datos de distintas filas


Veamos los pasos a seguir...
En primer lugar, como siempre, desde la ficha Datos > grupo Obtener y transformar > botón Desde Tabla o rango cargaremos los datos en una consulta del Editor de Power Query.
Power Query: Text.Combine para unir datos de distintas filas

En el segundo paso, por estética y gusto personal, transformaré el campo de 'Unidades' a texto con un formato de separador de miles sin decimales...
Para lo cual emplearé otra función M interesante:
Number.ToText(number as nullable number, optional format as nullable text, optional culture as nullable text)
siendo de especial interés los formatos permitidos:
- "D" o "d": (Decimal) Da formato al resultado como dígitos enteros. El especificador de precisión controla el número de dígitos en la salida.
-"E" o "e": (Exponencial/científico) Notación exponencial. El especificador de precisión controla el número máximo de dígitos decimales (el valor predeterminado es 6).
-"F" o "f": (Fijo, de punto fijo) Dígitos integrales y decimales.
-"G" o "g": (General) Forma más compacta de punto fijo o científico.
-"N" o "n": (Número) Dígitos integrales y decimales con separadores de grupos y un separador decimal.
-"P" o "p": (Porcentaje) Número multiplicado por 100 y mostrado con un símbolo de porcentaje.
-"R" o "r": (Recorrido de ida y vuelta) Valor de texto que puede realizar un recorrido de ida y vuelta por un número idéntico. El especificador de precisión se omite.
-"X" o "x": (Hexadecimal) Un valor de texto hexadecimal.
Estos códigos estarán seguidos de un valor numérico que opcionalmente irá seguido de un especificador de precisión numérica. en mi ejemplo emplearé el formato 'N0'; lo que mostrará un número con separador de miles (la N) y con 0 decimales (el 0).
El tercer argumento de la función, opcional, puede marcar el aspecto de la configuración del país, por ejemplo, es-ES, o us-US.

De acuerdo a lo anterior, volviendo a nuestra consulta, añadiremos una Columna personalizada con la siguiente expresión:
=Number.ToText([Unds],"N0")
Power Query: Text.Combine para unir datos de distintas filas

Y vemos el resultado de las unidades reflejado como texto...
Power Query: Text.Combine para unir datos de distintas filas

Podemos Quitar la columna previa de 'Unds', para lo que basta presionar sobre ella botón derecho y Quitar columna.

En el siguiente paso uniremos/concatenaremos las dos columnas informativas: Paises y Unidades.
Solo tendremos que seleccionar ambas y presionar botón derecho sobre ellas y seleccionar la opción Combinar columnas
Power Query: Text.Combine para unir datos de distintas filas

Y configuramos en la ventana correspondiente qué separador queremos emplear en la concatenación de ambas columnas... en mi ejemplo el guión medio -
Power Query: Text.Combine para unir datos de distintas filas

En un penúltimo paso, preparando el siguiente, Rellenaremos las filas vacías de los primeros campos: Vendedor y Año.
Así pues seleccionaremos estos dos campos y desde el menú Transformar > grupo Cualquier columna > botón Rellenar abajo, obteniendo el siguiente listado en nuestra consulta...
Power Query: Text.Combine para unir datos de distintas filas

Y, por fin, llegamos al paso final... debemos pasar de múltiples filas, además variables, ya que nunca es el mismo número de países los implicados en estos repartos, a una única fila por Vendedor y País, con el detalle agrupado.

Tiempo atrás ya publiqué un post en el blog sobre otra técnica para lograr este mismo tipo de agrupaciones (ver aquí).
Hoy veremos una alternativa con el uso de Text.Combine algo más simple... diría yo ;-)

Seleccionamos las columnas Vendedor y País y presionamos la opción de Agrupar por (la encontrarás en el menú Inicio > grupo Transformar > botón Agrupar por). Lo que abrirá la ventana de configuración y estableceremos la Agregación de Suma por el campo 'País+Unds'
Power Query: Text.Combine para unir datos de distintas filas

Comprobaremos como tras Aceptar nuestra consulta devuelve un error!!
Power Query: Text.Combine para unir datos de distintas filas

Lo curioso e interesante es que al arreglar este error daremos al tiempo con la solución buscada!!.
En la barra de fórmula de este paso vemos:
Table.Group(#"Rellenar hacia abajo", {"Vendedor", "Año"}, {{"País+Unidades", each List.Sum([#"Pais-Unds"]), type text}})
El problema es que trata de sumar una columna de texto... El truco es cambiar:
List.Sum([#"Pais-Unds"])
por
Text.Combine([#"Pais-Unds"],"|")
quedando el último paso de nuestra consulta:
Table.Group(#"Rellenar hacia abajo", {"Vendedor", "Año"}, {{"País+Unidades", each Text.Combine([#"Pais-Unds"],"|"), type text}})
Power Query: Text.Combine para unir datos de distintas filas
Listos... Cargamos y cerramos y vemos el resultado en la hoja de cálculo tal como queríamos!

No hay comentarios:

Publicar un comentario

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