转置到多列 wrap n

Transpose to multiple columns wrap n

我需要 transpose/pivot 学生编号和姓名从行到多列,但限制为 15 列,所以如果超过 15,我需要开始一个新行。这需要用于每个中心、主题和类型。我想转移到新的 sheet 或去掉多余的行。我一直无法成功地将两列重复 STEP 到新列中。 大约有 500,000 行。请帮助我卡住了!

例如:

Center  Course  Type    Student_Num Student_Name
1001    Science 1   1   John
1001    Science 1   2   Linda
1001    Science 1   3   Pete
1001    Science 2   1   Susan
1001    Science 2   2   Gary
1001    English 1   1   Bob
1001    English 1   2   Kate
1002    Science 1   1   Alice
1002    Science 1   2   Rick
1002    Science 1   3   Pat
1002    Science 1   4   Shanon
1002    Science 1   5   Louis
1002    English 1   1   Cathleen

转换:

Center  Course  Type    Student1_Num    Student1_Name   Student2_Num    Student2_Name
1001    Science 1   1   John    2   Linda
1001    Science 1   3   Pete        
1001    Science 2   1   Susan   2   Gary
1001    English 1   1   Bob 2   Kate
1002    Science 1   1   Alice   2   Rick
1002    Science 1   3   Pat 4   Sharon
1002    Science 1   5   Louis       
1002    English 1   1   Cathleen        

希望这没有重复,但我找不到任何可以给我正确结果的东西 谢谢

带有参数、列表和查询的解决方案。

表现相当不错:

我在Excel测试了100,000条记录,用了大约15秒;

500,000 条记录大约 2:15 分钟。

每行的学生人数是动态的。

参数 MaxStudentsPerRow:

2 meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=true]

List ExpandList,导致嵌套列表:

"0", "Student1_Num", "Student1_Name"

"1", "Student2_Num", "Student2_Name"

等等

let
    Source = {1..MaxStudentsPerRow},
    ToText = List.Transform(Source, each {Text.From(_-1), "Student"&Text.From(_)}),
    AddedNumAndName = List.Transform(ToText,each {_{0},_{1}&"_Num",_{1}&"_Name"})
in
    AddedNumAndName

查询: 基本上为每个键组合添加一个索引(通过 Table.Group),添加一些具有模和整数除法计算的索引作为旋转的准备,num 和 name 组合在一个记录中,table是旋转的(使用高级选项 "Don't Aggregate"),嵌套记录(使用编号和名称)使用 List.Accumulate 和 ExpandList.

中的数据展开
let
    Source = Table1,
    #"Grouped Rows" = Table.Group(Source, {"Center", "Course", "Type"}, {{"AllData", each Table.AddIndexColumn(_,"Index",0,1)}}),
    #"Expanded AllData" = Table.ExpandTableColumn(#"Grouped Rows", "AllData", {"Student_Num", "Student_Name", "Index"}, {"Student_Num", "Student_Name", "Index"}),
    #"Duplicated Column" = Table.DuplicateColumn(#"Expanded AllData", "Index", "Index - Copy"),
    #"Calculated Modulo" = Table.TransformColumns(#"Duplicated Column", {{"Index", each Number.Mod(_, MaxStudentsPerRow), type number}}),
    #"Integer-Divided Column" = Table.TransformColumns(#"Calculated Modulo", {{"Index - Copy", each Number.IntegerDivide(_, MaxStudentsPerRow), Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Integer-Divided Column", "NumAndName", each Record.FromList({[Student_Num],[Student_Name]},{"Num","Name"})),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Student_Num", "Student_Name"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Columns",{{"Index", type text}}),
    #"Pivoted Column" = Table.Pivot(#"Changed Type", List.Distinct(#"Changed Type"[Index]), "Index", "NumAndName"),
    #"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Index - Copy"}),
    Expanded = List.Accumulate(ExpandList,#"Removed Columns1",(t,e) => Table.ExpandRecordColumn(t,e{0},{"Num","Name"},{e{1},e{2}}))
in
    Expanded