This time problem statement is short. You need to transform input table into result table.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 55
Challenge Difficulty: ⭐️⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Transform Input to Output with Power Query
Power Query solution 1 for Transform Input to Output, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
HD = Table.Group(
Source,
"Data1",
{"A", each _},
0,
(b, e) => Number.From(Text.Start(e, 1) <> "G")
),
Combine = Table.Combine(
List.Combine(
Table.Group(
HD,
"Data1",
{
"B",
each List.Transform(
List.Skip([A]),
(t) => Table.PromoteHeaders(Table.Transpose([A]{0} & t))
)
},
0,
(b, e) => Number.From(e = "Hall")
)[B]
)
)
in
Combine
Power Query solution 2 for Transform Input to Output, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "InputTable"]}[Content],
AddedIndex = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
AddedRow = Table.AddColumn(
AddedIndex,
"Row",
each if [Data1] = "Date" then [Index] else if [Data1] = "Hall" then "X" else null
),
FilledDownRow = Table.FillDown(AddedRow, {"Row"}),
ReplacedValue = Table.ReplaceValue(FilledDownRow, "X", null, Replacer.ReplaceValue, {"Row"}),
FilledUpRow = Table.FillUp(ReplacedValue, {"Row"}),
RemovedIndex = Table.RemoveColumns(FilledUpRow, {"Index"}),
PivotedData1 = Table.Pivot(RemovedIndex, List.Distinct(RemovedIndex[Data1]), "Data1", "Data2"),
FilledDownHall = Table.FillDown(PivotedData1, {"Hall"}),
RemovedRow = Table.RemoveColumns(FilledDownHall, {"Row"}),
FormatDate = Table.TransformColumnTypes(RemovedRow, {{"Date", type date}})
in
FormatDate
Power Query solution 3 for Transform Input to Output, proposed by Aditya Kumar Darak 🇮🇳:
let
Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content],
Hall = Table.AddColumn(Source, "Hall", each if [Data1] = "Hall" then [Data2] else null),
Date = Table.AddColumn(Hall, "Date", each if [Data1] = "Date" then [Data2] else null),
Filled = Table.FillDown(Date, {"Hall", "Date"}),
Filtered = Table.SelectRows(Filled, each [Data2] <> [Hall] and [Data2] <> [Date]),
Group = Table.Group(Filtered, {"Hall", "Date"}, {"Group", each Record.FromList([Data2], [Data1])}),
Header = Record.FieldNames(List.Max(Group[Group], null, Record.FieldCount)),
Return = Table.ExpandRecordColumn(Group, "Group", Header)
in
Return
Power Query solution 4 for Transform Input to Output, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Added1 = Table.AddColumn(
Source,
"Hall",
each if Text.Contains([Data1], "Hall") then [Data2] else null
),
Added2 = Table.AddColumn(
Added1,
"Date",
each if Value.Type([Data2]) = type datetime then Date.From([Data2]) else null
),
FD = Table.FillDown(Added2, {"Date", "Hall"}),
Filter = Table.SelectRows(FD, each ([Data1] <> "Date" and [Data1] <> "Hall")),
Sol = Table.Pivot(Filter, List.Distinct(Filter[Data1]), "Data1", "Data2")
in
Sol
Power Query solution 5 for Transform Input to Output, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
ind = Table.AddIndexColumn(Fonte, "Índice", 0, 1, Int64.Type),
col = Table.Pivot(ind, List.Distinct(ind[Data1]), "Data1", "Data2"),
pb = Table.FillDown(col, {"Hall", "Date"}),
gp = Table.Group(
pb,
{"Hall", "Date"},
{
{
"Contagem",
each [
a = Table.SelectColumns(
_,
List.Select(Table.ColumnNames(pb), each Text.Start(_, 5) = "Guest")
),
b = List.RemoveNulls(List.Combine(Table.ToColumns(a))),
c = Text.Combine(List.Transform(b, Text.From), "|"),
d = Table.ColumnCount(a)
][c]
}
}
),
filt = Table.SelectRows(gp, each ([Contagem] <> "")),
n_col = Table.ColumnNames(
Table.SelectColumns(pb, List.Select(Table.ColumnNames(pb), each Text.Start(_, 5) = "Guest"))
),
res = Table.SplitColumn(
filt,
"Contagem",
Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv),
n_col
)
in
res
Power Query solution 6 for Transform Input to Output, proposed by Bhavya Gupta:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
G_1 = Table.Group(
Source,
{"Data1"},
{{"All", each Record.FromList([Data2], [Data1])}},
0,
(x, y) => Number.From(y[Data1] = "Date" or y[Data1] = "Hall")
),
G_2 = List.Combine(
Table.Group(
G_1,
{"Data1"},
{{"All", each List.Transform(List.Skip([All]), (f) => [All]{0} & f)}},
0,
(a, b) => Number.From(b[Data1] = "Hall")
)[All]
),
Final = Table.FromRecords(G_2, Record.FieldNames(Record.Combine(G_2)), MissingField.UseNull)
in
Final
Power Query solution 7 for Transform Input to Output, proposed by Eric Laforce:
let
Source = Excel.CurrentWorkbook(){[Name = "tData55"]}[Content],
Add_Hall = Table.AddColumn(Source, "Hall", each if ([Data1] = "Hall") then [Data2] else null),
Add_Date = Table.AddColumn(Add_Hall, "Date", each if ([Data1] = "Date") then [Data2] else null),
FillDown = Table.FillDown(Add_Date, {"Hall", "Date"}),
Filter = Table.SelectRows(FillDown, each ([Data1] <> "Date" and [Data1] <> "Hall")),
AllGuests = List.Distinct(Filter[Data1]),
Group = Table.Group(
Filter,
{"Hall", "Date"},
{{"Data", each Table.Pivot(_[[Data1], [Data2]], List.Distinct(_[Data1]), "Data1", "Data2")}}
),
Expand = Table.ExpandTableColumn(Group, "Data", AllGuests, AllGuests)
in
Expand
Power Query solution 8 for Transform Input to Output, proposed by Sandeep Marwal:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Grouped Rows" = Table.Group(
Source,
{"Data1"},
{
{
"Count",
each [
#"Grouped Rows1" = Table.Group(
_,
{"Data1"},
{{"Count", each Table.PromoteHeaders(Table.Transpose(_))}},
0,
(c, n) => Number.From(n[Data1] = "Date")
),
Custom1 = Table.Combine(#"Grouped Rows1"[Count]),
#"Filled Down" = Table.FillDown(Custom1, {"Hall"}),
#"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([Date] <> null))
][#"Filtered Rows"]
}
},
0,
(c, n) => Number.From(n[Data1] = "Hall")
)[[Count]],
#"Expanded Count" = Table.ExpandTableColumn(
#"Grouped Rows",
"Count",
{"Hall", "Date", "Guest1", "Guest2", "Guest3", "Guest4"}
),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Count", {{"Date", type date}})
in
#"Changed Type"
Power Query solution 9 for Transform Input to Output, proposed by Sue Bayes:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Index = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
Set = Table.FillDown(
Table.AddColumn(Index, "Set", each if [Data1] = "Hall" then [Data2] else null),
{"Set"}
),
GrpLogic = Table.FillDown(
Table.AddColumn(
Set,
"Set2",
each if [Data1] = "Hall" then [Index] + 1 else if [Data1] = "Date" then [Index] else null
),
{"Set2"}
),
Grp = Table.Group(
GrpLogic,
{"Set", "Set2"},
{{"All", each _, type table [Data1 = text, Data2 = any]}}
),
AddCols = Table.AddColumn(
Grp,
"Answer",
each
let
Select = Table.SelectColumns([All], {"Data1", "Data2", "Set"}),
Pivot = Table.Pivot(Select, List.Distinct(Select[Data1]), "Data1", "Data2")
in
Pivot
)[Answer],
ToTable = Table.FromList(AddCols, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
Expand = Table.ExpandTableColumn(
ToTable,
"Column1",
{"Set", "Date", "Guest1", "Guest2", "Guest3", "Guest4"},
{"Hall", "Date", "Guest1", "Guest2", "Guest3", "Guest4"}
),
Type = Table.TransformColumnTypes(Expand, {{"Date", type date}})
in
Type
Solving the challenge of Transform Input to Output with Excel
Excel solution 1 for Transform Input to Output, proposed by Bo Rydobon 🇹🇭:
=LET(a,A2:A16,b,B2:B16,REDUCE(TOROW(UNIQUE(a)),FILTER(SEQUENCE(ROWS(b)),N(+b)),LAMBDA(c,n,
IFNA(VSTACK(c,HSTACK(XLOOKUP("Hall",TAKE(a,n),TAKE(b,n),,,-1),
TOROW(TAKE(DROP(b,n-1),IFNA(XMATCH(0,N(LEFT(DROP(a,n))="g")),n))))),""))))
Excel solution 2 for Transform Input to Output, proposed by Bo Rydobon 🇹🇭:
=LET(z,A2:B16,r,REDUCE(TOROW(UNIQUE(INDEX(z,,1))),SEQUENCE(ROWS(z)),LAMBDA(c,n,
LET(a,INDEX(z,n,1),b,INDEX(z,n,2),y,TAKE(c,-1),
IFNA(VSTACK(c,HSTACK(IF(a="Hall",b,TAKE(y,,1)),IF(a="date",TOROW(TAKE(DROP(z,n-1,1),XMATCH(0,N(LEFT(VSTACK(DROP(z,n,-1),0))="g")))),0))),"")))),
FILTER(r,INDEX(r,,2)>0))
Excel solution 3 for Transform Input to Output, proposed by Bo Rydobon 🇹🇭:
=LET(a,A2:A16,b,B2:B16,h,SCAN(0,SEQUENCE(ROWS(b)),LAMBDA(c,n,IF(INDEX(a,n)="Hall",INDEX(b,n),c))),d,SCAN(0,b,LAMBDA(c,v,IF(N(v),v,c))),
hd,HSTACK(h,d),uh,UNIQUE(FILTER(hd,a<>"hall")),REDUCE(TOROW(UNIQUE(a)),SEQUENCE(ROWS(uh)),LAMBDA(c,n,IFNA(VSTACK(c,HSTACK(INDEX(uh,n,1),TOROW(FILTER(b,h&d=CONCAT(INDEX(uh,n,)))))),""))))
Excel solution 4 for Transform Input to Output, proposed by محمد حلمي:
=LET(i,A2:A16,u,B2:B16,e,SCAN(,(u>"")*(i<>A2),
LAMBDA(a,d,IF(d,a,a+1))),r,REDUCE(TOROW(UNIQUE(i)),
UNIQUE(e),LAMBDA(a,d,LET(v,FILTER(u,e=d),IFNA(VSTACK(a,
HSTACK(IF(ROWS(v)=1,v,TAKE(a,-1,1)),TOROW(v))),"")))),
FILTER(r,INDEX(r,,3)>""))
Excel solution 5 for Transform Input to Output, proposed by محمد حلمي:
=LET(
a,A2:A16,
b,B2:B16,
n,--b,
v,LAMBDA(x,SCAN(,IFERROR(x,),LAMBDA(a,d,
IF(d,1+a,a)))),
VSTACK(TOROW(UNIQUE(a)),HSTACK(A2&
TOCOL(IF(n,v(FIND(A2,a))),2),
IFNA(DROP(REDUCE(0,SEQUENCE(COUNT(b)),
LAMBDA(a,d,
VSTACK(a,TOROW(FILTER(b,v(n)=d))))),1,-1),""))))
Excel solution 6 for Transform Input to Output, proposed by Duy Tùng:
=LET(a,A2:A16,b,B2:B16,c,ROW(b),f,LAMBDA(v,FILTER(v,LEN(b)=1)),h,LAMBDA(s,XLOOKUP(c,c/s,b,,-1)),u,PIVOTBY(HSTACK(f(h(a=A2)),f(h(b<""))),f(a),f(b),CONCAT,,0,,0),IF(TAKE(u,1)&TAKE(u,,1)="",{"Hall","Date"},u))
&&&
