Home » Transpose Departments into Row

Transpose Departments into Row

Transpose the data in a single row for all departments

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 72
Challenge Difficulty: ⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Transpose Departments into Row with Power Query

Power Query solution 1 for Transpose Departments into Row, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  CN = Table.ColumnNames(Source), 
  Combine = Table.Combine(
    Table.Group(
      Source, 
      "Dept", 
      {
        "T", 
        each Table.FromRows(
          {
            {[Dept]{0}}
              & Text.Split(
                Text.Combine(
                  Table.TransformRows(
                    _, 
                    each Record.Field(_, CN{1}) & ", " & Record.Field(_, CN{2})
                  ), 
                  ", "
                ), 
                ", "
              )
          }, 
          {"Dept"}
            & List.Combine(
              List.Transform(
                {1 .. Table.RowCount(_)}, 
                each 
                  let
                    n = Text.From(_)
                  in
                    Text.Split(Text.Replace(CN{1} & " & " & CN{2} & n, " &", n), " ")
              )
            )
        )
      }
    )[T]
  )
in
  Combine
Power Query solution 2 for Transpose Departments into Row, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  Sorting = List.Distinct(Source[Dept]), 
  GroupedDept = Table.ExpandListColumn(
    Table.ExpandListColumn(
      Table.Group(
        Source, 
        {"Dept"}, 
        {
          {
            "All", 
            each Table.AddColumn(
              Table.AddIndexColumn(_, "ID", 1), 
              "List", 
              each 
                let
                  r = {[Employee]} & Text.Split([#"Age & Nationality & Salary"], ", "), 
                  c = {"Employee", "Age", "Nationality", "Salary"}
                in
                  List.Accumulate(
                    List.Positions(r), 
                    {}, 
                    (s, d) => s & {{[Dept], c{d} & Text.From([ID]), r{d}}}
                  )
            )[List]
          }
        }
      ), 
      "All"
    ), 
    "All"
  ), 
  ExpandedTable = Table.FromRows(GroupedDept[All], {"Dept", "Attribute", "Value"}), 
  PivotedColumn = Table.Pivot(
    ExpandedTable, 
    List.Distinct(ExpandedTable[Attribute]), 
    "Attribute", 
    "Value"
  ), 
  SortedRows = Table.Sort(
    PivotedColumn, 
    (a, b) => Value.Compare(List.PositionOf(Sorting, a[Dept]), List.PositionOf(Sorting, b[Dept]))
  )
in
  SortedRows
Power Query solution 3 for Transpose Departments into Row, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  MyFun = (Table as table) as table =>
    let
      Remove = Table.RemoveColumns(Table, {"Dept"}), 
      WorkCols = Table.ColumnNames(Remove), 
      Fields = List.TransformMany(
        {1 .. Table.RowCount(Remove)}, 
        (y) => WorkCols, 
        (x, y) => y & "" & Text.From(x)
      ), 
      Values = List.Combine(Table.ToRows(Remove)), 
      Records = [Dept = Table.FirstValue(Table)] & Record.FromList(Values, Fields), 
      Final = Table.FromRecords({Records})
    in
      Final, 
  OldName = List.Last(Table.ColumnNames(Source)), 
  NewName = Text.Split(OldName, " & "), 
  Split = Table.SplitColumn(Source, OldName, Splitter.SplitTextByDelimiter(", "), NewName), 
  Group = Table.Group(Split, "Dept", {"All", MyFun}), 
  Return = Table.Combine(Group[All])
in
  Return
Power Query solution 4 for Transpose Departments into Row, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Split = Table.SplitColumn(
    Source, 
    "Age & Nationality & Salary", 
    Splitter.SplitTextByDelimiter(", ", QuoteStyle.Csv), 
    {"Age", "Nationality", "Salary"}
  ), 
  Group = Table.Group(
    Split, 
    {"Dept"}, 
    {
      {
        "Count", 
        each 
          let
            a = Table.ToRows(_), 
            b = List.Combine(List.Transform(a, List.Skip)), 
            c = Table.FromRows({b})
          in
            c
      }
    }
  ), 
  Col = List.Distinct(
    List.Combine(Table.AddColumn(Group, "Col", each Table.ColumnNames([Count]))[Col])
  ), 
  ColName = List.Skip(Table.ColumnNames(Split)), 
  Rep = List.Count(Col) / List.Count(ColName), 
  Headers = List.Combine(
    List.Transform({1 .. Rep}, (x) => List.Transform(ColName, each _ & Text.From(x)))
  ), 
  Sol = Table.FromColumns(
    {Group[Dept]} & Table.ToColumns(Table.Combine(Group[Count])), 
    {"Dept"} & Headers
  )
in
  Sol
Power Query solution 5 for Transpose Departments into Row, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  gp = Table.Group(
    Fonte, 
    {"Dept"}, 
    {
      {
        "Contagem", 
        each [
          a = Table.AddIndexColumn(_[[Employee], [#"Age & Nationality & Salary"]], "Ind", 1, 1), 
          c = Table.AddColumn(a, "Dados", each [Employee] & ", " & [#"Age & Nationality & Salary"])[
            [Dados], 
            [Ind]
          ], 
          d = Table.AddColumn(
            c, 
            "cab", 
            each Text.Combine(
              List.Transform(
                {"Employee", "Age", "Nationality", "Salary"}, 
                (x) => x & Text.From([Ind])
              ), 
              ", "
            )
          )[[cab], [Dados]]
        ][d]
      }
    }
  ), 
  exp = Table.ExpandTableColumn(gp, "Contagem", {"cab", "Dados"}), 
  div = Table.ExpandListColumn(
    Table.TransformColumns(
      exp, 
      {
        {
          "cab", 
          Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
          let
            itemType = (type nullable text) meta [Serialized.Text = true]
          in
            type {itemType}
        }
      }
    ), 
    "cab"
  ), 
  gp2 = Table.Group(
    div, 
    {"Dept", "Dados"}, 
    {{"Contagem", each Table.AddIndexColumn(_, "Ind", 0, 1)}}
  )[[Contagem]], 
  exp2 = Table.ExpandTableColumn(gp2, "Contagem", Table.ColumnNames(gp2[Contagem]{0})), 
  split = Table.AddColumn(
    exp2, 
    "Personalizar", 
    each Splitter.SplitTextByAnyDelimiter({", "}, QuoteStyle.Csv)([Dados]){[Ind]}
  )[[Dept], [cab], [Personalizar]], 
  sort = gp[Dept], 
  res = Table.Sort(
    Table.Pivot(split, List.Distinct(split[cab]), "cab", "Personalizar"), 
    each List.PositionOf(sort, [Dept])
  )
in
  res
Power Query solution 6 for Transpose Departments into Row, proposed by Eric Laforce:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table86"]}[Content], 
  Split_ANS = Table.SplitColumn(
    Source, 
    "Age & Nationality & Salary", 
    Splitter.SplitTextByDelimiter(",", QuoteStyle.None), 
    {"Age", "Nationality", "Salary"}
  ), 
  Group = Table.Group(
    Split_ANS, 
    {"Dept"}, 
    {
      {
        "Data", 
        each 
          let
            _List = List.Accumulate(
              Table.ToRows(Table.RemoveColumns(_, "Dept")), 
              {}, 
              (s, a) => s & a
            ), 
            _Combine = Text.Combine(List.Transform(_List, Text.From), ";")
          in
            _Combine
      }, 
      {"RowCount", each Table.RowCount(_)}
    }
  ), 
  NewColNames = List.Combine(
    List.Transform(
      {1 .. List.Max(Group[RowCount])}, 
      (a) => List.Transform({"Employee", "Age", "Nationality", "Salary"}, (b) => b & Text.From(a))
    )
  ), 
  SplitData = Table.SplitColumn(
    Table.RemoveColumns(Group, "RowCount"), 
    "Data", 
    Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), 
    NewColNames
  )
in
  SplitData
Power Query solution 7 for Transpose Departments into Row, proposed by Victor Wang:
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 Split = Table.SplitColumn(Source, "Age & Nationality & Salary", Splitter.SplitTextByDelimiter(", "), {"Age", "Nationality", "Salary"}),
 Cols = List.Skip(Table.ColumnNames(Split)),
 Group = Table.Group(Split, {"Dept"}, {{"all", each let t = Table.RemoveColumns(_, "Dept") in 
[ 
 rowCount = Text.From(Table.RowCount(t)),
 newCols = {"Dept"} & List.Combine(List.Transform({"1"..rowCount}, (a)=> List.Transform(Cols, (b)=> b & a ))),
 toRows = List.Combine(Table.ToRows(t))
]
[[toRows],[newCols]]
}}),
 getTables = Table.AddColumn(Group, "Custom", each hashtag#table([all][newCols], {{[Dept]} & [all][toRows]})),
 Combine = Table.Combine(getTables[Custom])
in
 Combine


                    
                  
          
Power Query solution 8 for Transpose Departments into Row, proposed by Dominic Walsh:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Dept"}, 
    {{"All", each Table.AddIndexColumn(_, "Index", 1, 1, Int64.Type)}}
  ), 
  Expand = Table.ExpandTableColumn(
    Group, 
    "All", 
    {"Employee", "Age & Nationality & Salary", "Index"}, 
    {"Employee", "Age & Nationality & Salary", "Index"}
  ), 
  Split = Table.SplitColumn(
    Expand, 
    "Age & Nationality & Salary", 
    Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
    {"Age", "Nationality", "Salary"}
  ), 
  Unpivot = Table.UnpivotOtherColumns(Split, {"Dept", "Index"}, "Attribute", "Value"), 
  Merge = Table.CombineColumns(
    Table.TransformColumnTypes(Unpivot, {{"Index", type text}}, "en-GB"), 
    {"Attribute", "Index"}, 
    Combiner.CombineTextByDelimiter("", QuoteStyle.None), 
    "Merged"
  ), 
  Pivot = Table.Pivot(Merge, List.Distinct(Merge[Merged]), "Merged", "Value")
in
  Pivot
Power Query solution 9 for Transpose Departments into Row, proposed by Felipe Perez Arevalo:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  #"Grouped Rows" = Table.Group(
    Source, 
    {"Dept"}, 
    {
      {
        "Detail", 
        each 
          let
            step1 = Table.CombineColumns(
              _, 
              {"Employee", "Age & Nationality & Salary"}, 
              Combiner.CombineTextByDelimiter(",", QuoteStyle.None), 
              "Merged"
            ), 
            step2 = Table.RemoveColumns(step1, {"Dept"}), 
            step3 = Table.Transpose(step2), 
            step4 = Table.CombineColumns(
              step3, 
              Table.ColumnNames(step3), 
              Combiner.CombineTextByDelimiter(",", QuoteStyle.None), 
              "Merged"
            )
          in
            step4[Merged]{0}, 
        type text
      }, 
      {"Count", each List.Count([Dept]), Int64.Type}
    }
  ), 
  maxCount = List.Max(#"Grouped Rows"[Count]), 
  Columnhearders = List.Combine(
    List.Generate(
      () => [n = 1], 
      each [n] < maxCount + 1, 
      each [n = [n] + 1], 
      each {
        "Employee" & Text.From([n]), 
        "Age" & Text.From([n]), 
        "Nationality" & Text.From([n]), 
        "Salary" & Text.From([n])
      }
    )
  ), 
  SplitColumn = Table.RemoveColumns(
    Table.SplitColumn(
      #"Grouped Rows", 
      "Detail", 
      Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
      Columnhearders
    ), 
    {"Count"}
  )
in
  SplitColumn

Solving the challenge of Transpose Departments into Row with Excel

Excel solution 1 for Transpose Departments into Row, proposed by Bo Rydobon 🇹🇭:
=LET(z,A2:C11,a,TAKE(z,,1),REDUCE(HSTACK(A1,TOROW(TEXTSPLIT(B1&" & "&C1," & ")&SEQUENCE(MAX(COUNTIF(a,a))))),UNIQUE(a),
LAMBDA(c,v,IFNA(VSTACK(c,HSTACK(v,TEXTSPLIT(ARRAYTOTEXT(DROP(FILTER(z,a=v),,1)),", "))),""))))
Excel solution 2 for Transpose Departments into Row, proposed by Rick Rothstein:
=LET(j," & ",a,A2:A10,u,UNIQUE(a),s,SEQUENCE(MAX(COUNTIF(a,u))),t,TEXTSPLIT(TEXTJOIN("/",,MAP(u,LAMBDA(x,TEXTJOIN(",",,FILTER(B2:B10&", "&C2:C10,a=x))))),",","/"),VSTACK(HSTACK(A1,TEXTSPLIT(TEXTJOIN(j,,SUBSTITUTE(B1&j&C1,j,s&j)&s),j)),HSTACK(u,IFNA(IFERROR(0+t,t),""))))
Excel solution 3 for Transpose Departments into Row, proposed by محمد حلمي:
=LET(
r,A2:A11,
VSTACK(HSTACK(A1,
TOROW(TEXTSPLIT(B1& " & " &C1," & ")&
SEQUENCE(MAX(COUNTIF(r,r))))),
IFNA(DROP(REDUCE(0,UNIQUE(r),LAMBDA(a,d,LET(
f,FILTER(B2:C11,r=d),
VSTACK(a,
HSTACK(d,TEXTSPLIT(CONCAT(TAKE(f,,1)&", "&
DROP(f,,1)&", "),", ",,1)))))),1),"")))
Excel solution 4 for Transpose Departments into Row, proposed by Oscar Mendez Roca Farell:
=IFNA(LET(_u, UNIQUE(A2:A11), HSTACK( VSTACK("Dept",_u), REDUCE(TOROW(TEXTSPLIT(B1&" & "&C1, " & ") & SEQUENCE(COUNTA(_u))), _u, LAMBDA(i, x, VSTACK(i, LET(_m, FILTRAR(B2:C11, A2:A11=x), TEXTSPLIT(ARRAYTOTEXT(_m), ","))))))), "")
Excel solution 5 for Transpose Departments into Row, proposed by Duy Tùng:
=LET(a,A2:A11,REDUCE(HSTACK(A1,TOROW(TRIM(TEXTSPLIT(B1&"&"&C1,"&"))&SEQUENCE(MAX(COUNTIF(a,a))))),UNIQUE(a),LAMBDA(x,y,IFNA(VSTACK(x,HSTACK(y,TEXTSPLIT(TEXTJOIN(", ",,FILTER(B2:C11,A2:A11=y)),", "))),""))))
Excel solution 6 for Transpose Departments into Row, proposed by Sunny Baggu:
=LET(_tbl,HSTACK(A2:B11,DROP(REDUCE("",C2:C11,LAMBDA(x,y,VSTACK(x,TEXTSPLIT(y,", ")))),1)),_dept,TAKE(_tbl,,1),_udept,UNIQUE(_dept),
IFNA(DROP(REDUCE("",_udept,LAMBDA(a,v,VSTACK(a,HSTACK(v,TOROW(FILTER(DROP(_tbl,,1),_dept=v)))))),1),""))
Excel solution 7 for Transpose Departments into Row, proposed by LEONARD OCHEA 🇷🇴:
=LET(d,A2:A11,e,B2:B11,f,C2:C11,u,UNIQUE(d),s,SEQUENCE(MAX(COUNTIF(d,d))),he,HSTACK("Dept",TOROW(HSTACK("Employee","Age","Nationality","Salary")&s)),ans,HSTACK(e,DROP(REDUCE("",f,LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,", ")))),1)),mf,DROP(REDUCE("",u,LAMBDA(x,y,VSTACK(x,TOROW(FILTER(ans,d=y))))),1),VSTACK(he,HSTACK(u,IFERROR(mf,""))))
Excel solution 8 for Transpose Departments into Row, proposed by Julien Lacaze:
=LET(_h1,A1,_h2,HSTACK(B1,TEXTSPLIT(C1," & ")),
_dept,UNIQUE(A2:A11),_cols,MAX(COUNTIFS(A2:A11,_dept)),
_header,HSTACK(_h1,TOROW(_h2&SEQUENCE(_cols))),_datasX,TEXTSPLIT(TEXTJOIN("|",1,C2:C11),", ","|",,,""),
_datas,HSTACK(A2:A11,B2:B11,_datasX),
_resdatas,MAKEARRAY(ROWS(UNIQUE(A2:A11)),COLUMNS(_header),LAMBDA(r,c,IFERROR(IF(c=1,CHOOSEROWS(_dept,r),CHOOSECOLS(TOROW(FILTER(CHOOSECOLS(_datas,SEQUENCE(1,4,2)),CHOOSECOLS(_datas,1)=CHOOSEROWS(_dept,r))),c-1)),""))),
VSTACK(_header,_resdatas)
)

&&&

Leave a Reply