powerbi - 如何检索处于“等待到达”模式的产品
问题描述
我有 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:
我在第一个示例图像中犯了一个错误;库存表中没有产品列。为了说明这一点,我上传了第二张显示真实情况的图片。
这是正确的桌子情况
解决方案
使用精心设计的模型可以很容易地解决这个问题。
首先,我们需要创建一个 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]
当然,可以进行改进,例如:
- 对 Orders 和 OrdersRows 之间的关系也使用订单名称。
- 摆脱未使用的 ID 列,这对内存中的表大小有很大影响,因为它们包含唯一值,因此需要在 Vertipaq 引擎中构建大字典。
- 更改度量以实现正确的聚合,以计算总计。
编辑:由于规范随着从 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 表,而应直接从数据源中读取。
推荐阅读
- javascript - 如何将 fs.readdir file.length 结果存储到全局变量?
- java - 视频作为背景 JAVA GUI
- python - 关闭调试或运行选项卡时更改 Pycharm 的断开/终止设置
- android - 处理程序中断问题
- java - 基于基础的 LDAP Active Directory 组搜索不向下钻取以包含多个 OU
- excel - 调整命名范围的大小会删除范围的名称结构
- apache-nifi - 在 Apache NiFi 处理器中有没有办法获取主机的 fqdn 和 IP 地址?
- php - 复选框 htmlentities() 期望参数 1 是字符串,给定数组
- ruby-on-rails - Rails 凭证返回 nil
- php - 如何在变量中使用“if”和“else”