首页 > 解决方案 > 如何检索处于“等待到达”模式的产品

问题描述

我有 3 个表(订单、订单行、库存)。它们的关系如下:
ORDERS.ID = ORDER-ROWS.ORDER-ID (1 to many)
ORDER-ROWS.EAN = STOCK.EAN (many to many)
为了摆脱多对多关系,我向 Order-Rows 添加了一列。

Order_number = RELATED('orders'[order])

我想弄清楚的是如何获得履行订单所需的所有产品的清单。这涉及状态为“延期交货”的所有订单。这意味着我需要弄清楚哪些产品尚未发送,或者哪些产品尚未延期交货。我希望我的示例表图像可以使这个复杂的问题更容易理解。

在此处输入图像描述

最终在 PowerBi 中出现的表格也可能针对每个订单所需的每个产品都有一行。它并不特别需要有数量列。

编辑/更新 2021 年 1 月 29 日,18:09:
我在第一个示例图像中犯了一个错误;库存表中没有产品列。为了说明这一点,我上传了第二张显示真实情况的图片。
这是正确的桌子情况 在此处输入图像描述

标签: powerbidaxpowerbi-desktop

解决方案


使用精心设计的模型可以很容易地解决这个问题。

首先,我们需要创建一个 Product 表,然后我们可以使用 EAN 列创建 Product 与 Order Rows 和 Stock 表之间的关系。

我们已经在 OrderID 列上建立了 Orders 和 OrdersRows 之间的关系,我们需要使用 Ordernumber 列添加 Orders 和 Stock 之间的关系。

我们想要的模型是这样的

模型

出于示例的目的,我使用此代码创建了 Product 表,它仅采用 Stock 表中存在的那些。真实的 Product 表应该包含所有可能出现在 Stock 和 OrderRows 表中的产品。

注意:从 Stock 表中删除 Product 列后,这个简单的代码不再起作用。请参阅下面的新工作(和更长)版本

Product = ALL( Stock[EAN], Stock[Product] )

我们现在可以编写一个度量来检查当前选择中的订单是否处于“延期交货”状态,然后按订单中的每个产品计算已经在延期交货的情况下发送了多少,最后计算与订单数量的差异。如果差值大于 0,则度量返回要在表中显示的非空白值。

Quantity waiting for = 
IF(
    SELECTEDVALUE(Orders[Status]) = "Backorder",
    VAR SentOrBackorder = 
        CALCULATE(
            COUNTROWS( Stock ),
            Stock[Location] IN { "sent", "backorder" } 
        )
    VAR Missing = SUM(OrdersRows[Quantity]) - SentOrBackorder
    RETURN         
    IF (
        Missing > 0,
        Missing
    )
)

此度量可与Orders[Order], Orders[Date],一起用于表中'Product'[Product]

表视觉

表视觉属性

当然,可以进行改进,例如:

  1. 对 Orders 和 OrdersRows 之间的关系也使用订单名称。
  2. 摆脱未使用的 ID 列,这对内存中的表大小有很大影响,因为它们包含唯一值,因此需要在 Vertipaq 引擎中构建大字典。
  3. 更改度量以实现正确的聚合,以计算总计。

编辑:由于规范随着从 Stock 表中删除 Product 列而更改,因此产品计算表的 DAX 代码更改为更复杂的版本,该版本处理 Stock 表中存在但 OrdersRows 中不存在的产品。EAN 在缺失时用作产品名称。

Product =
VAR OrderEAN =
    ALL ( OrdersRows[EAN] )
VAR StockEAN =
    ALL ( Stock[EAN] )
VAR StockOnlyEAN =
    EXCEPT (
        StockEAN,
        OrderEAN
    )
VAR OrderProduct =
    ALL (
        OrdersRows[EAN],
        OrdersRows[Product]
    )
VAR StockProduct =
    CALCULATETABLE (
        ADDCOLUMNS (
            VALUES ( Stock[EAN] ),
            "Product", Stock[EAN]
        ),
        StockOnlyEAN
    )
VAR Result =
    UNION (
        OrderProduct,
        StockProduct
    )
RETURN
    Result

在实际场景中,不应在 DAX 中实现 Product 表,而应直接从数据源中读取。


推荐阅读