如何检索处于 "waiting to arrive" 模式的产品
How to retrieve products that are in "waiting to arrive" mode
我有 3 个 table(订单、订单行、库存)。它们的关系如下:
ORDERS.ID = ORDER-ROWS.ORDER-ID (1 to many)
ORDER-ROWS.EAN = STOCK.EAN(多对多)
为了摆脱多对多关系,我在 Order-Rows 中添加了一列。
Order_number = RELATED('orders'[order])
我想弄清楚的是如何获得完成订单所需的所有产品的列表。这涉及状态为 'backorder' 的所有订单。
这意味着我需要弄清楚哪些产品 尚未发送,或者哪些产品尚未发货然而。我希望我的示例 tables 图片可以使这个复杂的问题更容易理解。
最终在 PowerBi 中出现的 table 也可能对每个订单所需的每个产品都有一行。它并不特别需要有数量列。
编辑/更新 01-29-2021,18:09:
我在第一个示例图像中犯了一个错误;库存中没有产品栏-table。为了纠正这一点,我上传了第二张显示真实情况的图片。
这是正确的 TABLE 情况
使用精心设计的模型可以很容易地解决这个问题。
首先我们需要创建一个产品 table,然后我们可以使用 EAN 列创建产品与订单行和库存 table 之间的关系。
我们已经在 OrderID 列上建立了 Orders 和 OrdersRows 之间的关系,我们需要使用 Ordernumber 列在 Orders 和 Stock 之间添加关系。
我们要的模型是这个
为了示例的缘故,我使用此代码创建了产品 table,该代码仅采用库存 table 中存在的那些。真正的 Product table 应该包含所有可能出现在 Stock 和 OrderRows table.
中的产品
注意:从 Stock table 中删除 Product 列后,这个简单的代码不再有效。请参阅下面的新工作(和更长)版本
Product = ALL( Stock[EAN], Stock[Product] )
我们现在可以编写一个度量来检查当前选择中的订单是否处于“延期交货”状态,然后按订单中的每个产品计算已经发送的延期交货数量,最后计算与订单的差异数量。如果差异大于 0,则度量 returns 将在 table.
中显示一个非空白值
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
)
)
此度量可以在 table 中与 Orders[Order]
、Orders[Date]
、'Product'[Product]
一起使用
当然可以改进,比如:
- 订单和订单之间的关系也使用订单名称
OrdersRows.
- 删除未使用的 ID 列,这对 table 有很大影响
内存中的大小,因为它们包含唯一值,因此
需要在 Vertipaq 引擎中内置大词典。
- 更改度量以实现正确的聚合,计算总数。
编辑:由于规格随着从库存中删除产品列而改变 table,计算的产品的 DAX 代码 table 更改为更复杂的版本,处理产品存在于 Stock table 但不存在于 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
在实际场景中,Product table 不应在 DAX 中实现,而应直接从数据源中读取。
我有 3 个 table(订单、订单行、库存)。它们的关系如下:
ORDERS.ID = ORDER-ROWS.ORDER-ID (1 to many)
ORDER-ROWS.EAN = STOCK.EAN(多对多)
为了摆脱多对多关系,我在 Order-Rows 中添加了一列。
Order_number = RELATED('orders'[order])
我想弄清楚的是如何获得完成订单所需的所有产品的列表。这涉及状态为 'backorder' 的所有订单。 这意味着我需要弄清楚哪些产品 尚未发送,或者哪些产品尚未发货然而。我希望我的示例 tables 图片可以使这个复杂的问题更容易理解。
最终在 PowerBi 中出现的 table 也可能对每个订单所需的每个产品都有一行。它并不特别需要有数量列。
编辑/更新 01-29-2021,18:09:
我在第一个示例图像中犯了一个错误;库存中没有产品栏-table。为了纠正这一点,我上传了第二张显示真实情况的图片。
这是正确的 TABLE 情况
使用精心设计的模型可以很容易地解决这个问题。
首先我们需要创建一个产品 table,然后我们可以使用 EAN 列创建产品与订单行和库存 table 之间的关系。
我们已经在 OrderID 列上建立了 Orders 和 OrdersRows 之间的关系,我们需要使用 Ordernumber 列在 Orders 和 Stock 之间添加关系。
我们要的模型是这个
为了示例的缘故,我使用此代码创建了产品 table,该代码仅采用库存 table 中存在的那些。真正的 Product table 应该包含所有可能出现在 Stock 和 OrderRows table.
中的产品注意:从 Stock table 中删除 Product 列后,这个简单的代码不再有效。请参阅下面的新工作(和更长)版本
Product = ALL( Stock[EAN], Stock[Product] )
我们现在可以编写一个度量来检查当前选择中的订单是否处于“延期交货”状态,然后按订单中的每个产品计算已经发送的延期交货数量,最后计算与订单的差异数量。如果差异大于 0,则度量 returns 将在 table.
中显示一个非空白值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
)
)
此度量可以在 table 中与 Orders[Order]
、Orders[Date]
、'Product'[Product]
当然可以改进,比如:
- 订单和订单之间的关系也使用订单名称 OrdersRows.
- 删除未使用的 ID 列,这对 table 有很大影响 内存中的大小,因为它们包含唯一值,因此 需要在 Vertipaq 引擎中内置大词典。
- 更改度量以实现正确的聚合,计算总数。
编辑:由于规格随着从库存中删除产品列而改变 table,计算的产品的 DAX 代码 table 更改为更复杂的版本,处理产品存在于 Stock table 但不存在于 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
在实际场景中,Product table 不应在 DAX 中实现,而应直接从数据源中读取。