You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
        )
    )

逻辑说明

  1. 先通过SELECTEDVALUE获取当前上下文的周数/年份/日期;
  2. 用CALCULATE+MAX+FILTER筛选出当前时间点之前的最后一个有效盘点时间(周/日期);
  3. 最后根据筛选出的盘点时间,返回对应的库存值。

内容的提问来源于stack exchange,提问作者LD-DS-00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:39