Forum Discussion

qmartiny's avatar
qmartiny
Helper III
4 years ago
Solved

Improve Measure Performance with nested IF(CALCULATE()

Hello,


I have the need to display different CALCULATE(SUM() functions depending on user selection (period, 'contributor')

It works, however the performance is very poor when I try to display the underlying data line by line in a table.

 

Any idea how this measure could be improved? I realise it's probably not the most efficient. Using SWITCH(TRUE()) seems a bit better

 

 

Thanks a lot.

 

 

 

 

 

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
    )

 

  • I'm gussing becasue of the auto date time table behind the [Phase Since Date] . Better if you had a proper date table or a simple coulmn for the quarter like you have for the [DME Handover Quarter] column


    Again, without looking at your model, I'm actually gussing by your code how it looks like ‌‌ so try this:

    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
        )

     

7 Replies

  • SpartaBI's avatar
    SpartaBI
    Community Champion

    qmartiny I did it really quick and I can't check the code for QA but try this 🙂

     

    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
        )

     


    Even if I missed something I think you'll see the main issue:
    I changed all your filters from running their filters on the entire tables (BIG NO NO 😄) to only running them on the columns you used for conditions.

    Let me know how it went
     

    • qmartiny's avatar
      qmartiny
      Helper III

      Hi SpartaBI  !

       

      Thank you very much for looking into this !

       

       

      I am getting the error "All column arguments of the ALL/ALLNOBLANKROW/ALLSELECTED function must be from the same table."

       

       

      UPDATE :

      Error appears on the FY_DME.

       

      UPDATE 2 :
      Even removing this seems to throw an error anyway. logic seems ok though

      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 )
              	)
              )
          )

      I appreciate if you have any thoughts. I will continue to look on my side.


      Have a great day

  • SpartaBI's avatar
    SpartaBI
    Community Champion

    I'm gussing becasue of the auto date time table behind the [Phase Since Date] . Better if you had a proper date table or a simple coulmn for the quarter like you have for the [DME Handover Quarter] column


    Again, without looking at your model, I'm actually gussing by your code how it looks like ‌‌ so try this:

    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
        )

     

    • qmartiny's avatar
      qmartiny
      Helper III

      Hi SpartaBI,, now using this measure in a table, I have to add a visual filter for "measure is not blank" since the table returns all rows, just with a blank value where the measure isnt in scope.

       

      Do you have any idea how to go around that without using the visual filter? I realise there might be a better way.


      Thanks a lot again

      • SpartaBI's avatar
        SpartaBI
        Community Champion

        Not sure I understand what you are experiencing, but you can try replacing the 'ALL' functions with 'ALLNOBLANKROW". Maybe that will do the trick