如何计算在电源查询中具有其他行作为输入的东西?
Posted
技术标签:
【中文标题】如何计算在电源查询中具有其他行作为输入的东西?【英文标题】:How can I calculate something which has other rows as inputs in power query? 【发布时间】:2019-07-18 12:23:07 【问题描述】:我在 Power 查询中有一个表,除了其他字段之外,还有以下关键字段:
SKU |年份 |周 |客户 |交易 |类型 |价值
例如,一些行是:
AB587 | 2019 | 12 | Tom | Purchase | Forecast |200
AB587 | 2019 | 12 | Tom | Sale | Forecast |15
AB587 |2019 | 11 | Tom | Stock | Actual |1455
这是一个包含大约 300,000 行的表,其中包含所有 SKU 以及所有客户几年的交易价值,这构成了一个非常有用且被广泛使用的数据透视表。我现在需要在数据中添加一些内容以使表格更加有用。
我有全年的采购和销售预测,当然还有实际情况,它们遵循上述模式。我也有所有星期的库存,但只有过去的一个,即只有实际的。我没有股票预测,这是我想添加的。计算很简单:
Stock from previous week + Purchase forecast from this week - Sale forecast from this week
我期望的最终结果是现在将添加更多行,例如:
AB587 |2019 | 12 | Tom | Stock | Forecast |1640
(我用上面的数字来计算)
现在,我不仅可以调整采购和销售,还可以调整库存水平,这将改变游戏规则。
我希望有人能在 Power Query 中帮助我解决这个问题(我在数周内尝试了多种方法,但都没有破解)
尝试自己解决:
我附加了更多的行,本质上是附加了来自我的源的所有实际周的第 1 周数据,从而可能减少了一些计算时间。然后,我将我的“交易列”转向新列,即采购、销售、库存和 Stock-1,这使得库存预测计算变得容易(看起来就是这样)。
我没有想到的是:这只是计算第一周的股票预测好,但是我不知道用刚刚计算的股票预测来计算下周的股票预测。
基本上没有办法保存我刚刚计算的库存预测以用于下周的计算。
【问题讨论】:
【参考方案1】:当您说要使用“计算出的库存预测来计算下周的库存预测”时,我不清楚您在问什么。但是,如果您只想生成作为示例提供的公式和结果作为数据集的组成部分,那非常简单。
从此开始,作为加载到 PQ 中的数据示例表,我称之为“数据表”:
我基于它创建了两个参考查询,称为 StockForecast 和 CombinedDataTable
在“StockForecast”查询中,我们将添加三个自定义列。两个是 CalcYear 和 CalcWeek 列,它们采用“Stock Actual”记录并将周增加一。第三个是 CalcValue 列,它采用“销售预测”记录并将值设为负值。编辑器中的代码如下所示:
Source = DataTable,
#"Added Custom" = Table.AddColumn(Source, "CalcYear", each
if [Transaction] = "Stock" and [Type] = "Actual" then
(if [Week] = 52 then [Year] + 1 else [Year])
else [Year]),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "CalcWeek", each
if [Transaction] = "Stock" and [Type] = "Actual" then
(if [Week] = 52 then 1 else [Week] + 1)
else [Week]
),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "CalcValue", each
if [Transaction] = "Sale" and [Type] = "Forecast" then
[Value] * -1
else [Value]
),
然后您使用 Group 函数并按 Stock、Customer、CalcYear 和 CalcWeek 聚合,并在 CalcValue 函数上使用 Sum。这将获得您正在寻找的股票预测值。之后,只需添加几列用于识别和一些清理。
#"Grouped Rows" = Table.Group(#"Added Custom2", "Stock", "Customer", "CalcYear", "CalcWeek", "Value", each List.Sum([CalcValue]), type number),
#"Added Custom3" = Table.AddColumn(#"Grouped Rows", "Transaction", each "Stock"),
#"Added Custom4" = Table.AddColumn(#"Added Custom3", "Type", each "Forecast"),
#"Renamed Columns" = Table.RenameColumns(#"Added Custom4","CalcYear", "Year", "CalcWeek", "Week")
in
#"Renamed Columns"
那么数据的最终结果是这样的:
然后只需转到 CombinedDataTable 查询,附加 StockForecast 查询,您的数据集中就有 Stock Forecast 值。
【讨论】:
感谢您的帮助@Wedge。我无法在评论中发布所有内容,所以我发布了我的 cmets 作为我问题的答案! 当我尝试添加更多周时,查询在结果方面存在重大问题。我在上面编辑了我的回复。本质上,这是我在写原始帖子时提出的观点。 所以...当数据集中还没有实际数据时,听起来您打算使用股票预测代替股票实际数据。这在理论上是可行的,但它会作为一个单独的计算来完成,我觉得这将是一个不同的数据集,因为它是推测性的,而不是基于实际发生的事情。 没错。当然,这将是推测性的。起点是实际库存数量,然后每周根据前一周的采购和销售以及库存预测来推测库存。谢谢。 你认为这是可以实现的吗?以上是关于如何计算在电源查询中具有其他行作为输入的东西?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 buildArguments 或其他任何东西在 Flutter/FirebaseAnimatedList 中查询? (请举例)