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

如何动态计算学生各学年年级?DAX度量值开发求助

动态计算各学年指定年级学生数量的DAX度量值问题

我需要绘制各学年3年级学生数量的折线图,但现有数据仅包含当前学年的学生年级信息。直接用当前年级作为图例,得到的是当前3年级学生的年级变化轨迹,而非各学年实际的3年级学生情况。因此需要开发一个DAX度量值,动态计算学生在各学年的年级,最终实现折线图Y轴展示「各学年X年级学生数量」。

我针对12年级编写了一段DAX代码(后续需复用至其他年级),代码无语法错误,但未达到预期效果。

逻辑说明

假设当前学年为2022年(因当前时间在2023年8月1日前):

  • 学号1234的学生当前为3年级,2021学年应为2年级,2020学年为1年级,2019学年会被计算为0年级,但该学生入学年级是1年级,因此2019学年应返回空值(不计入统计)。

学校数据表格

School IDJoining GradeCurrent Grade
123413
567823
91014
121346

现有DAX代码

Dynamic year 12 =
VAR CurrentYear = YEAR(TODAY())
VAR CurrentMonth = MONTH(TODAY())
VAR CurrentAcademicYear = IF(CurrentMonth < 8, CurrentYear - 1, CurrentYear)
VAR ChosenYear = SELECTEDVALUE('date_table'[Year])
VAR YearDifference = CurrentAcademicYear - ChosenYear
VAR CurrentGrade = MAXX(SUMMARIZE('student_table','student_table'[SchoolID],'student_table'[current_grade]), [current_grade])
VAR EnrolmentGrade = MAXX(SUMMARIZE('student_table','student_table'[SchoolID],'student_table'[joining_grade]), [joining_grade])
VAR Result =
    IF(
        NOT ISBLANK(EnrolmentGrade),
        IF(
            CurrentGrade - YearDifference = 12,
            1,
            IF(
                CurrentGrade - YearDifference < EnrolmentGrade,
                0,
                CurrentGrade - YearDifference
            )
        )
    )
RETURN
    Result

问题分析与修正方案

原代码核心问题是在聚合层面计算单值(MAXX+SUMMARIZE),无法逐行判断每个学生在指定学年的年级是否符合目标,导致统计逻辑错误。正确思路是逐行计算每个学生在选定学年的年级,再统计符合目标年级的人数。

以下是修正后的通用DAX度量值(以12年级为例,替换TargetGrade值即可复用至其他年级):

Count of Grade 12 Students =
VAR TargetGrade = 12
VAR CurrentYear = YEAR(TODAY())
VAR CurrentMonth = MONTH(TODAY())
VAR CurrentAcademicYear = IF(CurrentMonth < 8, CurrentYear - 1, CurrentYear)
VAR ChosenYear = SELECTEDVALUE('date_table'[Year])
VAR YearDiff = CurrentAcademicYear - ChosenYear
RETURN
CALCULATE(
    COUNTROWS('student_table'),
    VAR StudentGradeInChosenYear = 'student_table'[Current Grade] - YearDiff
    RETURN
    FILTER(
        'student_table',
        -- 排除入学前的年份(年级小于入学年级,空入学年级默认按1处理)
        StudentGradeInChosenYear >= COALESCE('student_table'[Joining Grade], 1) &&
        -- 限定有效年级范围(假设最大年级为12)
        StudentGradeInChosenYear <= 12 &&
        -- 匹配目标年级
        StudentGradeInChosenYear = TargetGrade
    )
)

关键优化点

  • 逐行判断:用FILTER逐行计算每个学生在选定学年的年级,避免聚合层面的单值错误
  • 处理空值:用COALESCE将空的入学年级默认设为1,可根据实际规则调整
  • 有效范围校验:增加年级上限判断,排除不合理的计算结果
  • 直接统计人数:最终返回符合条件的学生行数,可直接作为折线图Y轴数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:13:13