Prepare the result table from problem table. Insert the Total Items and Total Amount for all companies.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 104
Challenge Difficulty: ⭐️⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Company Totals for Items/Amount with Power Query
Power Query solution 1 for Company Totals for Items/Amount, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Ans = Table.Combine(
Table.Group(
Source,
"Company",
{
"T",
each
let
n = Table.ColumnNames(_),
b = Table.Combine(
Table.TransformRows(
_,
each Table.FillDown(
Table.FromColumns(List.Transform(Record.ToList(_), each Text.Split(_, " / ")), n),
n
)
)
),
c = Table.TransformColumnTypes(
b,
List.Zip({n, List.Transform(Record.ToList(b{0}), each Value.Type(Value.FromText(_)))})
)
in
Table.FromRows(
Table.ToRows(c)
& {
{
c[Company]{0},
"Total Itmes",
Table.RowCount(c),
"Total Amount",
List.Sum(c[PO_Amount])
}
},
n
)
}
)[T]
)
in
Ans
Power Query solution 2 for Company Totals for Items/Amount, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
c = Table.ToColumns(Source),
s = Table.FromColumns(
List.Transform(
List.Positions(c),
(p) =>
List.Combine(
List.Transform(
List.Positions(c{p}),
(r) =>
if p < 2 then
List.Repeat({c{p}{r}}, List.Count(Text.Split(c{p + 2}{r}, " / ")))
else
List.Transform(Text.Split(c{p}{r}, " / "), each try Number.From(_) otherwise _)
)
)
),
Table.ColumnNames(Source)
),
S = Table.Sort(
Table.Group(
s,
{"Company"},
{
{"PO_No", each "Total Items"},
{"PO_Line_No", each Table.RowCount(_)},
{"PO_Items", each "Total Amount"},
{"PO_Amount", each List.Sum([PO_Amount])}
}
)
& s,
{"Company", "PO_Items"}
)
in
S
Power Query solution 3 for Company Totals for Items/Amount, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Col = List.Skip(Table.ColumnNames(Source)),
Group = Table.Group(
Source,
{"Company"},
{
{
"All",
each
let
a = Table.ExpandTableColumn(
Table.SelectColumns(
Table.AddColumn(
_,
"Custom",
each
let
b = List.Transform(
List.RemoveFirstN(Record.ToList(_), 1),
each Text.Split(_, " / ")
),
c = List.Transform(
b,
each List.Transform(
{0 .. List.Count(_) - 1},
(x) => try Number.From(_{x}) otherwise _{x}
)
),
d = Table.FromColumns(c, Col)
in
d
),
{"Custom"}
),
"Custom",
Col
),
b = Table.FillDown(a, {"PO_No"}),
c = {"Total Items", List.Count(b[PO_No]), "Total Amount", List.Sum(b[PO_Amount])},
d = Table.FromRows(Table.ToRows(b) & {c}, Col)
in
d
}
}
),
Sol = Table.ExpandTableColumn(Group, "All", Col)
in
Sol
Power Query solution 4 for Company Totals for Items/Amount, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
tab = Table.AddColumn(Fonte, "Personalizar", each
[a = List.Transform(Record.FieldValues(_), (x)=> Text.Split(x," / ")),
b = Table.Combine(List.Transform(List.Zip({Table.ColumnNames(Fonte),a}), (x)=> Table.FromColumns({x{1}},{x{0}}) )),
c = Table.FillDown(Table.PromoteHeaders(Table.FromColumns(List.Transform(Table.ToColumns(Table.DemoteHeaders(b)),List.RemoveNulls))),{"Company","PO_No"})][c])[[Personalizar]],
exp = Table.ExpandTableColumn(tab, "Personalizar", Table.ColumnNames(tab[Personalizar]{0})),
gp = Table.Group(exp, {"Company"}, {{"Contagem", each
[a = Table.ColumnNames(_),
b = hashtag#table({a{0},a{1},a{2},a{3},a{4}},{{_[Company]{0},"Total Items",List.Count(_[PO_Line_No]),"Total Items",List.Sum(List.Transform(_[PO_Amount],Number.From))}}),
c = Table.Combine({_,b})
][c]}})[[Contagem]],
res = Table.ExpandTableColumn(gp, "Contagem", Table.ColumnNames(gp[Contagem]{0}))
in
res
Power Query solution 5 for Company Totals for Items/Amount, proposed by Hussein SATOUR:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
SplitPoLine = Table.ExpandListColumn(
Table.TransformColumns(
Source,
{
{
"PO_Line_No",
Splitter.SplitTextByDelimiter(" / ", QuoteStyle.Csv),
let
itemType = (type nullable text) meta [Serialized.Text = true]
in
type {itemType}
}
}
),
"PO_Line_No"
),
AddPoItem = Table.AddColumn(
SplitPoLine,
"Po Item",
each Text.Split([PO_Items], " / "){Number.From([PO_Line_No]) - 1}
),
AddPoAmount = Table.AddColumn(
AddPoItem,
"Po Amount",
each Text.Split([PO_Amount], " / "){Number.From([PO_Line_No]) - 1}
),
RemCols = Table.RemoveColumns(AddPoAmount, {"PO_Items", "PO_Amount"}),
Type1 = Table.TransformColumnTypes(
RemCols,
{{"PO_Line_No", Int64.Type}, {"Po Amount", Int64.Type}}
),
GroupCom = Table.Group(
Type1,
{"Company"},
{
{"PO_Line_No", each Table.RowCount(_), Int64.Type},
{"Po Amount", each List.Sum([Po Amount]), type nullable number}
}
),
Append = Table.Combine({Type1, GroupCom}),
Replac1 = Table.ReplaceValue(Append, null, "Total
Items", Replacer.ReplaceValue, {"PO_No"}),
Replac2 = Table.ReplaceValue(
Replac1,
null,
"Total
Amount",
Replacer.ReplaceValue,
{"Po Item"}
),
Sorting = Table.Sort(
Replac2,
{{"Company", Order.Ascending}, {"PO_No", Order.Ascending}, {"PO_Line_No", Order.Ascending}}
)
in
Sorting
Power Query solution 6 for Company Totals for Items/Amount, proposed by Alexis Olson:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
SplitCols = List.LastN(Table.ColumnNames(Source), 3),
Custom1 = Table.AddColumn(
Source,
"Split",
(row) =>
Table.FromColumns(
List.Transform(SplitCols, each Text.Split(Record.Field(row, _), " / ")),
SplitCols
)
),
SelectCols = Table.SelectColumns(Custom1, {"Company", "PO_No", "Split"}),
Expand = Table.ExpandTableColumn(SelectCols, "Split", SplitCols, SplitCols),
ChangeTypes = Table.TransformColumnTypes(
Expand,
{
{"Company", type text},
{"PO_No", type text},
{"PO_Line_No", Int64.Type},
{"PO_Items", type text},
{"PO_Amount", Int64.Type}
}
),
GroupCompany = Table.Group(
ChangeTypes,
{"Company"},
{
{"PO_No", each "Total Items", type text},
{"PO_Line_No", each Table.RowCount(_), Int64.Type},
{"PO_Items", each "Total Amount", type text},
{"PO_Amount", each List.Sum([PO_Amount]), Int64.Type}
}
),
AppendRows = Table.Sort(
Table.Combine({ChangeTypes, GroupCompany}),
{{"Company", Order.Ascending}, {"PO_No", Order.Ascending}}
)
in
AppendRows
Power Query solution 7 for Company Totals for Items/Amount, proposed by Rafael González B.:
let
Source = Excel.CurrentWorkbook(){0}[Content],
GT = Table.AddColumn(Source, "SP", each
let
a = _,
b = Record.TransformFields(a,
{
{"PO_Line_No", each Text.Split(_, "/ ")},
{"PO_Items", each Text.Split(_, "/ ")},
{"PO_Amount", each Text.Split(_, "/ ")}
}),
c = Record.AddField(b, "Zip", List.Zip({b[PO_Line_No], b[PO_Items], b[PO_Amount]})),
d = Record.SelectFields(c, {"PO_No", "Zip"}),
e = Table.FromRecords({d})
in
e),
Power Query solution 8 for Company Totals for Items/Amount, proposed by Sandeep Marwal:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
S1 = Table.Transpose(Source),
S2 = Table.ToColumns(S1),
S3 = List.Transform(S2, each List.Transform(_, each try Text.Split(_, "/") otherwise {_})),
S4 = Table.Combine(
List.Transform(
S3,
each Table.FromColumns(_, {"Company", "PO_No", "PO_Line_No", "PO_Items", "PO_Amount"})
)
),
S5 = Table.FillDown(S4, {"Company", "PO_No"}),
S6 = Table.TransformColumnTypes(
S5,
{
{"Company", type text},
{"PO_No", type text},
{"PO_Line_No", Int64.Type},
{"PO_Amount", Int64.Type},
{"PO_Items", type text}
}
),
S7 = Table.Group(S6, {"Company"}, {{"Count", each _}}),
S8 = Table.TransformColumns(
S7,
{
"Count",
each Table.InsertRows(
_,
Table.RowCount(_),
{
[
Company = _[Company]{0},
PO_No = "Total Items",
PO_Line_No = Table.RowCount(_),
PO_Items = "Total Amount",
PO_Amount = List.Sum(_[PO_Amount])
]
}
)
}
),
S9 = Table.ExpandTableColumn(
S8,
"Count",
{"Company", "PO_No", "PO_Line_No", "PO_Items", "PO_Amount"},
{"Company.1", "PO_No", "PO_Line_No", "PO_Items", "PO_Amount"}
),
S10 = Table.RemoveColumns(S9, {"Company.1"})
in
S10
Power Query solution 9 for Company Totals for Items/Amount, proposed by Sanket Doijode:
let
Source = Excel.Workbook(File.Contents("Path_of_excel_workbook"), null, true),
Sheet1_Sheet = Source{[Item = "Sheet1", Kind = "Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars = true]),
#"Grouped Rows" = Table.Group(
#"Promoted Headers",
{"Company", "PO_No"},
{
{
"Custom",
each _,
type table [
Company = text,
PO_No = text,
PO_Line_No = text,
PO_Items = text,
PO_Amount = text
]
}
}
),
#"Added Custom1" = Table.AddColumn(
#"Grouped Rows",
"Custom.1",
each Table.PromoteHeaders(
Table.Transpose(
Table.SplitColumn(
Table.Transpose(Table.DemoteHeaders(Table.RemoveColumns([Custom], {"Company", "PO_No"}))),
"Column2",
Splitter.SplitTextByAnyDelimiter({"/ "})
)
)
)
),
#"Added Custom" = Table.AddColumn(
#"Added Custom1",
"Custom.2",
each Table_With_Total_Function([Custom.1])
),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom", {"Custom", "Custom.1"}),
#"Expanded Custom.2" = Table.ExpandTableColumn(
#"Removed Columns",
"Custom.2",
{"PO_Line_No", "PO_Items", "PO_Amount"},
{"PO_Line_No", "PO_Items", "PO_Amount"}
)
in
#"Expanded Custom.2"
Solving the challenge of Company Totals for Items/Amount with Excel
Excel solution 1 for Company Totals for Items/Amount, proposed by Bo Rydobon 🇹🇭:
=REDUCE(A1:E1,UNIQUE(A2:A6),LAMBDA(a,v,LET(p,B2:B6,
d,DROP(REDUCE(0,FILTER(p,v=A2:A6),LAMBDA(b,x,VSTACK(b,TRANSPOSE(TEXTSPLIT(TEXTJOIN("|",,XLOOKUP(x,p,B2:E6))," / ","|",,,x))))),1),
VSTACK(a,VSTACK(IFNA(HSTACK(v,IFERROR(--d,d)),v),HSTACK(v,"Total Items",ROWS(d),"Total Amount",SUM(--DROP(d,,3))))))))
Excel solution 2 for Company Totals for Items/Amount, proposed by محمد حلمي:
=LET(r,A2:A6,c,REDUCE(0,r,LAMBDA(a,d,LET(
u,TRANSPOSE(TEXTSPLIT(
CONCAT(OFFSET(d,,1,,4)&"-")," / ","-",1)),i,IFNA(u,@u),
VSTACK(a,IFNA(HSTACK(d,IFERROR(--i,i)),d))))),
REDUCE(A1:E1,UNIQUE(r),LAMBDA(a,d,LET(
v,FILTER(c,TAKE(c,,1)=d),
VSTACK(a,VSTACK(v,HSTACK(d,"Total Items",
ROWS(v),"Total Amount",SUM(TAKE(v,,-1)))))))))
Excel solution 3 for Company Totals for Items/Amount, proposed by Oscar Mendez Roca Farell:
=REDUCE(A1:E1, UNIQUE(A2:A6), LAMBDA(i, x, LET(_f,FILTER(B2:E6, A2:A6=x),_m, DROP(REDUCE("",SEQUENCE(ROWS(_f)), LAMBDA(j, y VSTACK(j, TRANSPOSE(TEXTSPLIT(TEXTJOIN("|" , ,INDEX(_f, y, )), " / ","|" , , ,INDEX(_f, y, 1)))))), 1), VSTACK(i, IFNA(HSTACK(x, VSTACK(_m, TEXTSPLIT(TEXTJOIN("|", ,"Total "&{"Items";"Amount"}&"|"&IF({1;0}, ROWS(_m),SUM(--TAKE(_m, ,-1)))), "|"))), x)))))
Excel solution 4 for Company Totals for Items/Amount, proposed by Sunny Baggu:
=LET(
_r, DROP(
REDUCE(
"",
SEQUENCE(ROWS(A2:E6)),
LAMBDA(e, d,
VSTACK(
e,
LET(
_a, IFNA(DROP(REDUCE("", SEQUENCE(COLUMNS(A1:E1)), LAMBDA(a, v, HSTACK(a, TEXTSPLIT(INDEX(INDEX(A2:E6, d, ), , v), , " / ", 1)))), , 1), ""),
_b, TRANSPOSE(SCAN("", TRANSPOSE(_a), LAMBDA(x, y, IF(y = "", x, y)))),
_b
)
)
)
),
1
),
tbl, IF(ISNUMBER(_r * 1), _r * 1, _r),
REDUCE(
A1:E1,
UNIQUE(TAKE(tbl, , 1)),
LAMBDA(m, n, VSTACK(m, LET(_t1, FILTER(tbl, TAKE(tbl, , 1) = n), VSTACK(_t1, HSTACK(n, "Total Items", ROWS(_t1), "Total Amount", SUM(TAKE(_t1, , -1)))))))
)
)
Excel solution 5 for Company Totals for Items/Amount, proposed by Md Ismail Hosen:
=LAMBDA(MainData, LET(_Header, CHOOSEROWS(MainData, 1), _OnlyData, DROP(MainData, 1), _Fx_OneRow, LAMBDA(OneRow, LET(_PrepareThirdToOnward, DROP(REDUCE("", DROP(OneRow, , 2), LAMBDA(a,v, HSTACK(a, TEXTSPLIT(v, , " / ")))), , 1), _PrepareFirstTwoCol, IFERROR(REDUCE(TAKE(OneRow, , 2), SEQUENCE(ROWS(_PrepareThirdToOnward) - 1), LAMBDA(a,v, VSTACK(a, TAKE(OneRow, , 2)))), TAKE(OneRow, , 2)), _Result, HSTACK(_PrepareFirstTwoCol, _PrepareThirdToOnward), _Result)), _Fx_ForOneGroup, LAMBDA(MainData,FilterFor, LET(_FilteredData, FILTER(_OnlyData, CHOOSECOLS(_OnlyData, 1) = FilterFor), _OutputForOneGroup, DROP(REDUCE("", SEQUENCE(ROWS(_FilteredData)), LAMBDA(a,v, VSTACK(a, _Fx_OneRow(CHOOSEROWS(_FilteredData, v))))), 1), _TotalItems, ROWS(_OutputForOneGroup), _TotalAmounts, SUM(CHOOSECOLS(_OutputForOneGroup, -1) * 1), _Result, VSTACK(_OutputForOneGroup, HSTACK(FilterFor, "Total Items", _TotalItems, "Total Amount", _TotalAmounts)), _Result)), _UniqueCompany, UNIQUE(CHOOSECOLS(_OnlyData, 1)), _Result, REDUCE(_Header, _UniqueCompany, LAMBDA(a,v, VSTACK(a, _Fx_ForOneGroup(MainData, v)))), _Result))(A1:E6)
Solving the challenge of Company Totals for Items/Amount with Python
Python solution 1 for Company Totals for Items/Amount, proposed by Aman Mashetty:
df = pd.read_excel("PQ_Challenge_104.xlsx",usecols = 'A:E')
# Split columns and explode
df['PO_Line_No'] = df['PO_Line_No'].str.split(' / ')
df['PO_Items'] = df['PO_Items'].str.split(' / ')
df['PO_Amount'] = df['PO_Amount'].str.split(' / ')
df = df.explode(['PO_Line_No', 'PO_Items', 'PO_Amount'])
df['PO_Amount'] = pd.to_numeric(df['PO_Amount'])
# Calculate total items and total amount for each company
totals = df.groupby('Company').agg(
Total_Items=('PO_Items', 'size'),
Total_Amount=('PO_Amount', 'sum')).reset_index()
result = pd.concat(&[df, totals], ignore_index=True)
result = result.fillna('')
result = result.sort_values(by=['Company', 'PO_No']).reset_index(drop=True)
result.loc[result['PO_No'] == '', 'PO_No'] = 'Total Items'
result.loc[result['PO_No'] == 'Total Items', 'PO_Items'] = result.loc[result['PO_No'] == 'Total Items', 'Total_Items']
result.loc[result['PO_No'] == 'Total Items', 'PO_Amount'] = result.loc[result['PO_No'] == 'Total Items', 'Total_Amount']
result.loc[result['PO_No'] == 'Total Items', 'PO_Line_No'] = 'Total Amount'
result = result.drop(columns=['Total_Items', 'Total_Amount'])
print(result)
&&
