Power BI: exclude the filter selection from the calculation

To calculate the values of the non-selected options of a slicer, there are few things to do before like to create a new table and a measure so I have this data and this simple visualization:

power bi power bi

I will create a new table in order to extract the unique values of the “support” and “type” column:

power bi

NOTE:

power bi

I will create a measure with this formula:


var result=CALCULATE(COUNT('table1'[argument1]),KEEPFILTERS(EXCEPT(ALL('table1'[argument2]),ALLSELECTED('table2'[argument1]))))
return
IF(ISFILTERED('table2'[argument1]),result,COUNT('table1'[argument1]))
power bi

NOTE: change “table” and “argument” by yours

Now that I have everything set, I will create a slicer with the new table and add the measure in my visualization table:

power bi

If I select “cx”, the measure calculates everything except this selection:

power bi

If my slicer has multiple layers, I will have to use this formula:


var allexc1=EXCEPT(ALL('table1'[argument2]),ALLSELECTED('table2'[argument1]))
var allexc2=EXCEPT(ALL('table1'[argument3]),ALLSELECTED('table2'[argument2]))
var result=IF(ISFILTERED('table2'[newsupport]),CALCULATE(COUNT('table1'[argument1]),KEEPFILTERS(allexc1)),CALCULATE(COUNT('table1'[argument1]),KEEPFILTERS(allexc2)))
return
IF(ISFILTERED('table2'[argument1])||ISFILTERED('table2'[argument2]),result,COUNT('table1'[argument1]))
              
power bi
power bi
power bi

Now if I create a relationship, the formula will stop to work so to remediate it, I will include in the formula the CROSSFILTER function:

power bi
power bi

To make disappear the row of the selected filter, I will use this formula:

  • For a single layer filter

IF(MAX('table1'[argument2]) in ALLSELECTED('table2'[argument1]) && COUNTROWS(ALLSELECTED('table2'[argument1]))<>COUNTROWS(ALL('table2'[argument1])),1,0)              
              
power bi
  • For a multiple layers filter


var allexc1=IF(MAX('table1'[support]) in ALLSELECTED('table2'[argument1]) && COUNTROWS(ALLSELECTED('table2'[argument1]))<>COUNTROWS(ALL('table2'[argument1])),1,0)
var allexc2=IF(MAX('table1'[type]) in ALLSELECTED('table2'[argument2]) && COUNTROWS(ALLSELECTED('table2'[argument2]))<>COUNTROWS(ALL('table2'[argument2])),1,0)
return
IF(ISFILTERED('table2'[argument1]),allexc1,allexc2)
              
power bi

Once done, I will add it in my visualization table configured like that:

power bi power bi

NOTE: if my visualization table has only the measure, there is no need for this trick

power bi

Interesting Topics