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:
Tabla B:
TablaC:
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:
¿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.
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