具有参数、列表和查询的解决方案。
它的性能相当好:
我在Excel中测试了100000条记录,大约花了15秒;
大约2:15分钟内录制了500000条记录。
参数MaxStudentsPerRow:
2 meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=true]
列表扩展列表
“0”,“Student1\u Num”,“Student1\u Name”
“1”,“Student2\u Num”,“Student2\u 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
查询:
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