如何解决如何检索处于“等待到达”模式的产品
我有 3 个表(订单、订单行、库存)。它们的关系如下:
ORDERS.ID = ORDER-ROWS.ORDER-ID(一对多)
ORDER-ROWS.EAN = STOCK.EAN(多对多)
为了摆脱多对多的关系,我在 Order-Rows 中添加了一列。
Order_number = RELATED('orders'[order])
我想弄清楚的是如何获取完成订单所需的所有产品的列表。这涉及所有状态为“缺货”的订单。 这意味着我需要弄清楚哪些产品尚未发送,或者尚未延期交货。我希望我的示例表图片能让这个复杂的问题更容易理解。
最终在 PowerBi 中出现的表格也可能为每个订单所需的每个产品都有一行。它并不特别需要有数量列。
编辑/更新 01-29-2021,18:09:
我在我的第一个示例图像中犯了一个错误;库存表中没有产品列。为了解决这个问题,我上传了第二张显示真实情况的图片。
这是正确的桌子情况
解决方法
使用精心设计的模型可以很容易地解决这个问题。
首先我们需要创建一个 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]
一起在表格中使用
当然,可以进行改进,例如:
- Order 和 Order 之间的关系也使用 Order name 订单行。
- 去掉对表格有很大影响的未使用的 ID 列 内存中的大小,因为它们包含唯一值,因此 需要在 Vertipaq 引擎中构建大型词典。
- 更改度量以实施正确的聚合,以计算总数。
编辑:由于从 Stock 表中删除 Product 列后规范发生了变化,因此产品计算表的 DAX 代码更改为更复杂的版本,该版本处理存在于 Stock 表中但不在 Stock 表中的产品订单行。 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 表不应在 DAX 中实现,而应直接从数据源读取。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。