Fusionar consultas basadas en múltiples condiciones

Un usuario Pregunto ✅

SDream7

Hola,

Tengo dificultades para fusionar dos tablas a través de la función de consulta de fusión.

Aquí está mi situación:

La tabla A tiene numerosos campos, pero los de interés son [First Name], [Last Name], [Client ID], [Personal ID], [Date of Birth] y un campo concatenado que se deriva de combinar ambos [First Name] & [Date of Birth] juntos, a los que me referiré como [Concatenated First/DOB].

La Tabla B también tiene una variedad de campos diferentes Y también incluye los campos de interés que enumeré para la Tabla A.

Ambas tablas contienen esencialmente su propio conjunto de clientes, que pueden aparecer o no en ambas tablas.

Con la función Combinar consulta, solo puedo combinar ambas tablas en función de una única columna coincidente. Para mis propósitos, quiero que mis filas en ambas tablas se fusionen si CUALQUIERA de los siguientes es cierto:

TablaA.[Client ID] coincide con la Tabla B.[Client ID]

TablaA.[Personal ID] coincide con la Tabla B.[Personal ID]

TablaA.[Concatenated First/DOB] coincide con la Tabla B.[Concatenated First/DOB]

Soy nuevo en Power BI y supongo que necesitaría agregar alguna combinación de declaraciones IF / OR en el Editor avanzado, pero no estoy seguro de cómo hacerlo con el lenguaje de consulta M.

Así es como se ve la declaración M en el Editor avanzado cuando combino ambas tablas en función de una sola columna coincidente:

= Table.NestedJoin(#»Personalizado agregado», {«TableA.ID de cliente»}, #»Archivo de exportación XLS (3)»,{«TableB.ID de cliente» },»Archivo de exportación XLS (3)»,JoinKind. CompletoExterior

¿Qué adiciones tendría que agregar a mi declaración M para fusionar las dos tablas según los criterios que enumeré anteriormente?

Además, todavía quiero mantener todos los Clientes TableA y TableB que no coinciden en esta tabla recién fusionada, aunque sé que tendrían todos los valores nulos en los Campos de la Tabla A o en los Campos de la Tabla B. ¿Estoy en lo correcto al usar la opción externa completa al final de mi declaración M?

Gracias,

RahulYadav

Hola @SDream7,

Intente seguir los pasos a continuación para lograr esto usando dax.

1. Los campos de combinación deben tener nombres diferentes en TableA y TableB.

2. Importe ambas tablas a Power BI.

3. No agregue uniones en las tablas.

4. Agregue una nueva tabla usando la siguiente fórmula DAX.

TableC = DISTINCT( union(
    FILTER(CROSSJOIN(TableA,TableB),TableA[Client ID]=TableB[ClientID]),
    FILTER(CROSSJOIN(TableA,TableB),TableA[Personal ID]=TableB[PersonalID]),
    FILTER(CROSSJOIN(TableA,TableB),TableA[Concatenated First/DOB]=TableB[ConcatenatedFirst/DOB]),
    NATURALLEFTOUTERJOIN(TableA,TableB),
    NATURALLEFTOUTERJOIN(TableB,TableA)))

Esto le dará los detalles que está buscando. Muestra abajo:

Tabla A:

TablaA.jpg

Tabla B:

TablaB.jpg

TablaC:

2018-03-27_11-11-59.jpg

Gracias,

Raúl

vmakhija

En respuesta a RahulYadav

@RahulYadav

Según su punto n. ° 3, ha dicho que no agregue ninguna combinación entre tablas.

Sin embargo, obtengo el siguiente error:

UNIRSE error.JPG

¿Alguna idea?

RahulYadav

En respuesta a vmakhija

Hola @SDream7,

Perdón por la confusion.

He agregado la unión basada en el campo ClientID.

Gracias,

Raúl

SDream7

En respuesta a RahulYadav

Tengo el mismo problema que el usuario anterior:

«No se detectaron columnas de combinación comunes. La función de combinación ‘NATURALLEFTOUTERJOIN’ requiere al menos una columna de combinación común».

¿Cómo arreglaría esto? ¿Qué quiere decir que agregó unirse en función de la identificación del cliente?

Lo siento, soy nuevo en BI 😞

RahulYadav

En respuesta a SDream7

Hola @SDream7,

Cree una nueva unión entre TableA y TableB como se muestra a continuación a través de Administrar relación.

2018-03-27_19-23-59.jpg

Avísame si obtienes el resultado deseado.

Gracias,

Raúl

SDream7

En respuesta a RahulYadav

Cuando vinculo ambos campos en una relación, solo puedo vincularlos como Muchos a Uno.

Luego, el error que aparece en la Tabla C es «La columna con el nombre de ‘ID de cliente’ ya existe en la Tabla C.

RahulYadav

En respuesta a SDream7

Hola @SDream7,

Creo que está utilizando el mismo nombre «ID de cliente» en ambas tablas. Para NATURALLEFTOUTERJOIN para que funcione correctamente, tEl nombre del campo «Client ID» debe ser diferente en ambas tablas TableA y TableB.

¿Podría compartir la captura de pantalla de la expresión DAX que utilizó para obtener TableC?

Gracias,

Raúl

ImkeF

En respuesta a SDream7

Eso no es nada fácil.

He preparado una función para ti porque si eres principiante, tendrás dificultades para seguir/ejecutar los pasos. Simplemente copie este código en el editor avanzado y asigne a la consulta el nombre «MyFunction». Luego llámelo y complete el parámetro 3: Referencia a la primera y segunda tabla y una lista con los nombres de las columnas:

Esto debería dar como resultado un código como este: MyFunctionName(TableA, TableB, {«Client ID», «Personal ID», «Concatenated First/DOB»})

(Table1 as table, Table2 as table, ListOfFieldNames) =>

let

    Source = Table1,
    #"Added Index" = Table.AddIndexColumn(Source, "Index1", 0, 1),
    Unpivot1 = Table.Unpivot(#"Added Index", ListOfFieldNames , "Attribute", "Value"),


    Source2 = Table2,
    #"Added Index2" = Table.AddIndexColumn(Source2, "Index2", 0, 1),
    Unpivot2 = Table.Unpivot(#"Added Index2", ListOfFieldNames , "Attribute", "Value"),

    Source3 = Table.NestedJoin(Unpivot1,{"Attribute", "Value"},Unpivot2,{"Attribute", "Value"},"Table2",JoinKind.FullOuter),
    #"Renamed Columns" = Table.RenameColumns(Source3,{{"Attribute", "Attribute0"}, {"Value", "Value0"}}),
    Expand = Table.ExpandTableColumn(#"Renamed Columns", "Table2", List.Difference(Table.ColumnNames(Unpivot2), ListOfFieldNames), List.Transform(List.Difference(Table.ColumnNames(Unpivot2), ListOfFieldNames), each _&"_")),
    SortAndBuffer = Table.Buffer(Table.Sort(Expand,{{"Index1", Order.Descending}, {"Index2_", Order.Descending}})),
    #"Filtered Rows" = Table.SelectRows(SortAndBuffer, each ([Index1] <> null)),
    MatchesFromFirstTable = Table.Distinct(#"Filtered Rows", {"Index1"}),
    Custom1 = Expand,
    #"Sorted Rows" = Table.Buffer(Table.Sort(Custom1,{{"Index2_", Order.Descending}, {"Index1", Order.Descending}})),
    #"Filtered Rows1" = Table.SelectRows(#"Sorted Rows", each ([Index2_] <> null)),
    MatchesFromSecondTable = Table.Distinct(#"Filtered Rows1", {"Index2_"}),
    #"Appended Query" = Table.Combine({MatchesFromFirstTable, MatchesFromSecondTable}),
    #"Removed Duplicates" = Table.Distinct(#"Appended Query", {"Index1", "Index2_"})
in
    #"Removed Duplicates"

SDream7

En respuesta a ImkeF

Copié el código y creé la función, pero sigo recibiendo este error:

Ocurrió un error en la consulta ». Expresión.Error: no podemos convertir el valor «ID de cliente» al tipo Lista.
Detalles:
Valor=ID de cliente
Tipo=Tipo

ImkeF

En respuesta a SDream7

¿Utilizó los corchetes alrededor de su lista de nombres de columna?

mfelix

Hola @SDream7,

Es complicado creer que @ImkeF puede ayudarlo, ella es una experta en M y siempre muestra nuevas formas de cambiar nuestros datos, es una gran Datanaut.

Saludos,

mfelix

Deja un comentario

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