Powerbi 根据其他列中的键值对列中的值进行转置

Powerbi 根据其他列中的键值对列中的值进行转置,powerbi,powerquery,Powerbi,Powerquery,我想基于B5列对下面的输入表进行一种转换。在输出中显示B5的唯一值,并转换B3中与B5中相同值相关的所有值 +----+----+-------+----+----+ | B1 | B2 | B3 | B4 | B5 | +----+----+-------+----+----+ | R | 1 | 1624 | M | 11 | +----+----+-------+----+----+ | R | 1 | 4606 | M | 12 | +----+----+-----

我想基于B5列对下面的输入表进行一种转换。在输出中显示B5的唯一值,并转换B3中与B5中相同值相关的所有值

+----+----+-------+----+----+
| B1 | B2 |   B3  | B4 | B5 |
+----+----+-------+----+----+
|  R |  1 |  1624 |  M | 11 |
+----+----+-------+----+----+
|  R |  1 |  4606 |  M | 12 |
+----+----+-------+----+----+
|  R |  1 |  4609 |  M | 12 |
+----+----+-------+----+----+
|  R |  1 |  4630 |  M | 12 |
+----+----+-------+----+----+
|  R |  1 |  4690 |  M | 12 |
+----+----+-------+----+----+
|  R |  1 | 25660 |  M | 27 |
+----+----+-------+----+----+
|  R |  1 | 73003 |  M | 28 |
+----+----+-------+----+----+
|  R |  1 | 73006 |  M | 28 |
+----+----+-------+----+----+
|  R |  1 | 73008 |  M | 28 |
+----+----+-------+----+----+
|  R |  1 | 73013 |  M | 28 |
+----+----+-------+----+----+

低于当前步骤,但未获得预期输出

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"B1", type text}, {"B2", Int64.Type}, {"B3", Int64.Type}, {"B4", type text}, {"B5", Int64.Type}}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Changed Type", {{"B5", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Changed Type", {{"B5", type text}}, "en-US")[B5]), "B5", "B1")
in
    #"Pivoted Column"

请帮帮忙。提前谢谢。

你的意思是这样的吗

let
    Source = Excel.CurrentWorkbook(){[Name="tblData"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"B1", type text}, {"B2", Int64.Type}, {"B3", Int64.Type}, {"B4", type text}, {"B5", Int64.Type}}),
    #"Cleaned Text" = Table.TransformColumns(#"Changed Type",{{"B1", Text.Clean, type text}, {"B4", Text.Clean, type text}}),
    #"Removed Columns" = Table.RemoveColumns(#"Cleaned Text",{"B1", "B2", "B4"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"B5"}, {{"tblB3", each _, type table [B3=nullable number, B5=nullable number]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "lstB3", each Table.Column([tblB3],"B3")),
    #"Removed Columns1" = Table.RemoveColumns(#"Added Custom",{"tblB3"}),
    #"Extracted Values" = Table.TransformColumns(#"Removed Columns1", {"lstB3", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "lstB3", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"lstB3.1", "lstB3.2", "lstB3.3", "lstB3.4"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"lstB3.1", Int64.Type}, {"lstB3.2", Int64.Type}, {"lstB3.3", Int64.Type}, {"lstB3.4", Int64.Type}})
in
    #"Changed Type1"
这就是我得到的输出

上述M代码的缺点是,如果向数据中添加或删除某些内容,它将无法生成正确的列数

如果你看看数据集

输出是

但应该是这样

这是因为上面的查询在创建查询时只考虑分隔符的数量

通过以下两个查询,可以解决此问题。 以下查询将准备数据(仅将其定义为连接)

基于代码的second查询将动态拆分列

let
  Source = tblSplit,
  DynamicColumnList = List.Transform({
    1..List.Max(
      Table.AddColumn(Source, "Custom", each List.Count(
        Text.PositionOfAny([B3], {","}, Occurrence.All)
      ))[Custom]
    ) + 1
  }, each "B3." & Text.From(_)),
  #"Split Column by Delimiter" = Table.SplitColumn(
    Source, 
    "B3", 
    Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
    DynamicColumnList
  )
in
  #"Split Column by Delimiter"

非常感谢你的解释。它似乎工作得很好!只有一个问题。如果列数更多,我只需要更改此示例中B4和B3值所在的列的名称?我不确定是否收到了您的问题。您是在谈论您开始使用的数据集中的列吗?或者您是在谈论结果数据集中的列数?你们能解释一下吗?我的意思是,在输入表中有更多的列,B3和B5有不同的列位置。例如,B3可以位于第10列的位置,B5可以位于第12列的位置。输出将具有相同的信息,只有B5和B3_1到B3_n。好的,这不是问题。但是,当然,您必须调整使用这些不必要的列的步骤。我一直在尝试,当我更改列的名称并使用与您相同的逻辑删除其他列时,它对我很有效。我想那就是办法。非常感谢你的帮助。当做
let
  Source = tblSplit,
  DynamicColumnList = List.Transform({
    1..List.Max(
      Table.AddColumn(Source, "Custom", each List.Count(
        Text.PositionOfAny([B3], {","}, Occurrence.All)
      ))[Custom]
    ) + 1
  }, each "B3." & Text.From(_)),
  #"Split Column by Delimiter" = Table.SplitColumn(
    Source, 
    "B3", 
    Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
    DynamicColumnList
  )
in
  #"Split Column by Delimiter"