如何计算在电源查询中具有其他行作为输入的东西?

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 中查询? (请举例)

如何创建命令行参数

java是啥东西?

如何从其他地方选择具有不同 WHERE 语句的东西

如何修复电源查询中的“值不是单个字符串”

在输入 cin 之前如何显示其他“可爱”的东西?