Search code examples
excelpowerqueryunpivot

Unpivot columns in groups of three columns in PowerQuery


How can I accomplish this using PowerQuery? Data in on a worksheet.

Source table:

Col1 Col2 Att1 Att2 Att3 Att4 Att5 Att6
AAA DDD X O alpha delta 100 400
BBB EEE Y P beta vega 200 500

Desired table:

Col1 Col2 CustomName1 CustomName3 CustomName3
AAA DDD X alpha 100
AAA DDD O delta 400
BBB EEE Y beta 200
BBB EEE P vega 500

Solution

  • Agnostic to column names and number of columns, pulling alternate columns

    let Source =Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Leading = 2, Base=List.FirstN(Table.ColumnNames(Source),Leading),
    Part1= Table.RemoveFirstN(Table.DemoteHeaders(Table.SelectColumns(Source,Base&List.Alternate(List.Difference(Table.ColumnNames(Source),Base),1,1))),1),
    Part2= Table.RemoveFirstN(Table.DemoteHeaders(Table.SelectColumns(Source,Base&List.Alternate(List.RemoveFirstN(Table.ColumnNames(Source),Leading),1,1,1))),1)
    in Part1 & Part2
    

    If you need to, first add an leading index column, and change Leading=3, resort at end

    EDIT to provide a final rename

    let Source =Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Leading = 2, Base=List.FirstN(Table.ColumnNames(Source),Leading),
    Part1= Table.RemoveFirstN(Table.DemoteHeaders(Table.SelectColumns(Source,Base&List.Alternate(List.Difference(Table.ColumnNames(Source),Base),1,1))),1),
    Part2= Table.RemoveFirstN(Table.DemoteHeaders(Table.SelectColumns(Source,Base&List.Alternate(List.RemoveFirstN(Table.ColumnNames(Source),Leading),1,1,1))),1),
    NewNames= List.FirstN(Table.ColumnNames(Source),Leading)&List.Transform({1 .. List.Count(List.RemoveFirstN(Table.ColumnNames(Part1),Leading))}, each "Custom Name"&Text.From(_)),
    #"Rename"=Table.RenameColumns( Part1 & Part2,List.Zip({Table.ColumnNames(Part1),NewNames}))
    in #"Rename"