You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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])
    )

修正逻辑说明

  1. 必修科目优先处理:先筛选所有符合条件的必修科目,计算它们补到及格的总需求,用法定分优先覆盖这部分需求,确保所有符合条件的必修科目都能补至及格分。
  2. 剩余分数合理分配:对符合条件的普通科目按补分需求从小到大排序,计算累计补分额度,根据剩余法定分的额度依次分配,直到剩余分用完。
  3. 上下文冲突解决:使用SELECTEDVALUE和CALCULATETABLE正确区分单科目上下文与全局科目集合,避免原代码中变量上下文不匹配的问题。

内容的提问来源于stack exchange,提问作者IrfanJKL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:27:05