cancel
Showing results for 
Search instead for 
Did you mean: 

Fabric is Generally Available. Browse Fabric Presentations. Work towards your Fabric certification with the Cloud Skills Challenge.

Reply
bvy
Helper V
Helper V

Help clean up this simple DAX calculation

Hi. Given a table of values, something like below, I want a measure that will return the "within range" percentage for each category. So if 3 out of 4 values are with in range (as shown below) the measure should return 0.75 for category A. 

 

Table1

Category.....RangeHigh.....RangeLow.....Value
A305052
A305045
A305040
A305038

[extra dots for formatting]

 

What I've come up with is below, but the problems are:

  • The category is hard coded -- I'd like it driven off of a slicer or filter, and 
  • It's messy -- I think there's a clearer more compact way to write the DAX. 

 

 

PctInRange = 1 - CALCULATE(COUNTROWS(Table1), FILTER(Table1, (Table1[Value] < Table1[RangeLow] || Table1[Value] > Table1[RangeHigh]) && Table1[Category] = "A")) / CALCULATE(COUNTROWS(Table1), Table1[Category] = "A")

 

 

 

Can someone help? Thanks for taking a look! 

1 ACCEPTED SOLUTION
bcdobbs
Super User
Super User

A few thoughts and a question.

  • In your initial COUNTROWS you'd be better just to directly COUNTROWS of the table returned from the filter.
  • You can make your code a lot more readable by using variables and formatting it.

Those combined would give:

PctInRange = 
VAR tblGroupAInRange = 
    FILTER(
        Table1, 
        (Table1[Value] < Table1[RangeLow] || Table1[Value] > Table1[RangeHigh]) 
        && Table1[Category] = "A")

VAR cntGroupAInRange = COUNTROWS ( tblGroupAInRange )
VAR cntGroupA = 
    CALCULATE(
        COUNTROWS ( Table1 ), 
        Table1[Category] = "A"
    )

VAR Result = 1 - DIVIDE ( cntGroupAInRange, cntGroupA)
RETURN Result

 

In terms of making it more dynamic depending on how you're intending to use the measure you could just get rid of the hard coded category = A filters. Sliceing on category would pass the filter straight into both.

 

Lastly are the high/low values the same for all of category A? If so moving them out to a category dimension might help further.

 

Share a little on how you'd like to use the measure and we can take it further.

 



Ben Dobbs

LinkedIn | Twitter | Blog

Did I answer your question? Mark my post as a solution! This will help others on the forum!
Appreciate your Kudos!!

View solution in original post

3 REPLIES 3
bcdobbs
Super User
Super User

A few thoughts and a question.

  • In your initial COUNTROWS you'd be better just to directly COUNTROWS of the table returned from the filter.
  • You can make your code a lot more readable by using variables and formatting it.

Those combined would give:

PctInRange = 
VAR tblGroupAInRange = 
    FILTER(
        Table1, 
        (Table1[Value] < Table1[RangeLow] || Table1[Value] > Table1[RangeHigh]) 
        && Table1[Category] = "A")

VAR cntGroupAInRange = COUNTROWS ( tblGroupAInRange )
VAR cntGroupA = 
    CALCULATE(
        COUNTROWS ( Table1 ), 
        Table1[Category] = "A"
    )

VAR Result = 1 - DIVIDE ( cntGroupAInRange, cntGroupA)
RETURN Result

 

In terms of making it more dynamic depending on how you're intending to use the measure you could just get rid of the hard coded category = A filters. Sliceing on category would pass the filter straight into both.

 

Lastly are the high/low values the same for all of category A? If so moving them out to a category dimension might help further.

 

Share a little on how you'd like to use the measure and we can take it further.

 



Ben Dobbs

LinkedIn | Twitter | Blog

Did I answer your question? Mark my post as a solution! This will help others on the forum!
Appreciate your Kudos!!
jgeddes
Solution Sage
Solution Sage

I am thinking you could accomplish this using a calculated column in table 1 that tests whether a Value is in range and returns something like "isInRange" or notInRange". Then write a measure that divides the count of "isInRange" by all values in the calculated column to get the percentage. That should allow filtering and slicing by categories that are in Table 1.

I could do that but I don't want to add excessive overhead to the table if it could all be managed in DAX without impacing performance, which I think it can. 

 

Can someone suggest how to modify the DAX, please? 

Helpful resources

Announcements
PBI November 2023 Update Carousel

Power BI Monthly Update - November 2023

Check out the November 2023 Power BI update to learn about new features.

Community News

Fabric Community News unified experience

Read the latest Fabric Community announcements, including updates on Power BI, Synapse, Data Factory and Data Activator.

Dashboard in a day with date

Exclusive opportunity for Women!

Join us for a free, hands-on Microsoft workshop led by women trainers for women where you will learn how to build a Dashboard in a Day!

Power BI Fabric Summit Carousel

The largest Power BI and Fabric virtual conference

130+ sessions, 130+ speakers, Product managers, MVPs, and experts. All about Power BI and Fabric. Attend online or watch the recordings.

Top Solution Authors
Top Kudoed Authors