Power BI DAX计数异常:FILTER与USERELATIONSHIP使用结果错误
问题描述
我有包含Calendar表和Interviews表的数据集,Interviews表字段包括CreatedOn、ClosedOn、Region、Division、Language和Index。两表关系如下:
- 活跃关系:Interviews[CreatedOn] ↔ Calendar[Date]
- 非活跃关系:Interviews[ClosedOn] ↔ Calendar[Date]
当前设置:
- 用Calendar[Date]做日期切片器,范围为2024年1月1日至1月6日
- 页面筛选排除Division=1
需求是统计ClosedOn在所选日期范围内的法语关闭面试数,但遇到问题:
- 统计总关闭面试数的度量返回正确结果2641:
Total Closed = CALCULATE(COUNTROWS(Interviews), USERELATIONSHIP(Interviews[ClosedOn], 'Calendar'[Date]))
- 单独筛选法语的度量返回1565(远低于预期的2210):
Total French Closed = CALCULATE(COUNTROWS(Interviews), FILTER(Interviews, Interviews[Language] = "French"))
- 给法语度量加上USERELATIONSHIP后直接返回空白:
Total French Closed = CALCULATE(COUNTROWS(Interviews), FILTER(Interviews, Interviews[Language] = "French"), USERELATIONSHIP(Interviews[ClosedOn], 'Calendar'[Date]))
问题分析与解决
错误原因
- 第二个度量没切换关系,默认用的是活跃的CreatedOn关联,统计的是CreatedOn在切片器日期内且语言为法语的面试数,不是ClosedOn符合条件的,所以结果偏小。
- 第三个度量的顺序错了:
FILTER(Interviews,...)是先基于当前的CreatedOn切片器+Division排除的上下文过滤表,之后再切换到ClosedOn的关系,这时候已经没有符合条件的行,自然返回空白。
正确的DAX写法
两种方案都能解决问题:
方案一:直接在CALCULATE里加语言筛选,让关系切换先生效
Total French Closed = CALCULATE(COUNTROWS(Interviews), Interviews[Language] = "French", USERELATIONSHIP(Interviews[ClosedOn], 'Calendar'[Date]) )
方案二:用CALCULATETABLE先切换关系再过滤
Total French Closed = CALCULATE(COUNTROWS( CALCULATETABLE(Interviews, USERELATIONSHIP(Interviews[ClosedOn], 'Calendar'[Date])) ), Interviews[Language] = "French")
核心逻辑
USERELATIONSHIP必须在筛选之前生效,这样Calendar的切片器才能作用于ClosedOn字段。直接把语言筛选放在CALCULATE的参数里,会在切换关系后的上下文里执行,就能准确统计出ClosedOn在切片器范围内、Division≠1且语言为法语的面试数。
内容的提问来源于stack exchange,提问作者Sweepster
相关产品推荐
相关产品推荐

