Power BI DAX 查询

问题描述 投票:0回答:1

我正在设计一个DAX来计算,有两类科目,一类是必修的,另一类是普通的。我的DAX需要检查分数是否在法定分数分配范围内。法定分数固定为5。

举例来说,如果我有 5 门科目,必修科目的分数为 13,普通科目的分数为 16,15,16,17,25。

DAX 应该为必修课分配 4 分,使其达到 17 分[及格分数],剩余 2 分应分配到 16/16,以便通过。所有其他内容将保持原样。我编译了一个 DAX,不确定我是否错了。

MehrajCalc_Measure = 
VAR Marks_obtained = MAX(Test_Analytics[TOTAL_MarksObtained_FAS])  // Considering the maximum marks obtained within the current context
VAR Min_Marks = MAX(ExamTbl_MIN_PassMarks[Diet_categoryInfo.Diet_minMarks])
VAR StatueMarks = 5

VAR Compulsory_Marks = 
    CALCULATE (
        SUM ( Test_Analytics[TOTAL_MarksObtained_FAS] ),
        Test_Analytics[examScore.Diet_subjectType] = "compulsory" &&
        Marks_obtained >= 12 && Marks_obtained < Min_Marks
    )

VAR NormalMarks =     
    CALCULATE (
        SUM ( Test_Analytics[TOTAL_MarksObtained_FAS] ),
        Test_Analytics[examScore.Diet_subjectType] = "normal" &&
        Marks_obtained >= 12 && Marks_obtained < Min_Marks
    )

VAR Remaining_Statue_Marks = MAX(StatueMarks - Compulsory_Marks, 0)

VAR Remaining_Statue_Marks_Normal = IF(Remaining_Statue_Marks > 0, MAX(0, Remaining_Statue_Marks - NormalMarks), Remaining_Statue_Marks)

VAR StatueMarksToAdd = 
    IF(
        Remaining_Statue_Marks_Normal > 0,
        IF(Min_Marks - Marks_obtained > Remaining_Statue_Marks_Normal, Remaining_Statue_Marks_Normal, Min_Marks - Marks_obtained),
        0
    )

RETURN 
    IF(
        Marks_obtained >= 12 && Marks_obtained < Min_Marks,
        Marks_obtained +  StatueMarksToAdd,
        Marks_obtained
    )
powerbi dax daxstudio
1个回答
0
投票

从逻辑上讲,这应该对你有用

MehrajCalc_Measure =
VAR Marks_obtained = MAX(Test_Analytics[TOTAL_MarksObtained_FAS])
VAR Min_Marks = MAX(ExamTbl_MIN_PassMarks[Diet_categoryInfo.Diet_minMarks])
VAR StatueMarks = 5

VAR Compulsory_Marks =
    CALCULATE (
        SUMX(
            FILTER(Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "compulsory"),
            IF(Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 && Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks, Test_Analytics[TOTAL_MarksObtained_FAS], 0)
        ),
        ALLEXCEPT(Test_Analytics, Test_Analytics[examScore.Diet_subjectID])
    )

VAR Normal_Marks =
    CALCULATE (
        SUMX(
            FILTER(Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "normal"),
            IF(Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 && Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks, Test_Analytics[TOTAL_MarksObtained_FAS], 0)
        ),
        ALLEXCEPT(Test_Analytics, Test_Analytics[examScore.Diet_subjectID])
    )

VAR Remaining_Statue_Marks = MAX(StatueMarks - Compulsory_Marks, 0)

VAR Remaining_Marks_To_Distribute =
    VAR Normal_Marks_Needs_Boost =
        CALCULATE(
            SUMX(
                FILTER(Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "normal"),
                IF(Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 && Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks - Remaining_Statue_Marks, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS], 0)
            ),
            ALLEXCEPT(Test_Analytics, Test_Analytics[examScore.Diet_subjectID])
        )
    RETURN
        IF(Normal_Marks_Needs_Boost > Remaining_Statue_Marks, Remaining_Statue_Marks, Normal_Marks_Needs_Boost)

VAR Marks_To_Add_To_Current_Row =
    IF(
        Test_Analytics[examScore.Diet_subjectType] = "compulsory" &&
            Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 &&
            Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks,
        MIN(Remaining_Statue_Marks, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS]),
        IF(
            Test_Analytics[examScore.Diet_subjectType] = "normal" &&
                Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 &&
                Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks,
            MIN(Remaining_Marks_To_Distribute, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS]),
            0
        )
    )

RETURN
    Test_Analytics[TOTAL_MarksObtained_FAS] + Marks_To_Add_To_Current_Row

我已将

SUM
替换为
SUMX
,利用
ALLEXCEPT
并引入了一个名为
Remaining_Marks_To_Distribute
的新变量。我也希望您能够解读这些变化。

一个建议,如果Mehraj是一个人的名字,软件解决方案的规范是永远不要使用个人名字作为变量名称的一部分。

样本数据后修改DAX

MehrajCalc_Measure =
VAR Marks_obtained = MAX(Test_Analytics[TOTAL_MarksObtained_FAS])
VAR Min_Marks = MAX(ExamTbl_MIN_PassMarks[Diet_categoryInfo.Diet_minMarks])
VAR StatueMarks = 5

VAR Compulsory_Marks =
    CALCULATE (
        SUMX(
            FILTER(Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "compulsory"),
            IF(Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 && Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks, Test_Analytics[TOTAL_MarksObtained_FAS], 0)
        ),
        ALLEXCEPT(Test_Analytics, Test_Analytics[examScore.Diet_subjectID])
    )

VAR Normal_Marks =
    CALCULATE (
        SUMX(
            FILTER(Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "normal"),
            Test_Analytics[TOTAL_MarksObtained_FAS]
        ),
        ALLEXCEPT(Test_Analytics, Test_Analytics[examScore.Diet_subjectID])
    )

VAR Remaining_Statue_Marks = MAX(StatueMarks - Compulsory_Marks, 0)

VAR Remaining_Marks_To_Distribute =
    VAR Normal_Marks_Needs_Boost =
        CALCULATE(
            SUMX(
                FILTER(Test_Analytics, Test_Analytics[examScore.Diet_subjectType] = "normal"),
                IF(Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks - Remaining_Statue_Marks, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS], 0)
            ),
            ALLEXCEPT(Test_Analytics, Test_Analytics[examScore.Diet_subjectID])
        )
    RETURN
        IF(Normal_Marks_Needs_Boost > Remaining_Statue_Marks, Remaining_Statue_Marks, Normal_Marks_Needs_Boost)

VAR Marks_To_Add_To_Current_Row =
    IF(
        Test_Analytics[examScore.Diet_subjectType] = "compulsory" &&
            Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 &&
            Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks,
        MIN(Remaining_Statue_Marks, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS]),
        IF(
            Test_Analytics[examScore.Diet_subjectType] = "normal" &&
                Test_Analytics[TOTAL_MarksObtained_FAS] >= 12 &&
                Test_Analytics[TOTAL_MarksObtained_FAS] < Min_Marks,
            MIN(Remaining_Marks_To_Distribute, Min_Marks - Test_Analytics[TOTAL_MarksObtained_FAS]),
            0
        )
    )

RETURN
    Test_Analytics[TOTAL_MarksObtained_FAS] + Marks_To_Add_To_Current_Row

必修科目(14分): 获得的分数= 14(原始)+ 3(雕像)= 17 分数

普通科目: 15点:获得的点=15点(原始点)+2点(雕像点)=17点 16 点:获得的点 = 16(原始)+ 1(雕像)= 17 点 16 点:获得的点 = 16(原始)+ 1(雕像)= 17 点 17分:获得分数=17分(原来)(已达到及格分数)

© www.soinside.com 2019 - 2024. All rights reserved.