Power BI DAX基于日期切片器的计算列计算错误排查
问题成因
- 本质是对Power BI中计算列和度量值的计算上下文逻辑理解错误:计算列在数据刷新阶段完成逐行计算,结果静态存储在数据模型中,不会响应报表层面切片器、筛选器的交互操作;只有度量值会在可视化对象渲染时,基于当前的筛选上下文动态计算,才能获取到切片器选中的日期范围。
- 你编写的
stok_till_date是度量值,当你在计算列中调用该度量值时,计算列的计算环境不存在切片器生成的筛选上下文,VALUES('Tarihler (Stok)'[Tarih])会返回日期表的全部日期值,计算得到的最小值就是日期表的最早日期2022年1月1日,和切片器选中的2022年7月1日自然不一致。 - 你在计算列中使用
SELECTEDVALUE获取当前行交易日期的写法属于冗余用法:计算列的行上下文下直接引用字段即可获取当前行值,不需要调用SELECTEDVALUE,且计算列本身不响应切片器筛选,整个判断逻辑从底层就无法生效。
修正方案
所有需要响应切片器动态筛选的库存计算逻辑,不要写在计算列中,全部通过度量值实现。
首先简化基础日期取值度量值:
stok_till_date = MIN('Tarihler (Stok)'[Tarih]) // 获取切片器选中的最小日期 stok_end_date = MAX('Tarihler (Stok)'[Tarih]) // 获取切片器选中的最大日期
再针对你需要的三个统计维度分别编写度量值:
- 期初库存:统计切片器最小日期之前的累计库存
Dönem Başı Stok = CALCULATE ( SUM ( 'Stok Giriş-Çıkış'[Stok Giriş] ) - SUM ( 'Stok Giriş-Çıkış'[Stok Çıkış] ), 'Tarihler (Stok)'[Tarih] < [stok_till_date], REMOVEFILTERS ( 'Tarihler (Stok)' ) // 清除切片器的日期范围筛选,才能统计选中日期前的全量历史数据 )
- 区间交易数据:统计切片器选中日期范围内的出入库净值
Dönem İçi İşlem = CALCULATE ( SUM ( 'Stok Giriş-Çıkış'[Stok Giriş] ) - SUM ( 'Stok Giriş-Çıkış'[Stok Çıkış] ), DATESBETWEEN ( 'Tarihler (Stok)'[Tarih], [stok_till_date], [stok_end_date] ) )
- 期末库存:统计切片器最大日期对应的累计库存
Dönem Sonu Stok = [Dönem Başı Stok] + [Dönem İçi İşlem]
提示:如果你的出入库表中出库值是单独存储的负值字段,可根据实际字段逻辑调整上述公式中的加减计算,核心是通过CALCULATE修改筛选上下文实现不同时间范围的统计。
内容的提问来源于stack exchange,提问作者Umut K
相关产品推荐
相关产品推荐

