本期案例是需要对货架名称进行如下显示:

解题套路
1.Table.Group
解题思路:按名称进行分组,分组依据是名称是否包含“货架”。将分组后行数为1的部分替换为空,然后深化合并。再在源数据中筛选层级小于3的数据,最后将两者进行合并获得最终结果。
这样方式的处理有较大的局限性,扩展性较差,有凑数的嫌疑,只适用于当前或者类似的案例。


let tab=Table.Group(源,"名称",{"a",each _},0,(x,y)=>Number.From(Text.Contains(y,"货架"))) in Table.FromValue(Table.SelectRows(源,each [层级]<=2)[名称]&List.Combine(List.Transform(tab[a],each if Table.RowCount(_)=1 then {} else {""}&_[名称])))
2.Table.Pivot
解题思路:通过添加索引列,再针对层级进行透视处理,这样就获得了如下层级进行纵向分布的结果。
接下来就直接根据第3级进行分组,然后深化合并;最后与通过筛选源表中的层级小于3的数据或者根据透视后的第二、三列的结果合并去空后的结果进行合并。


let tab=Table.Pivot(Table.TransformColumns(Table.AddIndexColumn(源,"索引",1),{"层级",Text.From}),{"1".."4"}, "层级", "名称") in Table.FromValue(Table.SelectRows(源,each [层级]<=2)[名称]&List.Combine(List.Transform(Table.Group(Table.Skip(tab,2),"3",{"a",each _},0,(x,y)=>Number.From(y<>null))[a],each {""}&List.RemoveNulls(List.Combine(List.LastN(Table.ToColumns(_),2))))))
3.List.Accumulate
解题思路:ACC函数的第二参数为包含三个子列表的list,将层级小于3的部分,直接归集到x{0}中,对于其他部分先归集到x{2}中,截断的依据是当层级数为3的时候,将x{2}中的数据转移到x{1}中。

Table.FromValue(List.Combine(List.RemoveLastN(List.Combine(List.Accumulate(Table.ToRows(源)&{{3,""}},{{},{},{}},(x,y)=>if y{0}<=2 then {x{0}&{{y{1}}},x{1},x{2}} else if y{0}=3 and x{2}<>{} then {x{0},x{1}&{{""}&x{2}},{y{1}}} else {x{0},x{1},x{2}&{y{1}}})))))
第个if中加了个x{2}<>{}的条件,是为了规避当x{2}为空的时候,在层级为3的时候,不会空转移一次,不然出现的结果是第五行的位置会多一个空行。
以上是本期内容。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...





