DAX:如何为特定员工返回分组平均值?
我来帮你搞定这个DAX的问题~
问题场景梳理
你想要实现的核心需求是:为每个员工返回其所在Cycle+Group分组的平均Val值(仅统计Val>0的有效记录),哪怕单独筛选某一个员工,也要显示该员工所属分组的整体平均值,对吧?
你的现有度量值问题分析
先帮你指出原写法里的两处关键问题:
Emp_AVG语法错误:CALCULATE的参数顺序和格式不对,AVERAGE只能接收列作为参数,筛选条件要放在CALCULATE的第二个参数位置,而且你少了闭合括号。Group_AVG逻辑错误:AVERAGEX的第一个参数必须是表对象,你直接传入度量值EmployeeFeedback[Emp_AVG]是不合法的;同时你没有移除EmployeeID的筛选上下文,导致筛选单个员工时,只会计算该员工自己的平均值,而非整个分组的。
正确的DAX实现方案
这里给你两种可行的实现方式,按需选择:
方案1:直接计算分组平均值(推荐,更简洁高效)
不需要拆分员工级度量值,一个度量值就能搞定需求:
Group_AVG = CALCULATE( AVERAGE(EmployeeFeedback[Val]), -- 保留Group和Cycle的分组上下文,移除EmployeeID的筛选限制 ALLEXCEPT(EmployeeFeedback, EmployeeFeedback[Group], EmployeeFeedback[Cycle]), -- 仅统计Val大于0的有效记录 EmployeeFeedback[Val] > 0 )
方案2:基于员工级度量值迭代计算
如果你一定要保留员工级的平均值度量,可以按以下步骤调整:
首先修正Emp_AVG:
Emp_AVG = CALCULATE( AVERAGE(EmployeeFeedback[Val]), EmployeeFeedback[Val] > 0 )
再编写Group_AVG,通过生成员工级平均值表来计算分组整体平均:
Group_AVG = VAR EmployeeLevelAVGTable = SUMMARIZE( -- 锁定当前Group+Cycle的上下文,获取该分组下所有员工 ALLEXCEPT(EmployeeFeedback, EmployeeFeedback[Group], EmployeeFeedback[Cycle]), EmployeeFeedback[EmployeeID], "@EmpAVG", [Emp_AVG] ) RETURN -- 迭代员工级平均值表,计算分组整体平均 AVERAGEX(EmployeeLevelAVGTable, [@EmpAVG])
效果验证
把这个度量值放到你的可视化表格中,按EmployeeID、Cycle展示时,每个员工对应的Group_AVG都会显示其所属Cycle+Group的整体平均(比如你示例里A组Cycle1的平均是5.5,两个员工都会显示这个值);哪怕单独筛选某一个员工,也会返回该员工所在分组的平均值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者SQLSeeker
相关产品推荐
相关产品推荐

