Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
EllieSim
Helper II
Helper II

Coincidencia y devolución de una lista de todas las palabras coincidentes dentro de un número de columnas en una nueva columna de tabla

Hola

Necesito ayuda para hacer coincidir y devolver la lista de valores coincidentes (en una nueva columna, separada sin una coma idealmente) que se encuentran dentro de varias columnas de mi tabla para cada fila a los valores dentro de otra columna.

Necesito buscar valores en las columnas Categoría, Familia y Bham_Name y devolver una lista para cualquier palabra dentro de estas columnas que coincida con una palabra dentro de la Bham_NRM_Level4/5_Code fila correspondiente. Si no existe una coincidencia, para devolver una cadena que diga Advertencia.

¿Cuál es la mejor manera de hacer esto y también hay una manera de explicar la diferencia en el lenguaje donde las palabras se refieren de manera diferente, tales como tuberías, tuberías, tuberías, etc.? ¿Quizás basar el partido en 4 número mínimo de charladores en lugar de toda la palabra?

Muchas gracias por su ayuda. 🙂

Power BI Word Match.PNG

1 ACCEPTED SOLUTION
v-yingjl
Community Support
Community Support

Hola @EllieSim ,

Pensé que había una relación de subconjunto entre 'Código de nivel 4/5' y otras tres columnas, así que creé una tabla Words en el editor avanzado primero:

let
    OriginTable = Table,
    TableA = Table.RenameColumns(Table.ExpandListColumn(Table.TransformColumns(Table.SelectColumns(OriginTable,{"Category"}), {{"Category", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Category"),{"Category","Word"}),
    TableB = Table.RenameColumns(Table.ExpandListColumn(Table.TransformColumns(Table.SelectColumns(OriginTable,{"Family"}), {{"Family", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Family"),{"Family","Word"}),
    TableC = Table.RenameColumns(Table.ExpandListColumn(Table.TransformColumns(Table.SelectColumns(OriginTable,{"Bham_Name"}), {{"Bham_Name", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Bham_Name"),{"Bham_Name","Word"}),
    FinalTable = Table.Combine({TableA,TableB,TableC}),
    #"Removed Duplicates" = Table.Distinct(FinalTable)
in
    #"Removed Duplicates"

word table.png

Esta pestaña de Word se derrama estas tres columnas basadas en ' ' identificador y combinarlos con diferentes cadenas.

Luego creé una columna calculada como esta:

Column = 
COALESCE (
    CALCULATE (
        MAX ( 'Words'[Word] ),
        FILTER (
            'Words',
            CONTAINSSTRING ( 'Table'[Category], 'Words'[Word] )
                && CONTAINSSTRING ( 'Table'[Family], 'Words'[Word] )
                && CONTAINSSTRING ( 'Table'[Bham_Name], 'Words'[Word] )
                && CONTAINSSTRING ( 'Table'[Bhan_Code], 'Words'[Word] )
        )
    ),
    "Warning"
)

Obtendrá el siguiente resultado que es su posible mente esperada:

table result.png

Aquí está mi archivo de muestra que espera ayudarle, por favor pruébelo: PBIX

Mejores looks,
Yingjie Li

Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

View solution in original post

10 REPLIES 10
v-yingjl
Community Support
Community Support

Hola @EllieSim ,

Pensé que había una relación de subconjunto entre 'Código de nivel 4/5' y otras tres columnas, así que creé una tabla Words en el editor avanzado primero:

let
    OriginTable = Table,
    TableA = Table.RenameColumns(Table.ExpandListColumn(Table.TransformColumns(Table.SelectColumns(OriginTable,{"Category"}), {{"Category", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Category"),{"Category","Word"}),
    TableB = Table.RenameColumns(Table.ExpandListColumn(Table.TransformColumns(Table.SelectColumns(OriginTable,{"Family"}), {{"Family", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Family"),{"Family","Word"}),
    TableC = Table.RenameColumns(Table.ExpandListColumn(Table.TransformColumns(Table.SelectColumns(OriginTable,{"Bham_Name"}), {{"Bham_Name", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Bham_Name"),{"Bham_Name","Word"}),
    FinalTable = Table.Combine({TableA,TableB,TableC}),
    #"Removed Duplicates" = Table.Distinct(FinalTable)
in
    #"Removed Duplicates"

word table.png

Esta pestaña de Word se derrama estas tres columnas basadas en ' ' identificador y combinarlos con diferentes cadenas.

Luego creé una columna calculada como esta:

Column = 
COALESCE (
    CALCULATE (
        MAX ( 'Words'[Word] ),
        FILTER (
            'Words',
            CONTAINSSTRING ( 'Table'[Category], 'Words'[Word] )
                && CONTAINSSTRING ( 'Table'[Family], 'Words'[Word] )
                && CONTAINSSTRING ( 'Table'[Bham_Name], 'Words'[Word] )
                && CONTAINSSTRING ( 'Table'[Bhan_Code], 'Words'[Word] )
        )
    ),
    "Warning"
)

Obtendrá el siguiente resultado que es su posible mente esperada:

table result.png

Aquí está mi archivo de muestra que espera ayudarle, por favor pruébelo: PBIX

Mejores looks,
Yingjie Li

Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Hola Yingjie Li,

Muchas gracias por el esfuerzo que ha puesto en esta solución. Me temo que no estoy familiarizado con el lenguaje M en esta etapa. La solución parece realmente rebust sin embargo, no he sido capaz de replicar lo al final hasta ahora.

El nombre de la tabla que contiene la familia, la categoría, la Bham_Name y Bham_NRM_Level4/5_Code es "Bham NRM existe como importado". Hay otras tablas que contienen columnas con los mismos nombres dentro de mi informe, por lo que los nombres de columna no son exclusivos. ¿Podría decirme dónde necesito reflejar el nombre de esta tabla que la nueva tabla de texto Words está buscando valores?

¿A continuación, voy a crear una consulta en blanco en el editor de consultas?

Muchas gracias por tu ayuda,

Ellie

Hola @EllieSim ,

Como publiqué anteriormente, la tabla de palabras es una copia de la tabla de datos orignally. Luego depiló las tres columnas basadas en " " identificador en tres tablas como la tabla A, B, C. Después de esto, combina trescolumnas y elimina campos repetidos y produce una tabla de palabras final.

Puede crear una consulta en blanco y hacer clic en Editor avanzado para intentar utilizar estos códigos M.

ade.png

Mejores looks,
Yingjie Li

Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Hay @v-yingjl

Muchas gracias por la aclaración. Logré replicarlo con éxito. No excluye palabras como conjunciones (en, en etc.) pero coincide con las palabras y devuelve una advertencia como se describe.

Muchas gracias,

Ellie

Hola Ellie,

Como hemos discutido en el mensaje privado utilizando el archivo de ejemplo he configurado una nueva columna que devuelve los valores basados en el texto de la Level4/5 en esta medida también he incluido las excepciones si desea agregarlos en el filtrado que se realiza.

Output to a Table = 
VAR Sentence = 'Bham NRM Exists'[Bham_NRM_Level_4/5_Code]
VAR SentenceCleaned = " " & Sentence & " "
VAR LengthOfSentence = LEN(SentenceCleaned)
VAR PivotedSentence  = 
    ADDCOLUMNS(
        GENERATESERIES(1;LengthOfSentence) ;
        "Letter" ; 
        MID(SentenceCleaned;[Value];1)
    )  
var Boundaries = 
  ADDCOLUMNS(
    PivotedSentence ;
    "PrevSpace"; MAXX(FILTER(PivotedSentence ;''[Value] < EARLIER([Value]) && [Letter] = " ");[Value]) + 1;
    "NextSpace"; MINX(FILTER(PivotedSentence ;''[Value] > EARLIER([Value]) && [Letter] = " ");[Value]) - 1 
       )
VAR TableOfWords =        
    SELECTCOLUMNS(
        SUMMARIZE(
             FILTER(Boundaries;NOT [Letter] IN {" "}) ;
            [PrevSpace]
            );"Word Position";[PrevSpace]
            ) 
    
VAR TableOfWords2 = 
    ADDCOLUMNS(
        TableOfWords;
        "Word";
        CONCATENATEX(
            FILTER(
                Boundaries;[PrevSpace]=[Word Position]);
                [Letter];
                ;
                [Value]
                )
        )
VAR RankedWords = 
    ADDCOLUMNS(
        FILTER(TableOfWords2;NOT [Word]  In {"Word1"; "word2"; "word 3"} ); //Added code
        "Word Number" ; 
        RANKX(TableOfWords2;[Word Position];;ASC)
        )
            
RETURN 
IF(
      SUMX(RankedWords;
           SEARCH(
                LEFT([Word];4);
                'Bham NRM Exists'[Bham_Name]
                ;;0
               )
          ) 
+
      SUMX(RankedWords;
           SEARCH(
                LEFT([Word];4);
                'Bham NRM Exists'[Category]
                ;;0
               )
          )
> 0;
      "";
      "Warning"
     )

He añadido este código a la medida NOT [Word] In ''Word1'; "word2"; "palabra 3" - esto es que usted necesita agregar toda la excepción tenga en cuenta que es posible que necesite en algunos de ellos para tener y espacio adicional en el final de la palabra por lo que sería "palabra1", pero tratar de hacer coincidir a su texto.

Esta solución se basa en estos dos posta a continuación:

https://radacad.com/quick-dax-word-count

https://powerpivotpro.com/2014/01/containsx-finding-if-a-value-in-table-1-has-a-matching-value-in-ta...

Si necesita más ayuda, por favor dígamelo.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Hola @EllieSim ,

He adjuntado el archivo .pbix de muestra al final de mi primer post, por favor, compruebe y pruébelo.

Mejores looks,
Yingjie Li

Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

adrisarmientop
New Member

 

Buenas tardes,

 

Me encuentro en un grupo de trabajo al cuál se le esta presentando el siguiente inconveniente y quisiera saber si me podrían ayudar a solucionarlo.

Tengo un dashboard que está cálculando el efecto mix, precio y volumen de ventas actuales vs. ventas presupuestadas. Este efecto mix, precio y volumen se muestra a nivel de diferentes categorias y/o filtros (País, marca, producto). Al incluir la formula para cálculo de por ej. Efecto precio y seleccionar dos países al tiempo, el efecto precio que me muestra está siendo cálculado teniendo en cuenta el total de ingresos de los países / Total unidades de los dos países. Lo cuál es un resultado muy diferente si cálculo el efecto precio de cada país por separado y lo sumo. (Incluyo imagen con ejemplo).

 

Ejemplo.png

 

Lo que estoy necesitando es que mi dashboard aún aplicando los filtros incluidos, me respete el efecto precio por cada país y lo sume en lugar de cálcularlo sobre los totales de ingresos y unidades.

Me dijeron que esto lo podría solucionar utilizando la formula SUMX, aún así al momento no he logrado arreglarlo. De antemano mil gracias por su colaboración con la inquietud!

Saludos.

MFelix
Super User
Super User

Hola @EllieSim ,

Cree que tiene un problema con la definición de la palabra que necesita, pero intente agregar la siguiente columna calculada:

find =
VAR find_text =
    LEFT (
        RIGHT (
            'Table'[Level 4/5];
            LEN ( 'Table'[Level 4/5] ) - SEARCH ( " "; 'Table'[Level 4/5]; 1 )
        );
        4
    )
RETURN
    IF (
        SEARCH ( find_text; 'Table'[Category]; 1; BLANK () )
            + SEARCH ( find_text; 'Table'[Bham_Name]; 1; BLANK () ) > 0;
        BLANK ();
        "Warning"
    )

Las columnas pueden necesitar ajuste.

Esto solo devuelve la parte Advertencia. Por favor, dime si esto funciona según lo necesites.

Por otra parte, devolver la lista de palabras teniendo en cuenta que esta puede ser cualquier palabra dada lo que necesita, por ejemplo:

Tubería de drenaje que necesita tubería de drenaje o simplemente tubería?


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Hola Miguel,

Muchas gracias por su sugerencia. Parece haber un problema con la búsqueda en la columna. De lo contrario, ajusté las columnas como en la adjunta y la sintaxis parece correcta. ¿Podrías por favor echar un vistazo en caso de que me pierda algo? ¡Muchas gracias!

NRM Words Match Solution 1.PNG

Hola @EllieSim

Mirar el código es difícil obtener la respuesta correcta sin datos.

¿Hay una columna de categoría correcta?

¿Es posible que envíe una maqueta de archivos por mensaje privado.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.