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

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.

Reply
Syndicate_Admin
Administrator
Administrator

Creación de una medida que replique la agregación SUMIF/matriz

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 1Nivel 2Nivel 3Nivel 4Nivel 5PaísHasta la fechaFinal
ProductoConsumiblesVíveresFrutaManzanasAlemania1020
ProductoConsumiblesVíveresFrutaNaranjasFrancia515
ProductoConsumiblesVíveresVerdurasZanahoriaEspaña

10

15

ProductoConsumiblesVíveresVerdurasCebollasFrancia05
ProductoElectrónicaAparatosTelevisoresSamsung (Estados Unidos)Alemania2030
ProductoElectrónicaAparatosTelevisoresPhillipsFrancia1525

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!

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

Hi @Y1009666

% de algo =
VAR SYTD = SUMA('Mesa'[YTD])
VAR FYTD = SUMA('Mesa'[Final])
DEVOLUCIÓN
INTERRUPTOR(
VERDADERO()
,ISINSCOPE('Mesa'[Nivel 5]) && SYTD > 0
,SUMA('Mesa'[YTD])/SUMA('Mesa'[Final])
,ISINSCOPE('Mesa'[Nivel 4]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 1])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 5]))
,ISINSCOPE('Mesa'[Nivel 3]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 2])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 4]))
,ISINSCOPE('Mesa'[Nivel 2]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 3])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 3]))
,ISINSCOPE('Mesa'[Nivel 1]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 2])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 1]))
)
SamWiseOwl_0-1745598062280.png

View solution in original post

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

Hi @Y1009666

% de algo =
VAR SYTD = SUMA('Mesa'[YTD])
VAR FYTD = SUMA('Mesa'[Final])
DEVOLUCIÓN
INTERRUPTOR(
VERDADERO()
,ISINSCOPE('Mesa'[Nivel 5]) && SYTD > 0
,SUMA('Mesa'[YTD])/SUMA('Mesa'[Final])
,ISINSCOPE('Mesa'[Nivel 4]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 1])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 5]))
,ISINSCOPE('Mesa'[Nivel 3]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 2])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 4]))
,ISINSCOPE('Mesa'[Nivel 2]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 3])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 3]))
,ISINSCOPE('Mesa'[Nivel 1]) && SYTD <> 0 || FILTRADO('Mesa'[Nivel 2])
,CALCULAR(SUMA('Mesa'[YTD])/SUMA('Mesa'[Final]),TODOS SELECCIONADOS('Mesa'[Nivel 1]))
)
SamWiseOwl_0-1745598062280.png

Increíble, esto funciona tal como quería, ¡gracias!

Syndicate_Admin
Administrator
Administrator

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!

Helpful resources

Announcements
PBIApril_Carousel

Power BI Monthly Update - April 2025

Check out the April 2025 Power BI update to learn about new features.

Notebook Gallery Carousel1

NEW! Community Notebooks Gallery

Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.

April2025 Carousel

Fabric Community Update - April 2025

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

Top Solution Authors
Top Kudoed Authors