¡Desafío Power Query! «For loop» entre dos tablas para hacer coincidir cadenas y agregar columnas

Un usuario Pregunto ✅

charliedatos

Necesito la ayuda de un experto en Power Query para crear una lógica de bucle como parte de la preparación de un conjunto de datos de ventas.

Mi tablas de entrada son:

  1. sinónimos de productos: los diversos nombres utilizados por el equipo de ventas para hablar sobre los productos (en mi ejemplo a continuación, hay 3 productos con varios sinónimos)
  2. llamadas de ventas: cada registro es una llamada con notas que me gustaría escanear para categorizar la actividad de ventas con respecto a los 3 productos, haciendo coincidir las notas de llamadas con la lista de sinónimos

Mi tabla de salida sería esencialmente la tabla de llamadas de ventas con un columna adicional por producto, en cada uno de los cuales el valor de la fila reflejaría si el producto se mencionó en las notas de llamada:

para loop.PNG

Usando Text.Contains an Table.AddColumn, he creado la lógica coincidente con la que puedo crear una nueva columna para un producto específico. Ahora podría replicar ese código M para cada producto; sin embargo, idealmente, simplemente recorrería las columnas de la tabla de productos y replicaría la lógica Text.Contains y Table.AddColumn para cada producto.

Estoy seguro de que esto es posible, aunque como nuevo aprendiz, ¡está un poco más allá de mí!

a juego.PNG

¡No esperaba descifrar esto fácilmente, pero estoy muy agradecido por cualquier ayuda!

camargos88

@charliedata,

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQwVNJRMjIwMjA0MjIFMoML8rNTFRKT8ktLFJzyKxQS81IUnDKzU5VidUCqjXCrdk4sAisyQjbSDK4oPCM1NacYbJ5zUWIJ0MBYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Call ID" = _t, #"Call Date" = _t, #"Call notes" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Call ID", Int64.Type}, {"Call Date", Int64.Type}, {"Call notes", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "ProductTable", each let _text = [Call notes] in
Table.PromoteHeaders(
Table.Transpose(
Table.RemoveColumns(
Table.AddColumn(
Table.SelectRows(
   #"Product Synonyms",
   each Text.Contains( _text, [Value])),
   "Text", each "Yes"),
   "Value")))),
    #"Expanded ProductTable" = Table.ExpandTableColumn(#"Added Custom", "ProductTable", Table.ColumnNames(Table.Combine(#"Added Custom"[ProductTable])))
in
    #"Expanded ProductTable"

Captura.PNG

Revisa el archivo adjunto.

camargos88

@charliedata,

Creo que vale la pena probar esta función.

camargos88

@charliedata,

Lo siento, entendí mal lo que dijiste.

Una vez que no necesita mostrar la palabra (solo sí), Table.Distinct es la mejor opción.

charliedatos

En respuesta a camargos88

Q final: ¿sabe si Table.Buffer podría acelerar esto en cualquier lugar?

camargos88

@charliedata,

También puede combinar los valores y mostrarlo como:

Producto A = «x, y»

Producto B = «w, z»

charliedatos

En respuesta a camargos88

¿En la tabla de sinónimos? Si es así, no sabría cómo estructurar el paso Text.Contains

camargos88

@charliedata,

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQwVNJRMjIwMjA0MjIFMoML8rNTFRKT8ktLFJzyKxQS81IUnDKzU5VidUCqjXCrdk4sAisyQjbSDK4oPCM1NacYbJ5zUWIJ0MBYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Call ID" = _t, #"Call Date" = _t, #"Call notes" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Call ID", Int64.Type}, {"Call Date", Int64.Type}, {"Call notes", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "ProductTable", each let _text = [Call notes] in
Table.PromoteHeaders(
Table.Transpose(
Table.RemoveColumns(
Table.AddColumn(
Table.SelectRows(
   #"Product Synonyms",
   each Text.Contains( _text, [Value])),
   "Text", each "Yes"),
   "Value")))),
    #"Expanded ProductTable" = Table.ExpandTableColumn(#"Added Custom", "ProductTable", Table.ColumnNames(Table.Combine(#"Added Custom"[ProductTable])))
in
    #"Expanded ProductTable"

Captura.PNG

Revisa el archivo adjunto.

charliedatos

En respuesta a camargos88

Una pregunta de seguimiento si puedo…

Si la descripción de la llamada incluye más de un sinónimo para un producto, la consulta genera columnas duplicadas; por ejemplo, si incluye tanto «ruedas» como «coche», habrá un Producto B_1 en la tabla de salida.

¿Algún consejo final sobre cómo tener solo un resultado (es decir, columna) por producto?

charliedatos

En respuesta a charliedatos

Creo que lo entendí: agregué una Table.Distinct alrededor de Table.RemoveColumns

charliedatos

En respuesta a camargos88

@ camargos88 ¡¿Cómo hiciste eso tan rápido?! Genial y perfecto – muchas gracias

amichandak

@charliedata, cree tres columnas como esta en la tabla de llamadas de ventas

Producto A = if(countx(filter(producto,buscar(producto[productA],llamada de venta[call notes],,0)>0),producto[productA])+0 >0, «Sí», «No»)
Producto b = if(countx(filter(producto,buscar(producto[productb],llamada de venta[call notes],,0)>0),producto[productb])+0 >0, «Sí», «No»)
Producto c = if(countx(filter(producto,buscar(producto[productc],llamada de venta[call notes],,0)>0),producto[productc])+0 >0, «Sí», «No»)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *