强大的查询-从单列到整个表的数据转换

时间:2018-10-08 18:27:01

标签: powerbi powerquery m

我有一个这样的表的要求-

具有2列的实际表格

Column1                                              Column2
ColAValue $$ ColBValue $$                            New Row
ColCValue                                            Above Row
ColCValue2                                           Above Row
$$ ColDValue                                         Above Row
ColAValue $$ ColBValue $$ ColCValue $$ ColDValue     New Row
ColAValue $$ ColBValue $$ ColCValue                  New Row
$$ ColDValue                                         Above Row

我知道根据要求,我的数据集中将有 4列,而离开第2列

我需要使用查询编辑器将转换后的表作为新表。

这是我的预期输出,

具有4列的OutTable

Expected Output

基本上,列值由定界符$$顺序标识,如果column2说有新行,则它是一条新记录,否则,它必须转到当前行并附加为新列值。

如何在查询编辑器中将输入表转换为该输出表?

最终输出的数据类型无关紧要。

  

第一步是将“上一行”中的行值带入   带有分隔符的新行,并将其作为单行。

1 个答案:

答案 0 :(得分:2)

此处的关键是创建一个分组列,该分组列将每一行分配为其最终的输出行号。您可以通过在Column2中用“新行”查找最后一行的索引来完成此操作。

首先,创建一个索引列(在“添加列”标签下)。

现在,您可以如上所述通过获取最大索引来创建分组定制列。公式可能看起来像这样:

List.Max(
    Table.SelectRows(#"Prev Step Name",
        (here) => [Index] >= here[Index] and here[Column2] = "New Row"
    )[Index]
)

您的表格现在应如下所示:

Group Custom Column

现在,我们使用“分组依据”(在“首页”标签下),按Group列进行分组,并在Column1上进行汇总。

Group By

但是我们将汇总从List.Max更改为Text.Combine,以便此步骤的代码为

= Table.Group(#"Added Custom", {"Group"},
      {{"Concat", each Text.Combine([Column1]," "), type text}})

现在表格应如下所示:

Concatenated

在这里,您可以使用" && "作为分隔符(在“主页”选项卡下)按分隔符进行分隔列。

根据需要更改任何列名,如果不再需要Group列,则结果应为所需的输出。

Desired Output


整个查询的M代码:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wcs7PcQxLzClNVVBRUQBynGAcJR0lv9RyhaD8cqVYHbA6Z7AUUNwxKb8sFVPGCEMKYqQLTn3YbVaAm6iAZgCagwhpR9OB2zWxAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1),
    #"Reordered Columns" = Table.ReorderColumns(#"Added Index",{"Index", "Column1", "Column2"}),
    #"Added Custom" = Table.AddColumn(#"Reordered Columns", "Group", each List.Max(Table.SelectRows(#"Reordered Columns", (here) => [Index] >= here[Index] and here[Column2] = "New Row")[Index]), Int64.Type),
    #"Grouped Rows" = Table.Group(#"Added Custom", {"Group"}, {{"Concat", each Text.Combine([Column1]," "), type text}}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Grouped Rows", "Concat", Splitter.SplitTextByDelimiter(" $$ ", QuoteStyle.Csv), {"COL1", "COL2", "COL3", "COL4"}),
    #"Removed Columns" = Table.RemoveColumns(#"Split Column by Delimiter",{"Group"})
in
    #"Removed Columns"