Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers!
Enter the sweepstakes now!Prepping for a Fabric certification exam? Join us for a live prep session with exam experts to learn how to pass the exam. Register now.
Estoy seguro de que hay una manera fácil de hacer esto, pero todas las formas que intento no producen el resultado esperado. Tengo una tabla con una gran variedad de categorías y una serie de columnas con valores. Desafortunadamente, no puedo compartir los datos, pero aquí hay una versión muy simplificada:
Nivel 1 | Nivel 2 | Nivel 3 | Nivel 4 | Nivel 5 | País | Hasta la fecha | Final |
Producto | Consumibles | Víveres | Fruta | Manzanas | Alemania | 10 | 20 |
Producto | Consumibles | Víveres | Fruta | Naranjas | Francia | 5 | 15 |
Producto | Consumibles | Víveres | Verduras | Zanahoria | España | 10 | 15 |
Producto | Consumibles | Víveres | Verduras | Cebollas | Francia | 0 | 5 |
Producto | Electrónica | Aparatos | Televisores | Samsung (Estados Unidos) | Alemania | 20 | 30 |
Producto | Electrónica | Aparatos | Televisores | Phillips | Francia | 15 | 25 |
Los tengo presentados en una matriz visual con los niveles en este orden. 'País' y muchos otros campos no están presentes en el visual, sino que son filtros; algunos aplicados por mí, otros pueden ser cambiados por los usuarios en un slicer. Estoy tratando de calcular el porcentaje de los valores finales para los valores YTD (es decir. YTD/Final, por lo que las manzanas en Alemania serían 10/20 = 50%) por lo que puedo usar esto como parte de una proyección para el próximo año en el que aún no se conocen los valores finales. Este no es el problema para la mayoría de las filas; el problema es que cuando tengo una situación en la que el YTD es cero, quiero subir el cálculo un nivel y usar los valores agregados de Nivel 4 en lugar de los valores de Nivel 5. En este ejemplo, eso significaría que para las cebollas en Francia, no puedo dividir 0 entre 5, por lo que en su lugar el cálculo usaría el total de verduras y dividiría 10 entre 20 para obtener el 50%. En otras palabras, todo lo que quiero hacer es escribir una medida que generalmente emplee el cálculo estándar de Nivel 5, pero si ese YTD de Nivel 4 es cero, use los valores que la matriz mostraría de forma predeterminada si colapsara el Nivel 5 y la hiciera mostrar totales de Nivel 4 en su lugar.
He probado cosas como ALL, ALLEXCEPT, ALLSELECTED, REMOVEFILTERS en varias combinaciones en el objeto visual para intentar obtener la suma de todos los valores de Nivel 5 dentro de una categoría de Nivel 4. Estos parecen no hacer nada (es decir, producen los mismos valores de nivel de fila que la suma estándar) o eliminan demasiados de los otros filtros (es decir, ignoran filtros como Country). Incluso cuando especifico que quiero mantener esos filtros, todavía no puedo hacer que la agregación de nivel 5 se sume a la suma de los valores. También hay filtros de medida en este objeto visual que no parece ser posible incluir en la lógica de ALLEXCEPT, por lo que no estoy seguro de que sea posible especificar el mantenimiento de todos los demás filtros. Esto parece que debería ser muy fácil porque solo puedo ver las agregaciones que quiero allí mismo en la matriz, ¡pero ponerlas en una medida me está eludiendo!
Solved! Go to Solution.
Hi @Y1009666
Hi @Y1009666
Increíble, esto funciona tal como quería, ¡gracias!
Hi @Y1009666 ,
Para controlar este escenario en DAX, queremos una medida que primero calcule el porcentaje de YTD sobre Final en el nivel más granular (Nivel 5). Sin embargo, si el valor YTD es cero, queremos que el cálculo vuelva al siguiente nivel (Nivel 4), sumando los valores YTD y Final para todo el grupo de Nivel 4 mientras se respetan los filtros externos como País. A continuación, le indicamos cómo puede escribir la medida DAX para lograrlo:
Projection % =
VAR YTD_Level5 = CALCULATE(SUM('YourTable'[YTD]))
VAR Final_Level5 = CALCULATE(SUM('YourTable'[Final]))
VAR YTD_Level4 = CALCULATE(SUM('YourTable'[YTD]), REMOVEFILTERS('YourTable'[Level 5]))
VAR Final_Level4 = CALCULATE(SUM('YourTable'[Final]), REMOVEFILTERS('YourTable'[Level 5]))
RETURN
IF(
YTD_Level5 <> 0 && Final_Level5 <> 0,
DIVIDE(YTD_Level5, Final_Level5),
DIVIDE(YTD_Level4, Final_Level4)
)
Esta medida comprueba si el nivel 5 hasta la fecha es distinto de cero y utiliza ese valor directamente. Si el YTD es cero (o Final es cero), quita el filtro de nivel 5 para calcular los totales del nivel 4 en su lugar, mientras se mantienen todos los demás filtros en su lugar (como País o cualquier otra cosa seleccionada en las segmentaciones). Esto garantiza que obtenga una agregación de reserva precisa que coincida con lo que mostraría el objeto visual de matriz si se contrajera el nivel 5. Avísame si también necesitas una alternativa al Nivel 3, ya que se puede ampliar aún más con la misma lógica.
Saludos
Gracias por la respuesta: esto no parecía eliminar el contexto de la fila del Nivel 5 y, en cambio, producía el mismo resultado que hacer el cálculo en los valores estándar. ¡La otra solución ha funcionado de todos modos!
Gracias por la respuesta: esto no parecía eliminar el contexto de la fila del Nivel 5 y, en cambio, producía el mismo resultado que hacer el cálculo en los valores estándar. ¡La otra solución ha funcionado de todos modos!
Check out the April 2025 Power BI update to learn about new features.
Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.