Powerbi DAX:将库存分配给未结订单(额外复杂性)

Powerbi DAX:将库存分配给未结订单(额外复杂性),powerbi,dax,powerquery,powerbi-desktop,Powerbi,Dax,Powerquery,Powerbi Desktop,我正在尝试将库存项目分配给DAX、PowerBi中的未结订单。其思想是首先将所有可用库存分配给最早的订单,然后将剩余库存分配给第二个最早的订单,以此类推,直到库存耗尽。即使未结订单未完全满足,库存也可能耗尽 我已经在这件事上问了一个类似的问题,我得到了一个很好的回答,结果也很好。现在,我给这个问题增加了额外的复杂性,即如果有多个客户或发货地点的订单日期相同,但数量不足以满足多个订单,如何决定和分配 请检查所附图片,作为下面分配的示例 最初的问题是: Inventory Allocation =

我正在尝试将库存项目分配给DAX、PowerBi中的未结订单。其思想是首先将所有可用库存分配给最早的订单,然后将剩余库存分配给第二个最早的订单,以此类推,直到库存耗尽。即使未结订单未完全满足,库存也可能耗尽

我已经在这件事上问了一个类似的问题,我得到了一个很好的回答,结果也很好。现在,我给这个问题增加了额外的复杂性,即如果有多个客户或发货地点的订单日期相同,但数量不足以满足多个订单,如何决定和分配

请检查所附图片,作为下面分配的示例

最初的问题是:

Inventory Allocation =
VAR TotalInventory =
    LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] )
VAR AlreadyOrdered =
    CALCULATE (
        SUM ( 'Open Orders'[Qty Open] ),
        ALL ( 'Open Orders' ),
        Inventory[Item] = EARLIER ( 'Open Orders'[Item] ),
        'Open Orders'[Due Date] < EARLIER ( 'Open Orders'[Due Date] )
    )
RETURN
    IF (
        AlreadyOrdered > TotalInventory,
        0,
        MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered )
    )

第一个问题的答案如下:

Inventory Allocation =
VAR TotalInventory =
    LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] )
VAR AlreadyOrdered =
    CALCULATE (
        SUM ( 'Open Orders'[Qty Open] ),
        ALL ( 'Open Orders' ),
        Inventory[Item] = EARLIER ( 'Open Orders'[Item] ),
        'Open Orders'[Due Date] < EARLIER ( 'Open Orders'[Due Date] )
    )
RETURN
    IF (
        AlreadyOrdered > TotalInventory,
        0,
        MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered )
    )
库存分配=
VAR总库存=
查找值(库存[现存量]、库存[项目]、“未结订单”[项目])
VAR AlreadyOrdered=
算计(
总额(“未结订单”[未结数量],
全部(‘未结订单’),
存货[项目]=早期('未结订单'[项目]),
“未结订单”[到期日]<更早(“未结订单”[到期日])
)
返回
如果(
AlreadyOrdered>TotalInventory,
0,
最小值(‘未结订单’[未结数量],总库存-已预售)
)

当您的客户和地点有订单时,您可以执行此操作。例如,客户编号和位置(字母)

因为有订单,您可以进行以下更改:

    VAR AlreadyOrdered =
        CALCULATE (
            SUM ( 'Open Orders'[Qty Open] ),
            FILTER ( 'Open Orders' ,
            Inventory[Item] = EARLIER ( 'Open Orders'[Item] ),
            'Open Orders'[Due Date] < EARLIER ( 'Open Orders'[Due Date]) &&
            Inventory[CustNr] < EARLIER (Inventory[CustNr]) &&
            Inventory[Location] < EARLIER (Inventory[Location]))
        )
VAR已读或已读=
算计(
总额(“未结订单”[未结数量],
过滤器(‘未结订单’,
存货[项目]=早期('未结订单'[项目]),
“未结订单”[到期日]<更早(“未结订单”[到期日])&&
存货[CustNr]<早期(存货[CustNr])&&
库存[位置]<早期(库存[位置])
)
注意:为了保持概述,我建议不要使用早期版本,而是使用变量:

VAR curItem = Inventory[Item] 
VAR curDueDate = 'Open Orders'[Due Date]
VAR curCustNr = Inventory[CustNr]
VAR curLocation = Inventory[Location]

VAR TotalInventory =
    LOOKUPVALUE ( Inventory[Qty On Hand], curItem, 'Open Orders'[Item] )
VAR AlreadyOrdered =
        CALCULATE (
            SUM ( 'Open Orders'[Qty Open] ),
            ALL ( 'Open Orders' ),
            Inventory[Item] = curItem  ),
            'Open Orders'[Due Date] < curDueDate  &&
            Inventory[CustNr] < curCustNr  &&
            Inventory[Location] < curLocation )
        )
VAR curItem=库存[项目]
VAR curDueDate='未结订单'[到期日]
VAR curCustNr=存货[CustNr]
VAR curLocation=库存[位置]
VAR总库存=
查找值(库存[现存量],库存项目,“未结订单”[项目])
VAR AlreadyOrdered=
算计(
总额(“未结订单”[未结数量],
全部(‘未结订单’),
存货[项目]=curItem),
“未结订单”[到期日]

列中必须始终有一个顺序(排序),否则这将不起作用

当您的客户和地点有订单时,您可以这样做。例如,客户编号和位置(字母)

因为有订单,您可以进行以下更改:

    VAR AlreadyOrdered =
        CALCULATE (
            SUM ( 'Open Orders'[Qty Open] ),
            FILTER ( 'Open Orders' ,
            Inventory[Item] = EARLIER ( 'Open Orders'[Item] ),
            'Open Orders'[Due Date] < EARLIER ( 'Open Orders'[Due Date]) &&
            Inventory[CustNr] < EARLIER (Inventory[CustNr]) &&
            Inventory[Location] < EARLIER (Inventory[Location]))
        )
VAR已读或已读=
算计(
总额(“未结订单”[未结数量],
过滤器(‘未结订单’,
存货[项目]=早期('未结订单'[项目]),
“未结订单”[到期日]<更早(“未结订单”[到期日])&&
存货[CustNr]<早期(存货[CustNr])&&
库存[位置]<早期(库存[位置])
)
注意:为了保持概述,我建议不要使用早期版本,而是使用变量:

VAR curItem = Inventory[Item] 
VAR curDueDate = 'Open Orders'[Due Date]
VAR curCustNr = Inventory[CustNr]
VAR curLocation = Inventory[Location]

VAR TotalInventory =
    LOOKUPVALUE ( Inventory[Qty On Hand], curItem, 'Open Orders'[Item] )
VAR AlreadyOrdered =
        CALCULATE (
            SUM ( 'Open Orders'[Qty Open] ),
            ALL ( 'Open Orders' ),
            Inventory[Item] = curItem  ),
            'Open Orders'[Due Date] < curDueDate  &&
            Inventory[CustNr] < curCustNr  &&
            Inventory[Location] < curLocation )
        )
VAR curItem=库存[项目]
VAR curDueDate='未结订单'[到期日]
VAR curCustNr=存货[CustNr]
VAR curLocation=库存[位置]
VAR总库存=
查找值(库存[现存量],库存项目,“未结订单”[项目])
VAR AlreadyOrdered=
算计(
总额(“未结订单”[未结数量],
全部(‘未结订单’),
存货[项目]=curItem),
“未结订单”[到期日]

列中必须始终有一个顺序(排序),否则这将不起作用

谢谢你的解释,奥尔德特!我尝试了&&但不起作用,我尝试让客户使用计算函数,但也不起作用。Var AlreadyOrdered=计算(总和(‘未结订单’[Qty Open]),全部(‘未结订单’[Qty Open Orders]),‘INV’[Item Number]=更早(‘未结订单’[Item]),‘未结订单’[DURE Date]<更早(‘未结订单’[Customer])我已使用过滤器更新了顶部答案,你能试试吗?我试过编辑过的代码,但没用。此外,我将此添加为一个列,而不是一个度量。因此,不来自同一个表的变量不起作用,例如curItem=Inventory[Item]。感谢Aldert的解释!我尝试了&&但不起作用,我尝试让客户使用计算函数,但也不起作用。Var AlreadyOrdered=计算(总和(‘未结订单’[Qty Open]),全部(‘未结订单’[Qty Open Orders]),‘INV’[Item Number]=更早(‘未结订单’[Item]),‘未结订单’[DURE Date]<更早(‘未结订单’[Customer])我已使用过滤器更新了顶部答案,你能试试吗?我试过编辑过的代码,但没用。此外,我将此添加为一个列,而不是一个度量。因此,不来自同一个表的变量不起作用,例如curItem=Inventory[项目]。