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

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
Anonymous
Not applicable

Columna de filtrado basada en otra tabla basada en múltiples criterios

Hola

Hace poco empecé a trabajar con Power Bi. Simplemente no puedo seguir adelante con la siguiente pregunta.

En Table1, todos los valores de la columna ID deben generarse que no están contenidos con la columna ID en Table2

O que no cumplan los siguientes criterios en la tabla 2: isValid ? 1 AND isComplete ? 1.

Más adelante en el panel, la salida debe estar más limitada por una segmentación de tiempo.

Tabla1

Id

Nombre1

Nombre2

Ciudad

DE-001

Mike

S.

B.

DE-002

Ted

F.

L.

DE-003

Frank

M.

F.

DE-004

Marc

C.

T.

DE-005

Fiona

F.

L.

Tabla2

Id

isValid

isComplete

Fecha

DE-001

0

0

04.04.2016

DE-002

1

0

07.04.2016

DE-003

0

1

23.05.2016

DE-004

1

1

23.05.2016

DE-004

0

0

04.08.2017

DE-007

0

0

16.08.2017

Sin una segmentación de tiempo la salida debe ser: DE-001, DE-004, DE-005

Con una cortadora de tiempo establecida para todo el año 2017: DE-004, DE-005

¡Muchas gracias por sus sugerencias!

Saludos soleados desde Babelsberg,

Sigmund

15 REPLIES 15
v-shex-msft
Community Support
Community Support

Hola @Sigmund,

Creo que puede utilizar la condición para extraer la lista de id de 'tabla 2', a continuación, se puede utilizar 'in' operador o función INTERSECT para comparar con el id actual en 'tabla 1' y id list and return Tag y utilizarlo en 'filtro de nivel visual' para controlar los registros mostrados.

Filtro de medida:

Measure =
VAR currID =
    VALUES ( Table1[ID] )
VAR list =
    CALCULATETABLE (
        VALUES ( Table2[ID] ),
        FILTER ( ALL( Table2 ), [isValid] = 1 && [isComplete] = 1 )
    )
RETURN
    IF ( INTERSECT ( cuddID, list ) = 0, "Y", "N" )

saludos

Xiaoxin Sheng

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.
Anonymous
Not applicable

Hola @v-shex-msft,

Por lo que veo, su enfoque va exactamente en la dirección correcta.

No recibo un mensaje de error con el siguiente código:

Measure = 
        VAR currID =
            VALUES ( Table1[ID] )
            VAR list =
            CALCULATETABLE (
                VALUES ( Table2[ID] );
                FILTER ( ALL( Table2 ); [isValid] = 1 && [isComplete] = 1 )
            )
        RETURN
            IF ( INTERSECT ( currID; list ) = 0; "Y"; "N" )

Pero si quiero integrar la medida en un objeto visual: recibo el siguiente mensaje de error: MdxScript (Modelo) (10, 41) Error de cálculo en la medida 'Tabla1' [Medida]: las comparaciones DAX no admiten comparaciones entre valores del texto de tipo y entero. Puede utilizar la función VALUE o la función FORMAT para convertir uno de los valores.

Hola @Sigmund ,

Asegúrese de que las columnas "isValid" y "isComplete" tienen el mismo formato en el editor de consultas, así como las columnas ID de ambas tablas.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF,

Gracias por sus comentarios. ID tiene el formato de texto, isValid y isNull tienen el formato de enteros.
Sin embargo, sigo recibiendo el mensaje de error que indica que el texto no se puede comparar con los enteros.

Hola @Sigmund,

Lo sentimos, parece que me olvido de agregar la función 'COUNTROWS' para empaquetar el resultado de la función INTERSECT. (este problema debe deberse a la comparación con el valor de tipo de lista/tabla y el valor de tipo entero)

DAX INTERSECT

Measure =
VAR currID =
    VALUES ( Table1[ID] )
VAR list =
    CALCULATETABLE (
        VALUES ( Table2[ID] );
        FILTER ( ALL ( Table2 ); [isValid] = 1 && [isComplete] = 1 )
    )
RETURN
    IF ( COUNTROWS ( INTERSECT ( currID; list ) ) = 0; "Y"; "N" )

Si por encima todavía no ayuda, ¿puede compartir un archivo pbix de muestra ficticio para probar?

saludos

Xiaoxin Sheng

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.
Anonymous
Not applicable

Hola @v-shex-msft;

¡Gracias de nuevo! ¿Cómo puedo cargar un archivo pbix de ejemplo? Eso es lo que obtengo con la nueva medida.

Measure.jpg

HI @Sigmund,

Como dije, esta fórmula es un filtro de medida. Por lo tanto, debe agregar esto a un objeto visual de tabla que utilizó campos table1 y filtrar los registros de etiquetas 'Y'.

Aplicación de un filtro de medida en Power BI

Para el archivo de ejemplo pbix, puede cargarlo en 'onedrive for Business' y compartir el enlace aquí. (aviso: no adjunte ningún dato confidencial)

saludos
Xiaoxin Sheng

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.
Anonymous
Not applicable

Hola @v-shex-msft,

Muchas gracias, creo que ya casi llegamos. El filtro funciona casi como se desea. DE-001 y DE-005 se muestran correctamente.

Sin embargo, se muestran DE-002 y DE-003, que deben filtrarse y falta DE-004, aunque cumple los criterios.

Measure 3.jpg

Puede encontrar todos los datos aquí: https://www.magentacloud.de/share/bsog4e.dlt

Hola @Sigmund,

¿Quieres decir que todavía quieres mantener el efecto de filtro en tu mesa? si este es un caso, puede utilizar allselected para reemplazar todas las funciones, mantendrá los efectos de filtro actuales:

Measure =
VAR currID =
    VALUES ( Table1[ID] )
VAR list =
    CALCULATETABLE (
        VALUES ( Table2[ID] ),
        FILTER ( ALLSELECTED ( Table2 ), [isValid] = 1 && [isComplete] = 1 )
    )
RETURN
    IF ( COUNTROWS ( INTERSECT ( cuddID, list ) ) = 0, "Y", "N" )

Aviso: estas tablas no deben vincularse en función de la relación o estos efectos de filtro también se aplicarán a los objetos visuales.

Gestión de "todas" funciones en DAX: ALL, ALLSELECTED, ALLNOBLANKROW, ALLEXCEPT

saludos

Xiaoxin Sheng

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.
Anonymous
Not applicable

Hola @v-shex-msft,

Parece que ALLSELECTED funciona de manera diferente de lo esperado. Con los datos de prueba que se muestran a continuación, obtengo en algunos casos el mismo resultado que cuando estoy usando un INTERSECT de Table11 y Table22.

Esto me llevó a la siguiente solución rápida y sucia.

1. Interseque de la Tabla11 y la Tabla22 para averiguar todos los datos de identificación que no están incluidos en el Cuadro22.

T1withOutT2 = 
VAR currID =
    VALUES ( Table11[ID] )
VAR list =
    VALUES ( Table22[ID] )
RETURN
    IF ( COUNTROWS ( INTERSECT ( currID; list ) ) = 0; "1"; "2" )

2. Filtrar a los de la tabla2 que cumplan los criterios.

T2isFalse = 
VAR currID =
    VALUES ( Table11[ID] )
VAR list =
    CALCULATETABLE (
        VALUES ( Table22[ID] );
        FILTER ( Table22 ; [isValid] = 0 && [isComplete] = 0 )
    )
RETURN
    IF ( COUNTROWS ( INTERSECT ( currID; list ) ) = 0; "1"; "2" )

3. Para filtrar falsos negativos (en este caso es DE-004) utilicé la medida notFalse und filtró el objeto visual. Si luego filtra notFalse para que no sea igual a 3, obtendrá el resultado deseado.

notFalse = [T1withOutT2]+[T2isFalse]

QDSolution.jpg

Por lo que veo, funciona. Pero por favor ayúdame a encontrar una solución más elegante. ¡Muchas gracias!

Saludos

Sigmund

Hola @Sigmund,

Según la instantánea, parece que me olvido de agregar una condición para comprobar si la tabla 1 id existe en la tabla 2.I modificar la fórmula de medida para agregar la condición para confirmar esa situación:

Measure =
VAR T1List =
    VALUES ( Table11[ID] )
VAR T2List =
    CALCULATETABLE (
        VALUES ( Table22[ID] );
        FILTER ( Table22; ( [isValid] = 0 && [isComplete] = 0 ) || [ID] IN currID )
    )
RETURN
    IF ( COUNTROWS ( INTERSECT ( T1List; T2List ) ) = 0; "Y"; "N" )

saludos

Xiaoxin Sheng

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.
Anonymous
Not applicable

Hola @v-shex-msft,

Gracias, ¿te referías?

Measure = 
VAR T1List =
    VALUES ( Table11[ID] )
VAR T2List =
    CALCULATETABLE (
        VALUES ( Table22[ID] );
        FILTER ( Table22; ( [isValid] = 0 && [isComplete] = 0 ) || [ID] IN T1List )
    )
RETURN
    IF ( COUNTROWS ( INTERSECT ( T1List; T2List ) ) = 0; "Y"; "N" )

El resultado no difiere de la medida anterior en función de los datos de prueba.

Measure.jpg

Anonymous
Not applicable

Hola@v-shex-msft,

Parece, que ALLSELECTED funciona de manera diferente de lo esperado https://www.sqlbi.com/articles/the-definitive-guide-to-allselected/ . Con los datos de prueba que se muestran a continuación, obtengo en algunos casos el mismo resultado que cuando estoy usando un INTERSECT de Table11 y Table22.

Esto me llevó a la siguiente solución rápida y sucia:

1. Interseque de la Tabla11 y la Tabla22 para averiguar todos los datos de identificación que no están incluidos en el Cuadro22.

T1withOutT2 = 
VAR currID =
    VALUES ( Table11[ID] )
VAR list =
    VALUES ( Table22[ID] )
RETURN
    IF ( COUNTROWS ( INTERSECT ( currID; list ) ) = 0; "1"; "2" )

2. Filtrar a los de la Tabla22 que cumplan los criterios.

T2isFalse = 
VAR currID =
    VALUES ( Table11[ID] )
VAR list =
    CALCULATETABLE (
        VALUES ( Table22[ID] );
        FILTER ( Table22 ; [isValid] = 0 && [isComplete] = 0 )
    )
RETURN
    IF ( COUNTROWS ( INTERSECT ( currID; list ) ) = 0; "1"; "2" )

3. Para filtrar falsos negativos (en este caso DE-004) utilicé la medida notFalse und filtró el objeto visual. Si ahora filtro notFalse con unequal 3, obtengo el resultado deseado.

notFalse = [T1withOutT2]+[T2isFalse]

QDSolution.jpg

Por lo que veo, funciona. Pero por favor ayúdame a encontrar una solución más elegante. ¡Muchas gracias!

Saludos
Sigmund

amitchandak
Super User
Super User

Si Table1 es una tabla maestra para la tabla 2, puede unirlos de ID

Puede crear una medida como

Calculate(count(Table2[ID]),Table2[isValid]-1,Table2[isComplete]-1)

Y usar que es usted visual, que debe funcionar

Anonymous
Not applicable

Hola @amitchandak,

Gracias por su apoyo. Cuando estoy usando este código, solo cuenta los iDE que cumplen los criterios, pero no veo los iDs filtrados como quiero. Además de eso, la medida se basa en la Tabla2. Entonces, ¿qué debo hacer?

CALCULATE(COUNT(Table2[ID]); Table2[isValid]=0; Table2[isComplete]=0)

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

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

Top Solution Authors