本期案例是进行如下转换:
解题套路
1.Table.Pivot
解题思路:这里可以借着结果来进行逆透视,然后来构造透视需要的格式。
根据逆透视的结果,可以对源表进行添加列,对于同一组内的赋值Part对应的Col2的值,其他进行填充,然后对Col1中对包含Part的行进行移除:
对a列进行透视处理:
步骤合并结果:
Table.RenameColumns(
Table.Pivot(
Table.RemoveMatchingRows(
Table.FillDown(
Table.AddColumn(源,"a",each if [Col1]="Part" then [Col2] else null),
{"a"}),
{[Col1="Part"]},"Col1"),
Table.SelectRows(源,each [Col1]="Part")[Col2], "a", "Col2"),
{"Col1","Part"})
也可以结合分组函数,先进行分组、添加列、合并、透视处理:
Table.Pivot(
Table.Combine(
Table.Group(源,"Col1",{"a",each
Table.AddColumn(Table.Skip(_),"b",(z)=>[Col2]{0})
},0,(x,y)=>Number.From(y="Part"))
[a]),
{"A".."C"},"b","Col2")
2.Table.Group1
解题思路:从源表中可以看到,最终结果是对数据进行分组后,取Col2的值纵向显示,那么就可以通过分组直接深化Col2列获得;对于第一列,是取行数最多的组对应的Col1的值,但发现对源的Col1进行合并去重就是想要的结果,因此就获得了以下结果:
Table.PromoteHeaders(
Table.FromColumns(
{List.Distinct(源[Col1])}&Table.Group(源,"Col1",{"a",each [Col2]},0,(x,y)=>Number.From(y="Part"))[a]
)
)
3.Table.Group2
解题思路:先进行两次分组:
再对分组部分进行转置、删除首行、提升标题等操作:
最后使用表扩展函数:
Table.RenameColumns(
Table.ExpandTableColumn(
Table.Group(
Table.Combine(Table.Group(源,"Col1",{"a",each Table.AddColumn(Table.Skip(_),"b",(z)=>[Col2]{0})},0,(x,y)=>Number.From(y="Part"))[a]),
"Col1",{"a",each Table.PromoteHeaders(Table.ReverseRows(Table.Skip(Table.Transpose(_))))}),
"a",{"A".."C"}),
{"Col1","Part"})
4.Table.AggregateTableColumn
解题思路:先进行两次分组。
在使用函数进行聚合处理:
Table.AggregateTableColumn(
Table.Group(Table.Combine(Table.Group(源,"Col1",{"a",each Table.PromoteHeaders(_)},0,(x,y)=>Number.From(y="Part"))[a]),"Part",{"b",each _}),
"b",List.Transform(Table.SelectRows(源,each [Col1]="Part")[Col2],(x)=>{x,Text.Combine,x}))
以上是本期内容。