Get certified in Microsoft Fabric—for free! For a limited time, the Microsoft Fabric Community team will be offering free DP-600 exam vouchers. Prepare now
Hola comunidad,
Este es mi modelo de datos simplificado:
Objetivo: Estoy tratando de resaltar valores en una tabla de informes (bastante similar a los resultados de la tabla) que están por debajo del límite mínimo (un color) o por encima de los objetivos de límite máximo (otro color).
En el ejemplo, solo hay una columna Mg en Resultados y un par de columnas Mín. y Máx. en Objetivos. En realidad tengo muchas columnas como Mg en Resultados y, por lo tanto, límites correspondientes para cada uno en Objetivos. La razón por la que existe la tabla Targets es que cambian con el tiempo, por lo que una persona agrega un nuevo conjunto de objetivos a una base de datos que se puede usar para muestras más adelante. Por lo tanto, no puedo establecer valores estáticos en formato condicional para cada columna, sino que debo basarla en la tabla Targets.
Para cada entrada (ResultID) necesito verificar el valor de Mg contra MgMin y MgMax correspondientes de Targets en función de TargetID coincidente para una muestra individual.
Intentos fallidos: Intenté crear una nueva columna en Resultados con el uso de la función IF para obtener -1 cuando está por debajo, 0 cuando está dentro y 1 cuando está por encima de los límites. Eso se puede usar en formato conditonal para cada columna para establecer tres colores de degradado personalizados. Puede ser solo SUMA, CONTAR, etc. sin embargo, y no puedo encontrar la manera de filtrar las filas dentro de una columna en función de TargetID coincidente.
Me gustaría mucho si alguien me indicara la dirección correcta, ya sea sugiriendo la fórmula DAX o incluso un tipo diferente de solución.
Estoy atascado en esto durante dos días, traté de buscar en este foro y otros (Quora, Stackoverflow), incluso pidiéndole ayuda a uno de los modelos de lenguaje de IA, pero aún no puedo encontrar una solución que funcione.
¡Gracias por sus respuestas!
Atentamente
Jacob
@JacobMotu Me alegro de escuchar eso, compañero. Gracias por su amable comentario y conocimiento de lo que la Comunidad y sus miembros son. Sin duda es lo que me hizo enamorarme de Power BI. ¡Te deseo todo lo mejor compañero y espero verte aquí de vez en cuando! 🙂
Theo, gracias por la orientación y el apoyo. Soy muy consciente de que la gente responde aquí en su tiempo libre sin ninguna obligación con nadie ni nada. Es genial saber que las personas de la comunidad se ayudan mutuamente. Probablemente mi primera pero no la última aparición aquí 🙂
Saludos compañero.
@JacobMotu si lo haces funcionar de la manera que quieres, ¡corre con él a lo grande! La parte hermosa de Power BI (que también puede ser su debilidad), es que hay muchas maneras de lograr el mismo resultado (o estrechamente alineado).
¡Bien hecho al ir y encontrar la salida que buscabas! Me complació ver que no te contuviste y solo esperaste respuestas. En cambio, saliste a buscarlos hasta que obtuviste el correcto. ¡Una actitud excepcional para tener, compañero!
¡Bien hecho y sigue haciendo grandes cosas!
Seguir 🙂
Ya agregué el enlace para un archivo pbix de prueba en mi publicación original ayer, pero olvidé mencionarlo en la publicación anterior.
Utilizo esta fórmula que funciona para mí ahora:
MgCheck =
VAR MgMinCheckVar =
SUMX(
Targets,
CALCULATE(
SUM(Targets[MgMin]),
Samples[TargetID] = EARLIER(Targets[TargetID])
)
)
VAR MgMaxCheckVar =
SUMX(
Targets,
CALCULATE(
SUM(Targets[MgMax]),
Samples[TargetID] = EARLIER(Targets[TargetID])
)
)
RETURN
SWITCH(
TRUE(),
Results[Mg] > MgMaxCheckVar, 1,
Results[Mg] < MgMinCheckVar, -1,
0
)
Probablemente no sea la fórmula más simple ni la más eficiente, pero hace el trabajo. También la mayoría de las soluciones anteriores funcionan.
La razón por la que siguió dándome todos esos errores fue porque solo hay una relación con las tablas de destino, que es la que tiene la tabla de muestras, pero la dirección del filtro cruzado se estableció en Único. Una vez que cambié eso a Ambos, funciona. Me di cuenta de eso solo porque todo funcionaba en el modelo de prueba donde Ambos estaba seleccionado de forma predeterminada. Espero que no cause ningún problema en el futuro con otras imágenes. Pero debido a que incluso en mi modelo real solo hay una relación con la tabla Target, no hay ambigüedad.
Gracias de antemano por tu reacción Theo. Espero que no me demuestres que estoy equivocado en esto 🙂
¿Puede crear un archivo PBIX que tenga datos ficticios y coincida con su modelo de relación exacto y asegúrese de que los formatos / tipos de datos sean idénticos a los de su modelo real?
Si puedes hacer eso, podré ayudarte más.
Gracias compañero.
Seguir
Así que hoy alimenté las tablas con más entradas de prueba solo para tener más filas en todas partes.
Objetivos: 4 filas
Muestras: 3 filas
Resultados: 3x20 filas (20 por muestra)
Desafortunadamente, ninguna de las soluciones anteriores funciona 😓
InRange (msg 4) me da "Se proporcionó una tabla de múltiples valores donde se esperaba un solo valor".
Verifique los resultados (msg 5) con una salida incorrecta y cuando probé cada parte, ninguna de ellas funciona correctamente.
El interruptor (msg 6) me da "No se puede determinar un solo valor para la columna 'MgMax' en la tabla 'Objetivos'. Esto puede suceder cuando una fórmula de medida hace referencia a una columna que contiene muchos valores sin especificar una agregación como min, max, count o sum para obtener un solo resultado.
Me estoy desparete. ¿Todavía podrías ayudarme, por favor? Leí la documentación sobre learn.microsoft.com para la sintaxis y la explicación de las funciones y tratando de resolver esto, pero no hay resultados positivos. Al menos aprendí a completar más entradas antes de probar cualquier cosa 🙂
¡Muchas gracias!
Podría valer la pena probar algo como lo siguiente en una columna calculada si desea una instrucción de estilo if anidada.
SWITCH
( TRUE () ,
Results[Mg] > Targets[MgMax] , 0 ,
Results[Mg] > Targets[MgMin] , -1 ,
1 )
De lo contrario, siempre puede integrar una instrucción IF con mi solución anterior también.
Espero que esto ayude al mate.
Seguir
Eres una leyenda, muchas gracias. Justo un minuto antes de su respuesta encontré una solución similar. Con CALCULATE, según entiendo, me da solo 1 booleano para sí (dentro de un rango) y 0 para no (no dentro de un rango). Con el mío obtengo -1,0,1 basado en si está por debajo de min, dentro o por encima del máximo:
Check = IF(
SUMX(
Targets,
CALCULATE(
SUM(Results[Mg]),
Samples[TargetID] = EARLIER(Targets[TargetID])
)
) < SUM(Targets[MgMin]), -1,
IF(
SUMX(
Targets,
CALCULATE(
SUM(Results[Mg]),
Samples[TargetID] = EARLIER(Targets[TargetID])
)
) > SUM(Targets[MgMax]), 1,
0
)
)
Ahora funciona con solo una fila en Targets y con solo una entrada de muestra (dos filas de resultados) rellenada. Espero que funcione con más datos, necesito probar.
Valoro mucho tu ayuda, gracias por tu tiempo Theo!
Disculpas, solo ignora la anterior. Acabo de reconstruir una versión similar de su modelo excluyendo las relaciones.
Prueba esta columna calculada:
In_Range =
CALCULATE (
VALUES ( Targets[TargetID] ) ,
FILTER ( Targets , Targets[MgMin] <= EARLIER ( Results[Mg] ) && Targets[MgMax] >= EARLIER ( Results[Mg] ) ) )
Hola Theo,
Gracias por su respuesta. Recibo este error:
No entiendo por qué porque en la tabla Targets solo tengo una fila con TargetID de "1".
Puede crear una columna calculada para lograr lo que busca.
In_Range =
VAR SelectedValue = Results[Mg]
RETURN
IF (
MINX (
ALL ( Targets ) , Targest[MgMin] ) <= SelectedValue
&& MAXX ( ALL ( Targets ) , Targets[MgMax] ) >= SelectedValue,
Targets[TargetID] , 0
)
Es posible que deba ajustar las entradas para obtener la salida deseada, sin embargo, el resultado debería darle 1 donde es VERDADERO y 0 donde no lo es.
Déjame saber cómo va.
Seguir