Forum Discussion
Calculating the difference between different rows with a common subject
Ok, but Jim has three KS4 grades, with no way of distinguishing between them, except they have different grade values. Should these be summed/averaged?
Pete
My apologies that is a mistake within the data I provided, there should only be one "FFT Reported Grade" which is the target.
I hope this clears things up.
Many thanks BA_Pete
- BA_Pete5 years agoSuper User
That makes waaaay more sense!
I've done this in two parts to simplify the measures.
1) Split out dimensions in Power Query.
In Power Query, go to New Source>Blank Query then in Advanced Editor paste my code over the default code. You can then follow the steps I took to complete this.
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZNNDoIwEIWv0nTNApALsBCjRhfSjSEsGhmERSuZlnh9i5j4QxWBsJ3p99502pckdFMK6tAjcCSeR6KIkQNUF9SQkRXyDExzGwf3xh6uZCnPpuLT1BmM7rgulKktLHBY61pIwgCbKgN+KgBJqBQoJUDqFm5kvrj3CpjBH3jX350dfx3fswjEFZbGYUaB5wUCG14LYc5P8O8T+O2/lhqwFNMX+bdQ50Ehz8f8Zn8U3cbI4uzOy35k8J2etrPhKUhv", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [name = _t, #"Result set" = _t, Aspect = _t, Grade = _t]), chgSourceTypes = Table.TransformColumnTypes(Source,{{"name", type text}, {"Result set", type text}, {"Aspect", type text}, {"Grade", Int64.Type}}), dupeResultSet = Table.DuplicateColumn(chgSourceTypes, "Result set", "Result set - Copy"), splitResultSetDupe = Table.SplitColumn(dupeResultSet, "Result set - Copy", Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"gradeYear", "gradePeriod"}), trimGradePeriod = Table.TransformColumns(splitResultSetDupe,{{"gradePeriod", Text.Trim, type text}}), addGradeType = Table.AddColumn(trimGradePeriod, "gradeType", each if Text.Contains([Aspect], "Assessment") then "Target" else "Actual", type text), addSubject = Table.AddColumn(addGradeType, "Subject", each if Text.Contains([Aspect], "Eng") then "English" else if Text.Contains([Aspect], "Maths") then "Maths" else "No subject", type text) in addSubject2) Create variance measures as before.
_varianceSpring = VAR grade = CALCULATE( MAX(lukeSDMTable2[Grade]), lukeSDMTable2[gradeType] = "Actual" ) VAR target = CALCULATE( MAX(lukeSDMTable2[Grade]), lukeSDMTable2[gradePeriod] = "Spring Term" ) RETURN grade - target_varianceSummer = VAR grade = CALCULATE( MAX(lukeSDMTable2[Grade]), lukeSDMTable2[gradeType] = "Actual" ) VAR target = CALCULATE( MAX(lukeSDMTable2[Grade]), lukeSDMTable2[gradePeriod] = "Summer Term" ) RETURN grade - target_varianceAutumn = VAR grade = CALCULATE( MAX(lukeSDMTable2[Grade]), lukeSDMTable2[gradeType] = "Actual" ) VAR target = CALCULATE( MAX(lukeSDMTable2[Grade]), lukeSDMTable2[gradePeriod] = "Autumn Term" ) RETURN grade - targetYou can then apply your dimensions/measures to a matrix like this:
The main thing to note is, that in order to keep the measures as dynamic as possible, I've added an extra dimension to the matrix i.e. [gradeYear]. You could take this out of the matrix and add it as a slicer if you prefer, but it will need to be applied as a filter somewhere as it's not hardcoded into the measures.
Pete