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

Power BI库存报表补全每日库存:SQL/DAX实现方案求助

用DAX补全Navision库存变动表的无日期记录

完全可以用DAX实现无变动日期的库存补全,核心思路是先生成完整的日期-物品-地点组合,再通过上下文筛选获取每个组合最近一次的库存变动值并继承。以下是具体实现步骤:

1. 生成基础维度表

首先需要两个基础表来构建完整的日期-物品-地点矩阵:

  • 日期表:覆盖原库存表的所有日期范围
    DateTable = CALENDAR(MIN('Item Ledger Entry'[Posting Date]), MAX('Item Ledger Entry'[Posting Date]))
    
  • 物品-地点维度表:提取原表中所有不重复的物品+地点组合
    ItemLocation = DISTINCT(SELECTCOLUMNS('Item Ledger Entry', "Item No.", 'Item Ledger Entry'[Item No.], "Location Code", 'Item Ledger Entry'[Location Code]))
    

2. 创建完整的日期-物品-地点组合表

通过交叉连接生成所有可能的日期-物品-地点组合,确保无变动日期也有对应的记录:

FullInventoryDates = CROSSJOIN('DateTable', 'ItemLocation')

3. 计算每日库存值(度量值)

创建DAX度量值来计算每个组合的当日库存,逻辑是找到该物品+地点在当日及之前的最后一次变动,取累计库存值:

Current Inventory = 
VAR CurrentDate = MAX('FullInventoryDates'[Date])
VAR LastEntryDate = 
    CALCULATE(
        MAX('Item Ledger Entry'[Posting Date]),
        FILTER(
            ALL('Item Ledger Entry'),
            'Item Ledger Entry'[Item No.] = MAX('FullInventoryDates'[Item No.]) &&
            'Item Ledger Entry'[Location Code] = MAX('FullInventoryDates'[Location Code]) &&
            'Item Ledger Entry'[Posting Date] <= CurrentDate
        )
    )
VAR InventoryValue = 
    CALCULATE(
        SUM('Item Ledger Entry'[Quantity]),
        FILTER(
            ALL('Item Ledger Entry'),
            'Item Ledger Entry'[Item No.] = MAX('FullInventoryDates'[Item No.]) &&
            'Item Ledger Entry'[Location Code] = MAX('FullInventoryDates'[Location Code]) &&
            'Item Ledger Entry'[Posting Date] <= LastEntryDate
        )
    )
RETURN IF(ISBLANK(InventoryValue), 0, InventoryValue)

注意:如果Navision的Quantity字段是变动量(入库为正、出库为负),则SUM到最后变动日期即可得到当前库存;如果是累计库存值,则将SUM改为LASTNONBLANK('Item Ledger Entry'[Quantity], 1)直接取最后一次的记录值。

4. 更简洁的替代方案(直接生成带库存的完整表)

如果不需要单独的组合表,也可以用GENERATEALL直接生成包含库存的完整数据集:

Full Inventory = 
GENERATEALL(
    CROSSJOIN(
        CALENDAR(MIN('Item Ledger Entry'[Posting Date]), MAX('Item Ledger Entry'[Posting Date])),
        DISTINCT(SELECTCOLUMNS('Item Ledger Entry', "Item No.", [Item No.], "Location Code", [Location Code]))
    ),
    VAR CurrentDate = [Date]
    VAR LastInventory = 
        LASTNONBLANKVALUE(
            FILTER('Item Ledger Entry', [Posting Date] <= CurrentDate && [Item No.] = EARLIER([Item No.]) && [Location Code] = EARLIER([Location Code])),
            SUM('Item Ledger Entry'[Quantity])
        )
    RETURN ROW("Inventory", IF(ISBLANK(LastInventory), 0, LastInventory))
)

关于SQL交叉连接失效的可能原因

你之前尝试的SQL交叉连接没生效,大概率是以下问题:

  • 没有生成全量的日期-物品-地点组合,比如日期范围不全或遗漏了部分物品/地点
  • 关联库存值时没有正确筛选出每个组合的最近一次变动记录,导致无变动日期的库存值为空

DAX在处理这种上下文筛选和时间智能场景时,比SQL更适配Power BI的模型环境,尤其是可以直接利用模型中的关系和上下文计算。

内容的提问来源于stack exchange,提问作者Marie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:17:42