基于Slicer选择配置Matrix Visual动态列及DAX日期差计算
Power BI 矩阵双版本动态日期列及差值计算实现方案
前置模型配置
做动态双版本对比的核心是断开切片器用表和事实表的关联,避免切片器互相筛选,步骤如下:
- 基于原项目单表的版本字段,新建两个独立的无关联维度表,分别供两个切片器使用:
- 新建计算表:
Version Picker 1 = DISTINCT('项目A全量数据表'[版本列]) - 新建计算表:
Version Picker 2 = DISTINCT('项目A全量数据表'[版本列])
- 新建计算表:
- 两个新表不需要和原事实表建立任何关系,分别将两个表的版本列绑定到两个独立的下拉切片器,可分别命名为「基准版本」「对比版本」
- 矩阵视觉对象的行区域拖入固定分析维度,比如任务ID、任务名称、所属阶段这类不会随版本变化的字段,不要直接把版本、日期字段拖入列/值区域
核心DAX度量值
一共需要3个度量值,全部拖入矩阵的值区域即可:
- 读取基准版本选中值对应的任务日期
基准版本日期 = VAR SelectedBaseVer = SELECTEDVALUE('Version Picker 1'[版本列]) RETURN CALCULATE( SELECTEDVALUE('项目A全量数据表'[任务日期列]), // 如果同任务同版本有多条记录,可替换为MAX/MIN等业务需要的聚合方式 '项目A全量数据表'[版本列] = SelectedBaseVer, REMOVEFILTERS('Version Picker 2') // 屏蔽对比版本切片器对本度量值的筛选干扰 )
- 读取对比版本选中值对应的任务日期
对比版本日期 = VAR SelectedCompareVer = SELECTEDVALUE('Version Picker 2'[版本列]) RETURN CALCULATE( SELECTEDVALUE('项目A全量数据表'[任务日期列]), '项目A全量数据表'[版本列] = SelectedCompareVer, REMOVEFILTERS('Version Picker 1') // 屏蔽基准版本切片器对本度量值的筛选干扰 )
- 计算两个版本同一任务的日期天数差
版本日期差(天) = VAR BaseDate = [基准版本日期] VAR CompareDate = [对比版本日期] RETURN IF( NOT ISBLANK(BaseDate) && NOT ISBLANK(CompareDate), DATEDIFF(BaseDate, CompareDate, DAY), BLANK() )
可选优化配置
- 动态列头:如果需要矩阵列头自动显示选中的版本名称,而非固定的“基准版本日期”字样,可使用计算组或字段参数功能,将度量值显示名称通过
SELECTEDVALUE拼接当前选中的版本名即可,不需要修改核心计算逻辑 - 无效选择拦截:如果要避免用户在两个切片器选择同一个版本产生无意义对比,可以新建校验度量值:
版本选择校验 = IF(SELECTEDVALUE('Version Picker 1'[版本列]) = SELECTEDVALUE('Version Picker 2'[版本列]), 0, 1)
将该度量值拖入矩阵的视觉级筛选器,设置筛选条件为「等于1」,当选中同版本时矩阵会自动隐藏无效内容。
注意事项
- 两个版本选择表一定不要和原事实表建关系,否则两个切片器会联动过滤,无法选中不同版本
- 如果需要计算的是工期、完成率等其他指标而非日期差,只需要替换度量值里的日期字段和差值计算逻辑即可,整体模型框架不需要改动
内容的提问来源于stack exchange,提问作者Project Insights
相关产品推荐
相关产品推荐

