2017-08-12 11 views
0

生徒番号と名前を行の複数の列に転置/ピボットする必要がありますが、15列に制限されているため、15を超えると新しい行を開始する必要があります。それぞれのセンター、サブジェクト、タイプに対応してください。新しいシートに移すか、余分な行を取り除きたい。私は、両方の列を新しい列に繰り返しSTEPすることはできませんでした。 50万行の領域にあります。私は立ち往生してください!例えば複数の列に転記n

転換
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   

はこれが重複していないことを願うが、私は私の おかげ

答えて

1
を正しい結果を与えることができる何かを見つけることができないんだけど

パラメータ、リスト、およびクエリを含むソリューション。

それは非常によく実行します。

私が100,000レコードをExcelでテストされ、それは約15秒かかりました。

約2分15秒で500,000レコード。

1行あたりの生徒数は動的です。

パラメータMaxStudentsPerRow:

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

一覧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と名前の準備が組み合わされるように、モジュロ整数除算演算といくつかの指標が追加されレコードは、テーブルがピボットされ(高度なオプション「集計しない」)、List.AccumulateとExpandListのデータを使用して、ネストされたレコード(numとname)が展開されます。

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 
+0

ブリリアント!マルセルあなたは天才です、超高速の結果。 1分20秒で854レコードを3414行に処理しました。ありがとう。 –

関連する問題