Home » Generate Output Table from Data

Generate Output Table from Data

Generate result table from problem table

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

Solving the challenge of Generate Output Table from Data with Power Query

Power Query solution 1 for Generate Output Table from Data, proposed by Bo Rydobon 🇹🇭:
let
  Source = Table.ToRows(Excel.CurrentWorkbook(){[Name = "Table1"]}[Content]), 
  Ans = Table.FromRows(
    List.Combine(
      List.Transform(
        List.Skip(Source), 
        each List.Transform(
          List.Split(List.Skip(_), 4), 
          (r) => {_{0}} & r & {List.Sum(List.Skip(r, 2))}
        )
      )
    ), 
    List.Distinct(Source{0}) & {"Total"}
  )
in
  Ans
Power Query solution 2 for Generate Output Table from Data, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  S = Table.FromRows(
    List.Combine(
      List.Transform(
        Table.ToRows(Source), 
        each List.Transform(
          List.Split(List.Skip(_), 4), 
          (t) => {_{0}} & t & {List.Sum(List.LastN(t, 2))}
        )
      )
    ), 
    List.FirstN(Table.ColumnNames(Source), 5) & {"Total"}
  )
in
  S
Power Query solution 3 for Generate Output Table from Data, proposed by Kris Jaganah:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Unpivot = Table.UnpivotOtherColumns(Source, {"Group"}, "Attribute", "Value"), 
  AttTrans = Table.TransformColumns(
    Unpivot, 
    {
      "Attribute", 
      each 
        if Text.StartsWith(_, "P") then
          "Period"
        else if Text.StartsWith(_, "M") then
          Text.Start(_, 6)
        else
          "Score"
    }
  ), 
  Count = Table.TransformColumns(
    Table.AddIndexColumn(AttTrans, "Index", 1, 1 / 4, Int64.Type), 
    {"Index", each Number.RoundDown(_)}
  ), 
  Pivot = Table.Pivot(Count, List.Distinct(Count[Attribute]), "Attribute", "Value"), 
  Total = Table.RemoveColumns(Table.AddColumn(Pivot, "Total", each [Marks1] + [Marks2]), {"Index"})
in
  Total
Power Query solution 4 for Generate Output Table from Data, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Unpivot = Table.UnpivotOtherColumns(Source, {"Group"}, "Att", "Val"), 
  Att = Table.TransformColumns(
    Unpivot, 
    {
      "Att", 
      each 
        if Text.StartsWith(_, "M") then
          Text.Start(_, 6)
        else if Text.StartsWith(_, "S") then
          "Score"
        else
          "Period"
    }
  ), 
  Integer = Table.TransformColumns(
    Table.AddIndexColumn(Att, "Idx", 0), 
    {{"Idx", each Number.IntegerDivide(_, 4)}}
  ), 
  Pivot = Table.RemoveColumns(
    Table.Pivot(Integer, List.Distinct(Integer[Att]), "Att", "Val"), 
    "Idx"
  ), 
  Sol = Table.AddColumn(Pivot, "Total", each [Marks1] + [Marks2])
in
  Sol
Power Query solution 5 for Generate Output Table from Data, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  add = Table.AddColumn(
    Fonte, 
    "Tab", 
    each Table.FromRows(
      List.Transform(
        List.Split(List.RemoveFirstN(Record.FieldValues(_), 1), 4), 
        (x) => x & {List.Sum(List.LastN(x, 2))}
      ), 
      List.LastN(List.FirstN(Table.ColumnNames(Fonte), 5), 4) & {"Total"}
    )
  )[[Group], [Tab]], 
  res = Table.ExpandTableColumn(add, "Tab", Table.ColumnNames(add[Tab]{0}))
in
  res
Power Query solution 6 for Generate Output Table from Data, proposed by Eric Laforce:
let
  Source = Excel.CurrentWorkbook(){[Name = "tData113"]}[Content], 
  Transform = Table.TransformRows(
    Source, 
    each 
      let
        _L = Record.ToList(_), 
        _R = List.Accumulate(
          List.Split(List.Skip(_L), 4), 
          {}, 
          (s, c) => s & {{_L{0}} & c & {List.Sum(List.LastN(c, 2))}}
        )
      in
        _R
  ), 
  ToTable = Table.FromRows(
    List.Combine(Transform), 
    List.FirstN(Table.ColumnNames(Source), 5) & {"Total"}
  )
in
  ToTable
Power Query solution 7 for Generate Output Table from Data, proposed by Sandeep Marwal:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table4"]}[Content], 
  S1 = Table.UnpivotOtherColumns(Source, {"Group"}, "Attribute", "Value"), 
  S2 = Table.AddIndexColumn(S1, "Index", 1, 1, Int64.Type), 
  S3 = Table.AddColumn(S2, "Custom", each Number.Mod([Index], 4)), 
  S4 = Table.AddColumn(
    S3, 
    "Custom.1", 
    each 
      if [Custom] = 1 then
        "Period"
      else if [Custom] = 2 then
        "Score"
      else if [Custom] = 3 then
        "Marks1"
      else if [Custom] = 0 then
        "Marks2"
      else
        null
  ), 
  S5 = Table.RemoveColumns(S4, {"Attribute", "Index", "Custom"}), 
  S6 = Table.Group(
    S5, 
    {"Custom.1"}, 
    {{"Count", each _}}, 
    GroupKind.Local, 
    (c, n) => if n[Custom.1] = "Period" then 1 else 0
  )[Count], 
  S7 = List.Transform(S6, each Table.Pivot(_, List.Distinct(_[Custom.1]), "Custom.1", "Value")), 
  S8 = Table.Combine(S7), 
  S9 = Table.AddColumn(S8, "Total", each [Marks1] + [Marks2], type number)
in
  S9
Power Query solution 8 for Generate Output Table from Data, proposed by Szabolcs Phraner:
let
 Source = Excel.CurrentWorkbook(){[Name="Problem"]}[Content],
 DemoteHeaders = Table.DemoteHeaders(Source),
 Transpose = Table.Transpose(DemoteHeaders),

 RemoveNr = Table.TransformColumns(Transpose,{{"Column1", each Text.Remove(_,{"1".."9"}), type text}}),

 Groups = Table.First( RemoveNr),

 Skip = Table.Skip(RemoveNr,1),

 Index = Table.AddIndexColumn(Skip, "Index", 1, 1, Int64.Type),


 GroupID = Table.AddColumn(Index, "GroupID", each if [Column1] = "Period" then [Index] else null),
 FillDown = Table.FillDown(GroupID,{"GroupID"}),

 GroupTransformations = Table.Group(FillDown, {"GroupID"}, {{"GroupedTables", 
each let

RemoveCols = Table.RemoveColumns(_,{"Index","GroupID"}),

AddGroup = Table.InsertRows(RemoveCols,0,{Groups} ),

Pivot = Table.PromoteHeaders( Table.Transpose(AddGroup) ),

in Table.AddColumn(Pivot,"Total", each [Marks] + [Marks_1])
}}),

 Combine= Table.Combine(GroupTransformations[GroupedTables]),
 RenameMarks = Table.RenameColumns(Combine,{{"Marks", "Marks1"}, {"Marks_1", "Marks2"}}),
 Reorder = Table.Sort(RenameMarks,{{"Group", Order.Ascending}
 RemoveIndex = Table.RemoveColumns(Reorder,{"Index"})
in
 RemoveIndex


                    
                  
          

Solving the challenge of Generate Output Table from Data with Excel

Excel solution 1 for Generate Output Table from Data, proposed by Bo Rydobon 🇹🇭:
=LET(d,WRAPROWS(TOCOL(B2:M4),4),VSTACK(HSTACK(A1:E1,"Total"),HSTACK(TOCOL(IF(SEQUENCE(,3),A2:A4)),d,MMULT(d,{0;0;1;1}))))
Excel solution 2 for Generate Output Table from Data, proposed by محمد حلمي:
=LET(
i,A1:M1,
b,B2:M4,
n,RIGHT(TAKE(i,,-1))+2,
x,COLUMNS(b)/n,
V,WRAPROWS(TOROW(b),n),
IFNA(VSTACK(TAKE(i,,n+1),HSTACK(TOCOL(IFNA(
A2:A4,SEQUENCE(,x))),V,
MMULT(DROP(V,,2),SEQUENCE(n-2)^0))),"Total"))
Excel solution 3 for Generate Output Table from Data, proposed by محمد حلمي:
=LET(V,WRAPROWS(TOROW(B2:M4),4),IFNA(VSTACK(A1:E1,HSTACK(TOCOL(IFNA(A2:A4,SEQUENCE(,3))),V,DROP(V,,3)+INDEX(V,,3))),"Total"))
Excel solution 4 for Generate Output Table from Data, proposed by محمد حلمي:
=LET(V,WRAPROWS(TOROW(B2:M4),4),IFNA(VSTACK(A1:E1,HSTACK(TOCOL(IFNA(A2:A4,SEQUENCE(,3))),V,MMULT(DROP(V,,2),{1;1}))),"Total"))
Excel solution 5 for Generate Output Table from Data, proposed by محمد حلمي:
=LET(V,WRAPROWS(TOROW(B2:M4),4),HSTACK(TOCOL(IFNA(A2:A4,SEQUENCE(,3))),V,MMULT(DROP(V,,2),{1;1})))
Excel solution 6 for Generate Output Table from Data, proposed by Oscar Mendez Roca Farell:
=LET(_g, A2:A4, _f,ROW(_g), _c,COLUMNS(B2:M4), _m, WRAPROWS(TOCOL(B2:M4), _c/COUNT(_f)), _s,MMULT(TAKE(_m, ,-2), {1; 1}), _r, TOCOL(REPT(_g, TOROW(_f)^0)), VSTACK(HSTACK(A1:E1, "Total"), HSTACK(_r,_m,_s)))
Excel solution 7 for Generate Output Table from Data, proposed by Duy Tùng:
=LET(a,REDUCE(A1:E1,UNIQUE(A2:A4),LAMBDA(x,y,VSTACK(x,IFNA(HSTACK(y,WRAPROWS(TOCOL(FILTER(B2:M4,A2:A4=y)),4)),y)))),b,BYROW(TAKE(a,,-2),SUM),HSTACK(a,IF(b,b,"Total")))
Excel solution 8 for Generate Output Table from Data, proposed by Sunny Baggu:
=LET(
 _a, TOCOL(IF(SEQUENCE(, 3), A2:A4)),
 _b, WRAPROWS(TOCOL(B2:M4), 4),
 _c, BYROW(TAKE(_b, , -2), LAMBDA(x, SUM(x))),
 HSTACK(_a, _b, _c)
)
Excel solution 9 for Generate Output Table from Data, proposed by Asheesh Pahwa:
=LET(a,DROP(REDUCE("",
SEQUENCE(ROWS(B2:M4)), LAMBDA(a,v,VSTACK(a,
TRANSPOSE(WRAPCOLS(INDEX(B2:M4,v,),4))))),1),
b,TOCOL(IF(SEQUENCE(,3),A2:A4)),
HSTACK(b,a,BYROW(TAKE(a,,-2), LAMBDA(x,SUM(x)))))
Excel solution 10 for Generate Output Table from Data, proposed by Peter Bartholomew:
= Repivotλ(periodData, group)

= LET(
 SUMλ, LAMBDA(x, SUM(x)),
 repivotted, WRAPROWS(TOCOL(periodData), 4),
 groupHeader, TOCOL(IF({1,1,1}, group)),
 total, BYROW(TAKE(repivotted,, -2), SUMλ),
 HSTACK(groupHeader, repivotted, total)
 )
Excel solution 11 for Generate Output Table from Data, proposed by Ziad A.:
={A1:E1,"Total";SORT(REDUCE(TOCOL(,1),SEQUENCE(COUNTIF(1:1,"P*"),1,2,4),LAMBDA(a,i,LET(x,CHOOSECOLS(A2:4,1,SEQUENCE(4,1,i)),VSTACK(a,{x,MMULT(CHOOSECOLS(x,4,5),{1;1})})))),1,1)
Excel solution 12 for Generate Output Table from Data, proposed by Daniel Garzia:
=LET(d,WRAPROWS(TOCOL(B3:M5),4),VSTACK(HSTACK(A2:E2,"Total"),HSTACK(INDEX(A3:A5,SEQUENCE(9,,,1/3)),d,INDEX(d,,3)+INDEX(d,,4))))
Excel solution 13 for Generate Output Table from Data, proposed by samir tobeil:
=LET(s,A2:A4,t,DROP(REDUCE("",s,LAMBDA(a,x,VSTACK(a,LET(d,
WRAPROWS(OFFSET(x,,1,1,12),4),IFNA(HSTACK(x,d),x))))),1),
VSTACK(HSTACK(A1:E1,"Total"),HSTACK(t,BYROW(t,LAMBDA(y,SUM(TAKE(y,,-2)))))))
Excel solution 14 for Generate Output Table from Data, proposed by Kamran Mumtaz 🇵🇰:
=LET(a,TOCOL(IF(SEQUENCE(,3),A2:A4)),b,WRAPROWS(TOCOL(B2:M4),4),c,BYROW(CHOOSECOLS(b,{-1,-2}),LAMBDA(a,SUM(a))),HSTACK(a,b,c))
Excel solution 15 for Generate Output Table from Data, proposed by Kamran Mumtaz 🇵🇰:
I just noticed that instead of
"BYROW(CHOOSECOLS(b,{-1,-2})"
I could have used
BYROW(TAKE(b,,-2)
                    
                  

Solving the challenge of Generate Output Table from Data with Python in Excel

Python in Excel solution 1 for Generate Output Table from Data, proposed by Bo Rydobon 🇹🇭:
df =xl("A1:M4", headers=True)
up =pd.DataFrame([np.hstack((r[:1],r[i:i+4],sum(r[i+2:i+4]))) for r in df.values for i in range(1,len(r),4)])
up.columns =list(df.columns[:5])+['Total']
up
                    
                  
Python in Excel solution 2 for Generate Output Table from Data, proposed by Diarmuid Early:
np.vstack([["Group","Period","Score","Marks1","Marks2","Total"],[[a[0], a[4*i+1], a[4*i+2], a[4*i+3], a[4*i+4], a[4*i+3]+a[4*i+4]] for a in xl("A1:M4", headers=True).values for i in range((len(a)-1)//4)]])
I'm saving all my Python solutions to these challenges here if anyone wants to explore:
bit.ly/PythonLearningFolder
                    
                  

&&&

Leave a Reply