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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

Mejore el rendimiento de la medida con IF(CALCULATE() anidado

Hola


Tengo la necesidad de mostrar diferentes funciones CALCULATE(SUM() dependiendo de la selección del usuario (período, 'colaborador')

Funciona, sin embargo, el rendimiento es muy pobre cuando intento mostrar los datos subyacentes línea por línea en una tabla.

¿Alguna idea de cómo se podría mejorar esta medida? Me doy cuenta de que probablemente no sea el más eficiente. Usar SWITCH(TRUE()) parece un poco mejor

Muchas gracias.

Contrib FlexQ SUMMARY =
VAR selectperiod =
    SELECTEDVALUE ( '** Period Create'[Period] )
VAR selectcontrib =
    SELECTEDVALUE ( '** Contributor'[Contrib] )
VAR periodq =
    VALUE ( MID ( SELECTEDVALUE ( '** Period Create'[Period] ), 2, 1 ) )
VAR Q1_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER (
            'CX Cloud Pipeline',
            'CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1"
        )
    )
VAR Q2_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER (
            'CX Cloud Pipeline',
            'CX Cloud Pipeline'[DME Handover Quarter] = BLANK ()
                && 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022
        )
    )
VAR FY_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER (
            'CX Cloud Pipeline',
            'CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1"
                || ( 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022 )
        )
    )
VAR Q1 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER (
            'CX Cloud Pipeline',
            'CX Cloud Pipeline'[Creation Quarter] = "2022-Q1"
        )
    )
VAR Q2 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER (
            'CX Cloud Pipeline',
            'CX Cloud Pipeline'[Creation Quarter] = "2022-Q2"
        )
    )
VAR FY =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER ( 'CX Cloud Pipeline', 'CX Cloud Pipeline'[Creation Year] = 2022 )
    )
VAR R4Q =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        FILTER (
            'CX Cloud Pipeline',
            'CX Cloud Pipeline'[Closing Quarter] = "2022-Q2"
                || 'CX Cloud Pipeline'[Closing Quarter] = "2022-Q3"
                || 'CX Cloud Pipeline'[Closing Quarter] = "2022-Q4"
                || 'CX Cloud Pipeline'[Closing Quarter] = "2023-Q1"
        )
    )
RETURN
    SWITCH (
        TRUE (),
        selectperiod = "R4Q", R4Q,
        selectperiod = "Q122"
            && selectcontrib = "DME", Q1_DME,
        selectperiod = "Q222"
            && selectcontrib = "DME", Q2_DME,
        selectperiod = "FY22"
            && selectcontrib = "DME", FY_DME,
        selectperiod = "Q122"
            && selectcontrib <> "DME", Q1,
        selectperiod = "Q222"
            && selectcontrib <> "DME", Q2,
        selectperiod = "FY22"
            && selectcontrib <> "DME", FY
    )

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

I'Estoy molesto debido a la tabla de horas de fecha automática detrás de [Fecha de entrada de fase] . Mejor si tuviera una tabla de fechas adecuada o un coulmn simple para el trimestre como lo tiene para la columna [DME Handover Quarter]


De nuevo, sin mirar tu modelo,'En realidad, estoy guiñando por su código cómo se ve, así que pruebe esto:

Contrib FlexQ SUMMARY =
VAR selectperiod =
    SELECTEDVALUE ( '** Period Create'[Period] )
VAR selectcontrib =
    SELECTEDVALUE ( '** Contributor'[Contrib] )
VAR periodq =
    VALUE ( MID ( selectperiod, 2, 1 ) )
VAR Q1_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1")
    )
VAR Q2_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
        		SUMMARIZE(
        			ALL('CX Cloud Pipeline'),
	        		'CX Cloud Pipeline'[DME Handover Quarter],
	        		'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        		'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
	            'CX Cloud Pipeline'[DME Handover Quarter] = BLANK ()
	                && 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
	                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022
	           )
        )
    )
VAR FY_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
        		SUMMARIZE(
        			ALL('CX Cloud Pipeline'),
	        		'CX Cloud Pipeline'[DME Handover Quarter],
	        		'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        		'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
            'CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1"
                || ( 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022 )
        	)
        )
    )
VAR Q1 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[Creation Quarter] = "2022-Q1")
    )
VAR Q2 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[Creation Quarter] = "2022-Q2")
    )
VAR FY =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS('CX Cloud Pipeline'[Creation Year] = 2022 )
    )
VAR R4Q =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
			KEEPFILTERS('CX Cloud Pipeline'[Closing Quarter] IN { "2022-Q2", "2022-Q3", "2022-Q4", "2023-Q1"} ))
RETURN
    SWITCH (
        TRUE (),
        selectperiod = "R4Q", R4Q,
        selectperiod = "Q122"
            && selectcontrib = "DME", Q1_DME,
        selectperiod = "Q222"
            && selectcontrib = "DME", Q2_DME,
        selectperiod = "FY22"
            && selectcontrib = "DME", FY_DME,
        selectperiod = "Q122"
            && selectcontrib <> "DME", Q1,
        selectperiod = "Q222"
            && selectcontrib <> "DME", Q2,
        selectperiod = "FY22"
            && selectcontrib <> "DME", FY
    )

View solution in original post

7 REPLIES 7
Syndicate_Admin
Administrator
Administrator

I'Estoy molesto debido a la tabla de horas de fecha automática detrás de [Fecha de entrada de fase] . Mejor si tuviera una tabla de fechas adecuada o un coulmn simple para el trimestre como lo tiene para la columna [DME Handover Quarter]


De nuevo, sin mirar tu modelo,'En realidad, estoy guiñando por su código cómo se ve, así que pruebe esto:

Contrib FlexQ SUMMARY =
VAR selectperiod =
    SELECTEDVALUE ( '** Period Create'[Period] )
VAR selectcontrib =
    SELECTEDVALUE ( '** Contributor'[Contrib] )
VAR periodq =
    VALUE ( MID ( selectperiod, 2, 1 ) )
VAR Q1_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1")
    )
VAR Q2_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
        		SUMMARIZE(
        			ALL('CX Cloud Pipeline'),
	        		'CX Cloud Pipeline'[DME Handover Quarter],
	        		'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        		'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
	            'CX Cloud Pipeline'[DME Handover Quarter] = BLANK ()
	                && 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
	                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022
	           )
        )
    )
VAR FY_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
        		SUMMARIZE(
        			ALL('CX Cloud Pipeline'),
	        		'CX Cloud Pipeline'[DME Handover Quarter],
	        		'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        		'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
            'CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1"
                || ( 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022 )
        	)
        )
    )
VAR Q1 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[Creation Quarter] = "2022-Q1")
    )
VAR Q2 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[Creation Quarter] = "2022-Q2")
    )
VAR FY =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS('CX Cloud Pipeline'[Creation Year] = 2022 )
    )
VAR R4Q =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
			KEEPFILTERS('CX Cloud Pipeline'[Closing Quarter] IN { "2022-Q2", "2022-Q3", "2022-Q4", "2023-Q1"} ))
RETURN
    SWITCH (
        TRUE (),
        selectperiod = "R4Q", R4Q,
        selectperiod = "Q122"
            && selectcontrib = "DME", Q1_DME,
        selectperiod = "Q222"
            && selectcontrib = "DME", Q2_DME,
        selectperiod = "FY22"
            && selectcontrib = "DME", FY_DME,
        selectperiod = "Q122"
            && selectcontrib <> "DME", Q1,
        selectperiod = "Q222"
            && selectcontrib <> "DME", Q2,
        selectperiod = "FY22"
            && selectcontrib <> "DME", FY
    )

Hola @SpartaBI, ahora usando esta medida en una tabla, tengo que agregar un filtro visual para "la medida no está en blanco" ya que la tabla devuelve todas las filas, solo con un valor en blanco donde la medida no está en el alcance.

¿Tienes alguna idea de cómo evitar eso sin usar el filtro visual? Me doy cuenta de que podría haber una mejor manera.


Muchas gracias de nuevo

No estoy seguro de entender lo que está experimentando, pero puede intentar reemplazar las funciones 'ALL' con 'ALLNOBLANKROW'. Tal vez eso haga el truco

qmartiny_0-1650633570172.png

Aquí hay un ejemplo que usa esa medida en una tabla: supongo que es porque solo está tirando solo de la tabla y agregar la medida en la parte superior no le dice a powerbi que solo muestre las filas donde la medida no está vacía.

¿Es esa la única medida en su tabla? ¿Qué es el icono de enlace allí? Es otro valor de url de una medida differnet, ¿verdad? En caso afirmativo, que no es culpa de nuestra medida, ve esa fila, y sí, debe usar ese filtro de nivel visual o filtrar todas las demás medidas para dejar en blanco cuando nuestra medida está en blanco. Es difícil saber qué opción será mejor 🙂

Syndicate_Admin
Administrator
Administrator

@qmartiny Lo hice muy rápido y no puedo verificar el código de control de calidad, pero pruebe esto 🙂

Contrib FlexQ SUMMARY =
VAR selectperiod =
    SELECTEDVALUE ( '** Period Create'[Period] )
VAR selectcontrib =
    SELECTEDVALUE ( '** Contributor'[Contrib] )
VAR periodq =
    VALUE ( MID ( selectperiod, 2, 1 ) )
VAR Q1_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1")
    )
VAR Q2_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
	        	ALL(
	        	'CX Cloud Pipeline'[DME Handover Quarter],
	        	'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        	'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
	            'CX Cloud Pipeline'[DME Handover Quarter] = BLANK ()
	                && 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
	                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022
	           )
        )
    )
VAR FY_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
	        	ALL(
	        	'CX Cloud Pipeline'[DME Handover Quarter],
	        	'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        	'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
            'CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1"
                || ( 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022 )
        	)
        )
    )
VAR Q1 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[Creation Quarter] = "2022-Q1")
    )
VAR Q2 =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
		KEEPFILTERS('CX Cloud Pipeline'[Creation Quarter] = "2022-Q2")
    )
VAR FY =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS('CX Cloud Pipeline'[Creation Year] = 2022 )
    )
VAR R4Q =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
			KEEPFILTERS('CX Cloud Pipeline'[Closing Quarter] IN { "2022-Q2", "2022-Q3", "2022-Q4", "2023-Q1"} )
RETURN
    SWITCH (
        TRUE (),
        selectperiod = "R4Q", R4Q,
        selectperiod = "Q122"
            && selectcontrib = "DME", Q1_DME,
        selectperiod = "Q222"
            && selectcontrib = "DME", Q2_DME,
        selectperiod = "FY22"
            && selectcontrib = "DME", FY_DME,
        selectperiod = "Q122"
            && selectcontrib <> "DME", Q1,
        selectperiod = "Q222"
            && selectcontrib <> "DME", Q2,
        selectperiod = "FY22"
            && selectcontrib <> "DME", FY
    )


Incluso si me perdí algo, creo que verás el problema principal:
Cambié todos sus filtros de ejecutar sus filtros en todas las tablas (BIG NO NO 😄) a solo ejecutarlos en las columnas que usó para las condiciones.

Déjame saber cómo fue

@SpartaBI !

¡Muchas gracias por investigar esto!

Recibo el error "Todos los argumentos de columna de la función ALL/ALLNOBLANKROW/ALLSELECTED deben ser de la misma tabla".

ACTUALIZAR:

Aparece un error en el FY_DME.

ACTUALIZACIÓN 2 :
Incluso eliminar esto parece arrojar un error de todos modos. Sin embargo, la lógica parece estar bien

VAR FY_DME =
    CALCULATE (
        SUM ( 'CX Cloud Pipeline'[acv €] ),
        KEEPFILTERS(
        	FILTER(
	        	ALL(
	        	'CX Cloud Pipeline'[DME Handover Quarter],
	        	'CX Cloud Pipeline'[Phase Since Date].[QuarterNo],
	        	'CX Cloud Pipeline'[Phase Since Date].[Year]
	        	),
            'CX Cloud Pipeline'[DME Handover Quarter] = "2022-Q1"
                || ( 'CX Cloud Pipeline'[Phase Since Date].[QuarterNo] = 2
                && 'CX Cloud Pipeline'[Phase Since Date].[Year] = 2022 )
        	)
        )
    )

Le agradezco si tiene algún pensamiento. Seguiré mirando a mi lado.


Que tengas un gran día

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

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

April Fabric Community Update

Fabric Community Update - April 2024

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