根据列名称条件填充条件列

时间:2018-11-01 10:57:39

标签: powerquery m

我收到每周报告,其中包含一些重复的列。这是因为它是从一组相互问类似问题的Web表单中得出的-假设他们都问“ 您想加入我们的电子邮件列表吗?”-但是此问题存储在源系统作为每个表单的单独字段(每个表单实际上是一个单独的表)。这些列将始终被统一命名-例如“ Email_optin_1”,“ Email_optin_2”-因此,我可以提出一些规则来标识询问电子邮件问题的列。但是,每周的列数可能会有所不同-报表可能仅在一周内包含“ Email_optin_2”,下一周它可能会包含四个此类列。 (这取决于该周使用了哪些网络表单)。在所有这些列中,可能的值都是相同的-假设“ ”和“ ”。

通常,每行只应填充“ Email_optin”列之一。

我想做的是在Power Query中创建一个名为“ Email_Optin_FINAL”的单列,如果以“ Email_optin”开头的任何列包含“是”的值,那么它将返回“是”。

因此,基本上,不是希望标准仅引用特定列中的值,而是要首先确定需要查看哪些列,然后查看这些列中的值。

在PowerQuery中有可能吗?

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

这将找到所有包含Email_optin的列,并将它们合并为一个新列并删除原始列

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
EmailList= List.Select(Table.ColumnNames(Source), each Text.Contains(_, "Email_optin")),
#"Merged Columns" = Table.CombineColumns(Source,EmailList,Combiner.CombineTextByDelimiter("", QuoteStyle.None),"Merged")
in #"Merged Columns"

这将找到所有包含Email_optin的列,并将它们合并为一个新列并保留原始列

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Index= Table.AddIndexColumn(Source, "Index", 0, 1),
EmailList= List.Select(Table.ColumnNames(Index), each Text.Contains(_, "Email_optin")),   
Merged = Table.CombineColumns(Index,EmailList,Combiner.CombineTextByDelimiter("", QuoteStyle.None),"Merged"),
#"Merged Queries" = Table.NestedJoin(Index,{"Index"},Merged,{"Index"},"Merged",JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Merged", {"Merged"}, {"Merged"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Table2",{"Index"})
in  #"Removed Columns"

然后,您可以根据需要在合并的答案中过滤“是”