Power BI DAX法定分数分配度量值问题排查请求
DAX度量值问题排查与修正
原代码核心问题
- 逻辑方向错误:
Compulsory_Marks和NormalMarks计算的是符合条件科目的分数总和,而非这些科目补至及格所需的分数总和,完全偏离了“优先补必修到及格,剩余补普通”的规则要求。 - 上下文变量误用:在
CALCULATE筛选器中使用Marks_obtained(当前上下文单科目分数),会导致筛选条件固定为当前行的分数,无法正确计算所有符合条件的必修/普通科目的整体补分需求。 - 剩余分数分配逻辑混乱:
Remaining_Statue_Marks_Normal的计算逻辑错误,没有按规则优先满足必修后,再按合理顺序(补分需求从小到大)分配剩余分数给普通科目。
修正后的DAX度量值
MehrajCalc_Measure = VAR Min_Marks = MAX(ExamTbl_MIN_PassMarks[Diet_categoryInfo.Diet_minMarks]) VAR Statutory_Total = 5 // 计算所有符合条件的必修科目补至及格的总需求分数 VAR Compulsory_Eligible = CALCULATETABLE( Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "compulsory", Test_Analytics[TOTAL_MarksObtained_FAS] >= 12, Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks ) VAR Compulsory_Total_Needed = SUMX( Compulsory_Eligible, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS] ) // 实际用于必修的补分:不超过法定总分,也不超过实际需求 VAR Compulsory_Used = MIN(Compulsory_Total_Needed, Statutory_Total) VAR Remaining_Statutory = MAX(Statutory_Total - Compulsory_Used, 0) // 处理当前必修科目:直接补至及格(优先满足) VAR Is_Compulsory_Eligible = AND( SELECTEDVALUE(Test_Analytics[examScore.Diet_subjectType]) = "compulsory", SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]) >= 12, SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]) < Min_Marks ) VAR Compulsory_Final = IF(Is_Compulsory_Eligible, Min_Marks, SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS])) // 处理普通科目:按补分需求从小到大排序,计算累计补分额度 VAR Normal_Eligible = CALCULATETABLE( Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "normal", Test_Analytics[TOTAL_MarksObtained_FAS] >= 12, Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks ) VAR Normal_Ranked = ADDCOLUMNS( Normal_Eligible, "Need", Min_Marks - [TOTAL_MarksObtained_FAS], "Cumulative_Need", SUMX( FILTER(Normal_Eligible, [Need] <= EARLIER([Need])), [Need] ) ) // 当前普通科目可获得的补分 VAR Current_Normal_Need = IF( AND( SELECTEDVALUE(Test_Analytics[examScore.Diet_subjectType]) = "normal", SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]) >= 12, SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]) < Min_Marks ), Min_Marks - SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]), 0 ) VAR Current_Cumulative = MAXX( FILTER(Normal_Ranked, [TOTAL_MarksObtained_FAS] = SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS])), [Cumulative_Need] ) VAR Normal_Add = IF( Current_Normal_Need > 0, IF(Current_Cumulative <= Remaining_Statutory, Current_Normal_Need, MAX(Remaining_Statutory - MAXX(FILTER(Normal_Ranked, [Cumulative_Need] < Current_Cumulative), [Cumulative_Need]), 0) ), 0 ) VAR Normal_Final = SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]) + Normal_Add // 最终返回结果 RETURN SWITCH( TRUE(), Is_Compulsory_Eligible, Compulsory_Final, Current_Normal_Need > 0, Normal_Final, SELECTEDVALUE(Test_Analytics[TOTAL_MarksObtained_FAS]) )
修正逻辑说明
- 必修科目优先处理:先筛选所有符合条件的必修科目,计算它们补到及格的总需求,用法定分优先覆盖这部分需求,确保所有符合条件的必修科目都能补至及格分。
- 剩余分数合理分配:对符合条件的普通科目按补分需求从小到大排序,计算累计补分额度,根据剩余法定分的额度依次分配,直到剩余分用完。
- 上下文冲突解决:使用
SELECTEDVALUE和CALCULATETABLE正确区分单科目上下文与全局科目集合,避免原代码中变量上下文不匹配的问题。
内容的提问来源于stack exchange,提问作者IrfanJKL
相关产品推荐
相关产品推荐

