Power BI 无日期变量场景下计算预算修订版差值的方法
问题根因
原有度量值返回结果和最新版一致,是因为报表筛选上下文已经限定仅展示最新修订号的数据,LASTNONBLANK在被筛选后的REVISIONNUMBER列中只能取到当前最新版本号,无法穿透筛选拿到上一版本的数值。
正确DAX写法
核心逻辑是先移除筛选上下文对修订号的限制,先定位当前范围的最新修订号,再匹配倒数第二版的对应数值,按预算行维度自动对齐材料、工时等不同类别的数据。
连续修订号场景(修订号从1开始逐次+1无跳号)
先写获取上一版本预算额的度量值:
Billingprice-1 = // 获取当前筛选范围内的最新修订号 VAR CurrentLatestRev = CALCULATE(MAX(JOBBUDGETLINE[REVISIONNUMBER]), ALLSELECTED(JOBBUDGETLINE[REVISIONNUMBER])) VAR PrevVersionRev = CurrentLatestRev - 1 RETURN CALCULATE( [Fixed price amount], // 移除原有对修订号的筛选 REMOVEFILTERS(JOBBUDGETLINE[REVISIONNUMBER]), // 匹配倒数第二版修订号 JOBBUDGETLINE[REVISIONNUMBER] = PrevVersionRev )
再计算两版差值:
Budget Delta = [Fixed price amount] - [Billingprice-1]
修订号存在跳号场景(存在中间版本删除、修订号不连续的情况)
如果修订号不是严格连续递增,把获取上一版本号的逻辑替换为取小于最新版的最大修订号即可,对应度量值如下:
Billingprice-1 = VAR CurrentLatestRev = CALCULATE(MAX(JOBBUDGETLINE[REVISIONNUMBER]), ALLSELECTED(JOBBUDGETLINE[REVISIONNUMBER])) VAR PrevVersionRev = CALCULATE( MAX(JOBBUDGETLINE[REVISIONNUMBER]), ALLSELECTED(JOBBUDGETLINE[REVISIONNUMBER]), JOBBUDGETLINE[REVISIONNUMBER] < CurrentLatestRev ) RETURN CALCULATE( [Fixed price amount], REMOVEFILTERS(JOBBUDGETLINE[REVISIONNUMBER]), JOBBUDGETLINE[REVISIONNUMBER] = PrevVersionRev )
注意事项
- 该写法完全适配现有业务规则:只要任意预算项调整就会给所有行分配新修订号,按修订号匹配不会出现部分行取不到上一版本值的问题
- 如果需要按项目、预算类别等维度拆分统计差值,不需要额外修改度量值,现有逻辑会自动在对应筛选上下文下计算
- 不要用
LASTNONBLANK嵌套的方式取上一版本,该函数在多行列值匹配时很容易受筛选上下文影响出现计算偏差
内容的提问来源于stack exchange,提问作者AzizZadran
相关产品推荐
相关产品推荐

