2017-02-07 7 views
0

테이블의 여러 열을 다른 테이블의 열에 병합하려고합니다. primary 테이블의 각 열은 텍스트를 포함하고 PrimaryAnalysis 테이블은 텍스트의 인덱스를 포함합니다. 나는 기본 테이블에 대한 인덱스의 열을 만들 싶습니다 그러나 나는 이렇게 각 테이블에 대해 한 번에 하나를 할 필요 해요 :전력 쿼리 루프 계산

#"Merged Queries" = Table.NestedJoin(#"Changed Type2",{"Text.1"},PrimaryAnalysis,{"Letter"},"NewColumn"), 
#"Expanded NewColumn" = Table.ExpandTableColumn(#"Merged Queries", "NewColumn", {"Index"}, {"Index"}), 
#"Renamed Columns2" = Table.RenameColumns(#"Expanded NewColumn",{{"Index", "First"}}), 
#"Merged Queries1" = Table.NestedJoin(#"Renamed Columns2",{"Text.2"},PrimaryAnalysis,{"Letter"},"NewColumn"), 
#"Expanded NewColumn1" = Table.ExpandTableColumn(#"Merged Queries1", "NewColumn", {"Index"}, {"Index"}), 
#"Renamed Columns3" = Table.RenameColumns(#"Expanded NewColumn1",{{"Index", "2nd"}}), 
#"Merged Queries2" = Table.NestedJoin(#"Renamed Columns3",{"Text.3"},PrimaryAnalysis,{"Letter"},"NewColumn"), 
#"Expanded NewColumn2" = Table.ExpandTableColumn(#"Merged Queries2", "NewColumn", {"Index"}, {"Index"}), 
#"Renamed Columns4" = Table.RenameColumns(#"Expanded NewColumn2",{{"Index", "3rd"}}), 

가 지금은 23 열의 그렇게해야합니다. DO를 구현하는 방법이 있습니까?이 작업을 수행하기 위해 Power Query에서 반복 또는 다른 루프가 있습니까?

미리 감사드립니다.

+0

일부 샘플 테이블과 쿼리 본문 pls를 제공 할 수 있습니까? 나는 처음부터 그것을 발명하고자하는 의욕이 없습니다. 짧은 답변입니다 - List.Generate를 사용하십시오 –

답변

0

전원 쿼리를 반복하는 한 가지 방법은 재귀 함수를 사용하는 것입니다. 아래 코드에서 기본 테이블과 비슷한 테이블을 가진 Excel 파일을 읽었습니다. (아래의 # "Changeed Type2"단계는 # "Changed Type2"와 유사해야합니다.)

다음으로 인덱스가있는 열 1 개가 각 반복에 추가되는 AddIndices 함수가 정의됩니다. 23 회 반복 한 후에 함수가 멈추고, 그렇지 않으면 스스로를 호출합니다.

이러한 재귀 함수의 중요한 점은 Table.Buffer (단계 "확장"참조)를 포함해야한다는 점입니다. 그렇지 않으면 각 반복마다 코드에서 이전의 모든 반복을 다시 평가하고 멈추게됩니다. Table.Buffer가이를 막습니다.

쿼리의 마지막 단계에서 함수가 호출됩니다.

let 
    Source = Excel.Workbook(File.Contents("C:\Users\Marcel\Documents\Forum bijdragen\StackOverflow Power Query\Loop Computation in Power Query.xlsx"), null, true), 
    Tabel1_Table = Source{[Item="Tabel1",Kind="Table"]}[Data], 
    #"Changed Type2" = Table.TransformColumnTypes(Tabel1_Table,{{"Text.1", type text}, {"Text.2", type text}, {"Text.3", type text}, {"Text.4", type text}, {"Text.5", type text}, {"Text.6", type text}, {"Text.7", type text}, {"Text.8", type text}, {"Text.9", type text}, {"Text.10", type text}, {"Text.11", type text}, {"Text.12", type text}, {"Text.13", type text}, {"Text.14", type text}, {"Text.15", type text}, {"Text.16", type text}, {"Text.17", type text}, {"Text.18", type text}, {"Text.19", type text}, {"Text.20", type text}, {"Text.21", type text}, {"Text.22", type text}, {"Text.23", type text}}), 

// Recursive function: 
    AddIndices = (TableSoFar as table, optional Iteration as number) as table => 
    let 
     CurrentIteration = if Iteration = null then 1 else Iteration, 
     CurrentColumn = "Text."&Text.From(CurrentIteration), 
     NewIndexColumn = "Index."&Text.From(CurrentIteration), 
     MergedTable = Table.NestedJoin(TableSoFar,{CurrentColumn},PrimaryAnalysis,{"Letter"},"NewColumn"), 
     Expanded = Table.Buffer(Table.ExpandTableColumn(MergedTable, "NewColumn", {"Index"}, {NewIndexColumn})), 
     Result = if CurrentIteration = 23 then Expanded else @AddIndices(Expanded, CurrentIteration + 1) 
    in 
     Result, 

// Call recursive function: 
    AddedIndices = AddIndices(#"Changed Type2") 
in 
    AddedIndices 
+0

이 솔루션은 스택 오버플로가 발생할 수 있습니다. tail-end 재귀 (https://en.wikipedia.org/wiki/Tail_call)를 사용하기 때문에 List.Generate를 사용하는 것이 좋습니다. –