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