M - 将累计值(运行总计)转换为实际值

时间:2017-12-08 04:18:19

标签: excel powerquery m

用户收到月度客户报告,其中包含每月销售总额(几万行)。销售额显示为运行总计,我试图找到powerquery解决方案以获得实际销售额(*必需*)输出:

╔══════╦═══════╦═════════╦═══════╦════════════╗
║ Year ║ Month ║ StoreID ║ Sales ║ *Required* ║
╠══════╬═══════╬═════════╬═══════╬════════════╣
║ 2017 ║    10 ║       1 ║     5 ║          5 ║
║ 2017 ║    11 ║       1 ║    11 ║          6 ║
║ 2017 ║    12 ║       1 ║    18 ║          7 ║
║ 2017 ║    11 ║       2 ║    10 ║         10 ║
╚══════╩═══════╩═════════╩═══════╩════════════╝

在tSQL中我会做类似

的事情
Sales - LAG(Sales,1,0)OVER(Partiton by Year, StoreID Order by Month)

一个类似的问题(但反过来)was answered,但建议的解决方案看起来就像交叉连接。我是powerquery的新手(所以我可能会误解)但我不能看到这是可行的,因为数据集每个月都会增长。有没有更好的方法来解决这个问题,我在" M"?中找不到一个例子。

编辑:List.Range看起来很有希望

1 个答案:

答案 0 :(得分:4)

实际上,您需要当前行上一行的值。 一种常见的方法是添加2个Index列,一个从0开始,另一个从1开始。接下来,使用Index列作为连接列将表合并到自身。从嵌套表中展开所需列后,可以添加具有所需计算的自定义列。

let
    Source = Sales,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
    #"Added Index1" = Table.AddIndexColumn(#"Added Index", "Index.1", 1, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index1",{"Index"},#"Added Index1",{"Index.1"},"Previous",JoinKind.LeftOuter),
    #"Expanded Previous" = Table.ExpandTableColumn(#"Merged Queries", "Previous", {"StoreID", "Sales"}, {"Previous.StoreID", "Previous.Sales"}),
    #"Sorted Rows" = Table.Sort(#"Expanded Previous",{{"Index", Order.Ascending}}),
    #"Added Custom" = Table.AddColumn(#"Sorted Rows", "Required", each [Sales] - (if [StoreID] = [Previous.StoreID] then [Previous.Sales] else 0), Int64.Type),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index", "Index.1", "Previous.StoreID", "Previous.Sales"})
in
    #"Removed Columns"