Power Query - 基于两个过滤器的分组

Power Query - Group based on two filters

我正在使用 Power Query 简化我的一些报告。 我有一个 table 这种结构:

在第一列中,我们可以看到销售订单号。 在第二列中,我们可以看到消息类型。如果它是 XR 或 PR 消息。 在最后一列中,我们可以找到状态的键:

根据这个逻辑我想得到这个结果table:

这样我就可以看到每个销售订单的类型和状态交叉 table。 使用 Power Query 如何做到这一点?

如果我没看错的话,您的输出 PR 和 XR 在销售订单 103 中混淆了。

试试这个是否适合你:

let
    Source = Excel.Workbook(File.Contents("C:\Users\maitting\Documents\Mappe1.xlsx"), null, true),
    Tabelle1_Sheet = Source{[Item="Tabelle1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(Tabelle1_Sheet, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Sales Order", Int64.Type}, {"Message", type text}, {"Key", type text}}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Changed Type", "Message", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Message"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Message", type text}}),
    #"Replaced Value" = Table.ReplaceValue(#"Changed Type1","A","Active",Replacer.ReplaceText,{"Key"}),
    #"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","B","Active",Replacer.ReplaceText,{"Key"}),
    #"Replaced Value2" = Table.ReplaceValue(#"Replaced Value1","C","Closed",Replacer.ReplaceText,{"Key"}),
    #"Merged Columns" = Table.CombineColumns(#"Replaced Value2",{"Message", "Key"},Combiner.CombineTextByDelimiter(" - ", QuoteStyle.None),"Merged"),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Merged Columns", {"Sales Order"}, "Attribute", "Value"),
    #"Pivoted Column" = Table.Pivot(#"Unpivoted Columns", List.Distinct(#"Unpivoted Columns"[Value]), "Value", "Attribute", List.Count),
    #"Added Conditional Column" = Table.AddColumn(#"Pivoted Column", "XR", 
        each if [#"XR - Active"] = 1 then 1 
        else if [#"XR - Closed"] = 1 then 1 
        else 0),
    #"Added Conditional Column1" = Table.AddColumn(#"Added Conditional Column", "PR", 
        each if [#"PR - Active"] = 1 then 1 
        else if [#"PR - Closed"] = 1 then 1 
        else 0),
    #"Removed Columns" = Table.RemoveColumns(#"Added Conditional Column1",{"XR - Closed", "PR - Closed"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"Sales Order", "XR", "PR", "XR - Active", "PR - Active"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Reordered Columns",{{"XR", type logical}, {"PR", type logical}, {"XR - Active", type logical}, {"PR - Active", type logical}})
in
    #"Changed Type2"

输出:

我刚刚添加了 PR 已关闭的销售订单 104 以处理所有可能的情况。

您确定销售订单 103 的结果吗?

尝试以下 M 代码,必要时进行修改(例如 Source 步骤):

let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  XRCol = Table.AddColumn(
    Source, 
    "XR", 
    each Text.BeforeDelimiter([Message], "-") = "XR", 
    type logical
  ), 
  PRCol = Table.AddColumn(
    XRCol, 
    "PR", 
    each Text.BeforeDelimiter([Message], "-") = "PR", 
    type logical
  ), 
  XRActCol = Table.AddColumn(PRCol, "XR Active", each [XR] and [Key] <> "C", type logical), 
  PRActCol = Table.AddColumn(XRActCol, "PR Active", each [PR] and [Key] <> "C", type logical), 
  RemoveCols = Table.RemoveColumns(PRActCol, {"Message", "Key"}), 
  Group = Table.Group(
    RemoveCols, 
    {"Sales Order"}, 
    {
      {"XR", each List.Max([XR]), type logical}, 
      {"PR", each List.Max([PR]), type logical}, 
      {"XR Active", each List.Max([XR Active]), type logical}, 
      {"PR Active", each List.Max([PR Active]), type logical}
    }
  )
in
  Group

我的版本

let Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
RemoveEndingColumn = Table.TransformColumns(Source,{{"Message", each Text.BeforeDelimiter(_, "-"), type text}}),
#"Create MessageKey" = Table.AddColumn(RemoveEndingColumn, "MessageKey", each [Message]&" "&[Key]),
StackColumns = Table.RenameColumns(Table.SelectColumns(#"Create MessageKey",{"Sales Order", "Message"}),{{"Message", "Column"}})& Table.RenameColumns(Table.SelectColumns(#"Create MessageKey",{"Sales Order", "MessageKey"}),{{"MessageKey", "Column"}}),
#"Added Custom1" = Table.AddColumn(StackColumns, "TrueFalse", each true, type logical),
#"Pivoted Column" = Table.Pivot(#"Added Custom1", List.Distinct(#"Added Custom1"[Column]), "Column", "TrueFalse")
in #"Pivoted Column"