Check your eligibility for this 50% exam voucher offer and join us for free live learning sessions to get prepared for Exam DP-700.
Get StartedDon't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.
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
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
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
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)
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
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.
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
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.
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
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]
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
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.
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]
Por lo que veo, funciona. Pero por favor ayúdame a encontrar una solución más elegante. ¡Muchas gracias!
Saludos
Sigmund
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
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)