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

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  ???

错误分析

  1. 逻辑冗余:按RESPONDENT_SRGT分组完全没必要,需求是全局平均值,无需拆分受访者维度
  2. 无意义计算:计算代理键ANSWER_SRGT的平均值没有业务价值,偏离需求
  3. 表名错误:引用了不存在的DIM_ANSWER表,正确表名应为DIM_QUESTION_ANSWER
  4. 上下文错误:CALCULATE未正确关联上下文,无法正确过滤出关联行
  5. 返回值缺失:未指定最终要返回的平均值结果

正确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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:24:10