Power BI DAX:使用代理键计算另一表中列的平均值
关联表中ANSWER_VALUE平均值的正确DAX实现
问题背景
现有两张表:FACT_SURVEY 和 DIM_QUESTION_ANSWER,二者通过ANSWER_SRGT(代理键)建立关联。需要计算DIM_QUESTION_ANSWER表中与FACT_SURVEY关联的ANSWER_VALUE列的平均值,已通过SQL实现该需求,但自行编写的DAX公式无法正常运行,寻求正确的DAX写法。
已实现的SQL代码
SELECT AVG(DIM.ANSWER_VALUE) FROM FACT_SURVEY FACT INNER JOIN DIM_QUESTION_ANSWER DIM ON FACT.ANSWER_SRGT = DIM.ANSWER_SRGT
用户尝试的错误DAX代码
AVGSCORE = VAR MTABLE = SUMMARIZE(FACT_SURVEY,FACT_SURVEY[RESPONDENT_SRGT]) VAR MTABLE0 = ADDCOLUMNS(MTABLE,"answer",CALCULATE(AVERAGE(FACT_SURVEY[ANSWER_SRGT]))) VAR AVGTABLE = ADDCOLUMNS(MTABLE0,"value",CALCULATE(AVERAGE(DIM_ANSWER[ANSWER_VALUE]))) RETURN ???
错误分析
- 逻辑冗余:按
RESPONDENT_SRGT分组完全没必要,需求是全局平均值,无需拆分受访者维度 - 无意义计算:计算代理键
ANSWER_SRGT的平均值没有业务价值,偏离需求 - 表名错误:引用了不存在的
DIM_ANSWER表,正确表名应为DIM_QUESTION_ANSWER - 上下文错误:
CALCULATE未正确关联上下文,无法正确过滤出关联行 - 返回值缺失:未指定最终要返回的平均值结果
正确DAX实现
方法1:利用自动关联(最简写法)
由于两张表已通过ANSWER_SRGT建立活跃关系,DAX会自动处理关联过滤,直接计算即可:
AVGSCORE = AVERAGE(DIM_QUESTION_ANSWER[ANSWER_VALUE])
这个写法和SQL的INNER JOIN效果完全一致,DAX会自动筛选出与FACT_SURVEY表关联的DIM_QUESTION_ANSWER行,再计算平均值。
方法2:显式关联过滤(适用于关系不活跃或复杂场景)
如果需要显式控制关联逻辑,可以用CALCULATETABLE和RELATEDTABLE实现:
AVGSCORE = VAR FilteredAnswerRows = CALCULATETABLE( DIM_QUESTION_ANSWER, RELATEDTABLE(FACT_SURVEY) ) RETURN AVERAGE(FilteredAnswerRows[ANSWER_VALUE])
方法3:用SUM/COUNT手动计算平均值
也可以通过总和除以数量的方式计算,结果与上述方法一致:
AVGSCORE = DIVIDE( SUM(DIM_QUESTION_ANSWER[ANSWER_VALUE]), COUNT(DIM_QUESTION_ANSWER[ANSWER_VALUE]) )
使用DIVIDE函数可以避免除数为0的错误。
内容的提问来源于stack exchange,提问作者Guissous Allaeddine
相关产品推荐
相关产品推荐

