Power BI中DAX/PQ直连模式下获取上一次盘点库存的度量问题
Power BI 实现上一次盘点库存值的DAX度量方案
需求说明
数据集包含以下列:
- Inventory(数值列,仅第8、16、24、32、40、52周有值)
- WeekEnding(日期列)
- Year(数值列)
- WeekNumber(数值列)
- Sales(数值列)
需要创建DAX度量Beg_Inv,返回上一次盘点的库存值——例如查看第32周时,显示第24周的期末库存。
现有代码问题
之前尝试的两段DAX均未达到预期,仅返回当前周的库存值:
第一段代码
BegInv2 = CALCULATE(SUM(Production[EndingInventoryAmount]), FILTER(ALL(Production[Week - Numerical], Production[Year - Numerical], Production[EndingInventoryAmount]), Production[Week - Numerical] = SELECTEDVALUE(Production[Week - Numerical]) && Production[Year - Numerical] = SELECTEDVALUE(Production[Year - Numerical]) ))
问题:直接筛选当前上下文的周数和年份,逻辑上就是取当前周的库存,完全未涉及“上一次盘点”的筛选逻辑。
第二段代码
Beg_Inv = CALCULATE(SUM(Production[EndingInventoryAmount]), FILTER(ALL(Production[Week - Numerical], Production[Year - Numerical], Production[EndingInventoryAmount]), DATEADD(Production[WeekEnding],-8*7, DAY)))
问题:DATEADD在FILTER中的用法错误,无法生成有效的布尔筛选条件;且默认假设盘点间隔固定为8周,既不符合DAX语法,也无法应对可能的盘点周变动或跨年场景。
解决方案
方案1:基于周数和年份筛选(适用于同一年度内)
通过变量先获取当前周/年,再筛选出同一年份中小于当前周的最大盘点周,最后返回对应库存值:
Beg_Inv = VAR CurrentWeek = SELECTEDVALUE(Production[Week - Numerical]) VAR CurrentYear = SELECTEDVALUE(Production[Year - Numerical]) // 找到同一年份中小于当前周的最后一个盘点周 VAR LastCountWeek = CALCULATE( MAX(Production[Week - Numerical]), FILTER( ALL(Production), Production[Year - Numerical] = CurrentYear && Production[Week - Numerical] < CurrentWeek && NOT(ISBLANK(Production[EndingInventoryAmount])) ) ) RETURN // 根据找到的盘点周返回库存值 CALCULATE( SUM(Production[EndingInventoryAmount]), FILTER( ALL(Production), Production[Year - Numerical] = CurrentYear && Production[Week - Numerical] = LastCountWeek ) )
方案2:基于日期筛选(支持跨年场景)
如果存在跨年需求(例如第1周需返回上一年第52周的库存),用日期筛选更准确:
Beg_Inv = VAR CurrentDate = SELECTEDVALUE(Production[WeekEnding]) // 找到当前日期之前的最后一个盘点日期 VAR LastCountDate = CALCULATE( MAX(Production[WeekEnding]), FILTER( ALL(Production), Production[WeekEnding] < CurrentDate && NOT(ISBLANK(Production[EndingInventoryAmount])) ) ) RETURN // 根据找到的盘点日期返回库存值 CALCULATE( SUM(Production[EndingInventoryAmount]), FILTER( ALL(Production), Production[WeekEnding] = LastCountDate ) )
逻辑说明
- 先通过
SELECTEDVALUE获取当前上下文的周数/年份/日期; - 用
CALCULATE+MAX+FILTER筛选出当前时间点之前的最后一个有效盘点时间(周/日期); - 最后根据筛选出的盘点时间,返回对应的库存值。
内容的提问来源于stack exchange,提问作者LD-DS-00
相关产品推荐
相关产品推荐

