Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
3 years ago
Solved

Help making a measure that references multiple tables

Hi Friends, 

 

I am trying to calculate a school and district's "Performance Index" in Power BI. 

 

1) Calculate the percentage of tests in each subject that fall into a given performance level (limited, proficient, advanced).

2)Assign points based on the percentage of tests in each performance level. (For example, advanced is worth 2 points, proficient is worth 1, and limited is worth 0.5. A school with 50% of students in the Limited category, 30% of students in the Proficient category, and 20% of students in the Advanced category would earn 95 points, because (50 x 0.5)+(30 x 1) + (20 x 2) = 95 points.)

 

My data is formatted as follows 

student_idsubjecttermschool_yearperformance_level
1234MathFall2022Limited
1234ReadingFall2022Proficient
5678MathWinter2022Advanced
5678ReadingWinter2022Proficient
1357MathFall2022Limited
1357ReadingFall2022Limited

 

 

To do this, I created the following meaures. These measures work when I only include the fields from the above dataset in my table visual. 

 

 

percentage = 
VAR _count = CALCULATE(COUNTROWS('Table'),ALLEXCEPT('Table','Table'[subject],'Table'[school_year], 'Table'[term], 'Table'[performance_level)) + 0
VAR _total = CALCULATE(COUNTROWS('Table'),ALLEXCEPT('Table','Table'[subject],'Table'[school_year], 'Table'[term]))
VAR _percentage = DIVIDE(_count,_total)
RETURN
_percentage

 

 

 

points = 
VAR _subject= MAX('Table'[subject])
VAR _year = MAX('Table'[school_year])
VAR _term = MAX('Table'[term])
VAR _Advanced = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year &&'Table'[term]=_term && 'Table'[performance_level]="Advanced"),[percentage])+0
VAR _Proficient = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year && 'Table'[term]=_term && 'Table'[performance_level]="Proficient"),[percentage])+0
VAR _Limited = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year &&'Table'[term]=_term &&'Table'[performance_level]="Limited"),[percentage])+0
VAR _Point = (_Advanced*2+_Proficient+_Limited*0.5)*100
RETURN
_Point

 

 

I then have a "sort" table that links to the above table (aka 'Table').  I use the 'term' column from the below table in my visuals and slicers. 

 

termorder
Fall1
Winter2
Spring3

 

Unfortunately, when I do this, the calculations above become messed up. Does anyone have any idea how to fix this? 

  • Anonymous's avatar
    Anonymous
    3 years ago

    Hi Anonymous ,

     

    According to my research and tests, the reason why the slicer does not filter properly after creating a "sorted" table is that you add a +0 after the output value of each variable, resulting in an abnormal filtering after passing through another table as a slicer, with a value of 0 instead of blank, you can try removing +0 from the two measures.

     

    percentage = 
    VAR _count = CALCULATE(COUNTROWS('Table'),ALLEXCEPT('Table','Table'[subject],'Table'[school_year], 'Table'[term], 'Table'[performance_level)) 
    VAR _total = CALCULATE(COUNTROWS('Table'),ALLEXCEPT('Table','Table'[subject],'Table'[school_year], 'Table'[term]))
    VAR _percentage = DIVIDE(_count,_total)
    RETURN
    _percentage
    points = 
    VAR _subject= MAX('Table'[subject])
    VAR _year = MAX('Table'[school_year])
    VAR _term = MAX('Table'[term])
    VAR _Advanced = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year &&'Table'[term]=_term && 'Table'[performance_level]="Advanced"),[percentage])
    VAR _Proficient = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year && 'Table'[term]=_term && 'Table'[performance_level]="Proficient"),[percentage])
    VAR _Limited = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year &&'Table'[term]=_term &&'Table'[performance_level]="Limited"),[percentage])
    VAR _Point = (_Advanced*2+_Proficient+_Limited*0.5)*100
    RETURN
    _Point

     

    Best Regards,

    Neeko Tang

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly. 

1 Reply

  • Anonymous's avatar
    Anonymous
    Not applicable

    Hi Anonymous ,

     

    According to my research and tests, the reason why the slicer does not filter properly after creating a "sorted" table is that you add a +0 after the output value of each variable, resulting in an abnormal filtering after passing through another table as a slicer, with a value of 0 instead of blank, you can try removing +0 from the two measures.

     

    percentage = 
    VAR _count = CALCULATE(COUNTROWS('Table'),ALLEXCEPT('Table','Table'[subject],'Table'[school_year], 'Table'[term], 'Table'[performance_level)) 
    VAR _total = CALCULATE(COUNTROWS('Table'),ALLEXCEPT('Table','Table'[subject],'Table'[school_year], 'Table'[term]))
    VAR _percentage = DIVIDE(_count,_total)
    RETURN
    _percentage
    points = 
    VAR _subject= MAX('Table'[subject])
    VAR _year = MAX('Table'[school_year])
    VAR _term = MAX('Table'[term])
    VAR _Advanced = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year &&'Table'[term]=_term && 'Table'[performance_level]="Advanced"),[percentage])
    VAR _Proficient = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year && 'Table'[term]=_term && 'Table'[performance_level]="Proficient"),[percentage])
    VAR _Limited = SUMX(FILTER('Table','Table'[subject]=_subject&&'Table'[school_year]=_year &&'Table'[term]=_term &&'Table'[performance_level]="Limited"),[percentage])
    VAR _Point = (_Advanced*2+_Proficient+_Limited*0.5)*100
    RETURN
    _Point

     

    Best Regards,

    Neeko Tang

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.