首页 > 解决方案 > 从表格到 Excel 中的 2 列

问题描述

我想从一个表中创建两列。

正确的解决方案是这样的(这将是 2 个单独的列):

在此处输入图像描述

从此表:

在此处输入图像描述

该表比这长得多,这是一个例子。

你能帮我解决这个问题吗?

谢谢,格戈

标签: excelfunctionexcel-formulapowerquery

解决方案


要将现有数据加载到 PQ 中,它需要是一个表。为了简单起见,我会将其转换为表格并取消选中“我的表格有标题”。然后在您的标识符行上放置一些标签,以便我们轻松转换它们。我做完之后是这个样子的。

在此处输入图像描述

然后使用“From Table”选项将您的表加载到 PQ 中。默认情况下,它可能会尝试设置类型和提升标题,这没有帮助,因此删除这些步骤。它应该看起来像这样。

在此处输入图像描述

为了能够映射您的多行标题,我们需要进行一些数据透视转换。引用我们刚刚导入的表。

在此处输入图像描述

保留前 3 行,选择第一列和“Unpivot Other Columns”。然后再次选择第一列和“Pivot Columns”。选择“值”列作为“值列”,然后在“高级选项”下选择“不聚合”。

在此处输入图像描述

在这个透视之后,您现在将拥有一个将所有列映射到它们的标题行的表。我将带有数字的列转换为文本,因为稍后我们会将其作为文本附加。结果表如下所示:

在此处输入图像描述

此查询的完整代码是:

let
    Source = Table1,
    #"Kept First Rows" = Table.FirstN(Source,3),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Kept First Rows", {"Column1"}, "Attribute", "Value"),
    #"Pivoted Column" = Table.Pivot(#"Unpivoted Other Columns", List.Distinct(#"Unpivoted Other Columns"[Column1]), "Column1", "Value"),
    #"Changed Type" = Table.TransformColumnTypes(#"Pivoted Column",{{"Region", type text}})
in
    #"Changed Type"

然后返回并再次引用您导入的表。这次删除前 3 行,选择第一列和 Unpivot Other Columns。您将获得一个日期列表,其中包含所有其他未透视的数据列。现在,您可以通过匹配此表中的属性列和您映射标题行的表来合并查询。

在此处输入图像描述

展开合并的数据,现在您将标题行映射到表中的每一行数据。您可以添加一个自定义列来创建您想要的唯一 ID 列,然后删除并移动这些列以获得您想要的结果数据。自定义列代码对我来说如下所示:

[Country Code]&"_"&DateTime.ToText([Column1], "MM/dd/yyyy")&"_"&[Region]

这是结果表:

在此处输入图像描述

这部分的完整 M 代码是:

let
    Source = Table1,
    #"Removed Top Rows" = Table.Skip(Source,3),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Top Rows", {"Column1"}, "Attribute", "Value"),
    #"Merged Queries" = Table.NestedJoin(#"Unpivoted Other Columns",{"Attribute"},RowIDs,{"Attribute"},"RowIDs",JoinKind.LeftOuter),
    #"Expanded RowIDs" = Table.ExpandTableColumn(#"Merged Queries", "RowIDs", {"Country Code", "Country", "Region"}, {"Country Code", "Country", "Region"}),
    #"Added Custom" = Table.AddColumn(#"Expanded RowIDs", "ID", each [Country Code]&"_"&DateTime.ToText([Column1], "MM/dd/yyyy")&"_"&[Region]),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"Value", "ID"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Other Columns",{"ID", "Value"})
in
    #"Reordered Columns"

推荐阅读