Excel BI Power Query Challenge Workout 075

-CAN YOU SOLVE THIS - POWER QUERY CHALLENGE 75-
(Solution in any language also welcome for Power Query Challenges)

Groups are separated by blank rows in Problem table.
You need to generate Result table where Quantity and Amount are sum of the groups.

Download Practice File - https://lnkd.in/daYnph5s

(Post answers in Comment. Your approach need not be different from others as long as you have worked out your approach independently)

#powerquerychallenge, #daxchallenge, #m, #dax, #powerbi, #powerquery, #powerpivot, #sheets, #googlesheets, #data, #analytics, #businessintelligence, #finance, #excel, #excelchallenge, #python, #r

LinkedIn Post:

LinkedIn Post by:
Melissa de Korte

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
AddIsNull = Table.AddColumn(Source, "IsNull", each [Quantity] = null),
GroupRows = Table.SelectRows( [Table.Group](http://table.group/)(AddIsNull, {"IsNull"}, {{"Quantity", each List.Sum([Quantity]), type nullable number}, {"Amount", each List.Sum([Amount]), type nullable number}}, GroupKind.Local, (a,b)=> if b[IsNull] then 1 else 0)[[Quantity], [Amount]], each [Amount] <> null ),
AddGroup = Table.ReorderColumns( Table.ReplaceValue( Table.AddIndexColumn(GroupRows, "Group", 1, 1, Int64.Type), each [Group], each "Group " & Text.From([Group]),Replacer.ReplaceValue,{"Group"}), {"Group"} & Table.ColumnNames(Source) )
in
AddGroup

LinkedIn Post by:
Zoran Milokanović

Generating the Result table w/ #powerquery. #bitanbit #powerbi

let
Source = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
AddGroup = Table.FromRows([List.Select](http://list.select/)(List.Accumulate(Table.ToRows(Source), {}, (s, c) =>
let
i = if s = {} then 0 else List.Max(List.Transform(s, each _{0}))
in
s & {{if c{0} is null then null else if List.Last(s){0}? = null then i + 1 else i} & c}
), each _{0} <> null), {"Group"} & Table.ColumnNames(Source) ),
Solution = [Table.Group](http://table.group/)(Table.TransformColumns(AddGroup, {{"Group", each "Group " & Text.From(_)}}), {"Group"}, {{"Quantity", each List.Sum([Quantity])}, {"Amount", each List.Sum([Amount])}})
in
Solution

LinkedIn Post by:
Alejandro Simón

Adjunto mi query...
let
  Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
  Gen = List.Generate(
  ()=> [x = 0, y = 0],
  each [y] <= Table.RowCount(Source)-1,
  each [x = if Source[Amount]{[y]} = null then [x] + 1 else [x], y = [y] + 1],
  each [x] ),
  Tabla = Table.SelectRows(Table.FromColumns(Table.ToColumns(Source)&{Gen}, Table.ColumnNames(Source)&{"Group"}), each ([Quantity] <> null)),
  Group = Table.Group(Tabla, {"Group"}, {{"Count", (x)=>
let
a = List.Transform(Table.ToColumns(Table.RemoveColumns(x, "Group")), List.Sum),
b = Table.FromColumns({{a{0}}, {a{1}}}, List.FirstN(Table.ColumnNames(x),2))
in b
}})[Count],
  Tabla2 = Table.FromColumns({List.Transform({1..List.Count(Group)}, each "Group "& Text.From(_)), Group}, {"Group", "Col2"}),
  Sol =  Table.ExpandTableColumn(Tabla2, "Col2", Table.ColumnNames(Source))
in
  Sol

LinkedIn Post by:
Alexis Olson

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source, "Group", each [Quantity] = null, type logical),
#"Grouped Rows" = [Table.Group](http://table.group/)(#"Added Custom", {"Group"}, {{"Quantity", each List.Sum([Quantity])}, {"Amount", each List.Sum([Amount])}}, GroupKind.Local),
#"Added Index" = Table.AddIndexColumn(Table.SelectRows(#"Grouped Rows", each [Quantity] <> null), "Index", 1, 1, Int64.Type),
#"Index to Group" = Table.ReplaceValue(#"Added Index", each [Group], each "Group " & Number.ToText([Index]), Replacer.ReplaceValue, {"Group"})
in
#"Index to Group"

LinkedIn Post by:
Luan Rodrigues

let
Fonte = Tabela1,
Ind = Table.AddIndexColumn(Fonte, "Ind", 1, 1, Int64.Type),
add = Table.AddColumn(Ind, "Personalizar", each if [Quantity] = null then Ind{[Ind]}[Quantity] else null),
pb = Table.FillDown(add,{"Personalizar"}),
fil = Table.SelectRows(pb, each ([Quantity] <> null)),
gp = [Table.Group](http://table.group/)(fil, {"Personalizar"}, {{"Quantity", each List.Sum(_[Quantity])},
{"Amount", each List.Sum(_[Amount])}})[[Quantity],[Amount]],
#"in" = Table.AddIndexColumn(gp, "Índice", 1, 1, Int64.Type),
res = Table.AddColumn(#"in", "Group", each "Group " & Text.From([Índice]))
[[Group],[Quantity],[Amount]]
in
res

LinkedIn Post by:
Victor Wang

let
   Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
   getRecs = List.Accumulate(Table.ToRecords(Source), {[lastQuant = 0, Group = 0, Quantity = 0, Amount = 0]}, (state, current)=> let lastR = List.Last(state) in if lastR[Group] = 0 or (current[Quantity] = null and lastR[lastQuant] <> null) then state & {[lastQuant = current[Quantity], Group = lastR[Group]+1, Quantity = current[Quantity], Amount = current[Amount]]} else List.RemoveLastN(state,1) & {[lastQuant = current[Quantity], Group = lastR[Group], Quantity = List.Sum({lastR[Quantity], current[Quantity]}), Amount = List.Sum({lastR[Amount], current[Amount]})]}),
   fromRecs = Table.Skip(Table.FromRecords(getRecs, {"Group", "Quantity", "Amount"})),
   groupName = Table.TransformColumns(fromRecs, {{"Group", each "Group " & Text.From(_)}})
in
   groupName

LinkedIn Post by:
Bo Rydobon

M-Code
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Group = Table.FromRecords([Table.Group](http://table.group/)(Source,"Quantity", {"R", each Record.FromList(List.Transform(Table.ToColumns(_),List.Sum),Table.ColumnNames(Source))},0,(b,e)=>Number.From(e =null))[R]),
AGroup = Table.TransformColumns(Table.AddIndexColumn(Table.SelectRows(Group, each ([Quantity] <> null)),"Group",1),{"Group", each "Group " &Text.From(_)}),
Reorder = Table.ReorderColumns(AGroup,let c = Table.ColumnNames(AGroup) in List.LastN(c,1)&List.RemoveLastN(c,1))
in
Reorder

LinkedIn Post by:
Oscar Mendez Roca Farell

hi everyone,

my proposal solution:

=LET(_r, DROP( REDUCE("", SEQUENCE(2), LAMBDA(j, y, HSTACK(j, LET(_m, INDEX(A2:B21, ,y),_n, DROP(_m,-1), FILTER( SCAN(0,_n, LAMBDA(i, x, SUM(i+x)*(x>0))), IFERROR((_n>0)/(DROP(_m,1)=0), )))))), ,1), VSTACK(HSTACK("Group", A1:B1), HSTACK("Group "&SEQUENCE(ROWS(_r)), _r)))

LinkedIn Post by:
Eric Laforce

PQ proposal :
let
Source = Excel.CurrentWorkbook(){[Name="tData75"]}[Content],
Add_IsNull = Table.AddColumn(Source, "IsNull", each [Quantity]=null),
Group = [Table.Group](http://table.group/)(Add_IsNull, {"IsNull"}, {"Values", each __fxGroupSum(_)}, GroupKind.Local),
__fxGroupSum = (t)=>[Table.Group](http://table.group/)(t, {"IsNull"},
{ {"Quantity", each List.Sum([Quantity]), type number},
{"Amount", each List.Sum([Amount]), type number}
}),
FilterRows = Table.RemoveColumns(Table.SelectRows(Group, each ([IsNull] = false)), {"IsNull"}),
Add_GroupName = Table.FromColumns({__GrpNames} & Table.ToColumns(FilterRows), {"Group", "Values"}),
__GrpNames = List.Transform({1..Table.RowCount(FilterRows)}, each "Group"&Text.From(_) ),
Expand = Table.ExpandTableColumn(Add_GroupName, "Values", {"Quantity", "Amount"})
in
Expand

LinkedIn Post by:
Caroline Blake

Not very elegant, but it works:

=LET(a,IF(A2:A20="",";",A2:A20),
b,BYROW(a,LAMBDA(a,CONCAT(a,","))),
c,IFERROR(VALUE(IFNA(TEXTSPLIT(CONCAT(b),",",";"),0)),0),
d,BYROW(c,LAMBDA(c,SUM(c))),
e,IF(B2:B20="",";",B2:B20),
f,BYROW(e,LAMBDA(e,CONCAT(e,","))),
g,IFERROR(VALUE(IFNA(TEXTSPLIT(CONCAT(f),",",";"),0)),0),
h,BYROW(g,LAMBDA(g,SUM(g))),
VSTACK(HSTACK("Group","Quantity","Amount"),HSTACK("Group "&SEQUENCE(5),FILTER(d,d>0),FILTER(h,h>0))))

LinkedIn Post by:
Omid Motamedisedeh

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.SelectColumns(Table.ExpandRecordColumn(Table.TransformColumns(Table.AddIndexColumn(Table.SelectRows([Table.Group](http://table.group/)(Table.AddColumn(Source, "New", each [Quantity]=null),{"New"}, {{"Count", each _}},0), each [New]=false), "Group",1, 1, Int64.Type),{{"Count", each [Quantit=List.Sum(_[Quantity]), Amount=List.Sum(_[Amount])]},{"Group",each "Grooup " & Text.From(_)}}),"Count", {"Quantit", "Amount"}, {"Quantity", "Amount"}),{"Group","Quantity","Amount"})
in
#"Added Custom"

LinkedIn Post by:
Sunny Baggu

inspired from Bo Rydobon,

=LET(
_input, A2:B20,
_qty, DROP(_input, , -1),
_amt, DROP(_input, , 1),
_e1, LAMBDA(arr, SCAN(0, arr, LAMBDA(a, v, IF(v, a) + v))),
_runtot, HSTACK(_e1(_qty), _e1(_amt)),
_cond, N(_qty <> 0),
_cri, VSTACK(DROP(_cond, 1) < DROP(_cond, -1), 1),
_res, FILTER(_runtot, _cri),
VSTACK(HSTACK("Group", A1:B1), HSTACK("Group" & SEQUENCE(ROWS(_res)), _res))
)

LinkedIn Post by:
Rick Rothstein

=LET(fg,LAMBDA(a,TEXTSPLIT(TRIM(SUBSTITUTE(CONCAT(IF(a=""," ",a&"+")),"+ "," "))&0,," ")),fc,LAMBDA(x,BYROW(fg(x),LAMBDA(s,SUM(0+TEXTSPLIT(@s,"+"))))),ra,fc(A2:A20),VSTACK({"Group","Quantity","Amount"},HSTACK("Group"&SEQUENCE(COUNT(ra)),ra,fc(B2:B20))))

LinkedIn Post by:
Rick Rothstein

I have come up with a much shorter formula than my original formula for this challenge…

=LET(f,LAMBDA(a,BYROW(0&TEXTSPLIT(CONCAT(a&"+0"),,"+0+0",1),LAMBDA(r,SUM(0+TEXTSPLIT(@r,"+"))))),VSTACK(HSTACK("Group",A1:B1),HSTACK("Group "&SEQUENCE(COUNT(f(A2:A20))),f(A2:A20),f(B2:B20))))

LinkedIn Post by:
محمد حلمي

=LET(
o,SCAN(0,A2:A20,LAMBDA(a,d,IF(d>0,a,a+1))),
r,DROP(REDUCE(0,UNIQUE(o),LAMBDA(a,d,LET(
v,FILTER(A2:B20,o=d),VSTACK(a,HSTACK(SUM(TAKE(v,,1)),
SUM(DROP(v,,1))))))),1),
u,FILTER(r,TAKE(r,,1)),
VSTACK(HSTACK("Group",A1:B1),
HSTACK("Group "&SEQUENCE(ROWS(u)),u)))

LinkedIn Post by:
محمد حلمي

Maybe last try
=LET(l,LAMBDA(x,LET(v,SCAN(,x,LAMBDA(a,d,IF(d,a+d))),n,IF(DROP(VSTACK(v,0),1),,v),
FILTER(n,n))),v,l(A2:A20),VSTACK(HSTACK("Group",A1:B1),HSTACK("Group "&SEQUENCE(ROWS(v)),v,l(B2:B20))))

LinkedIn Post by:
Bo Rydobon

=LET(z,TRANSPOSE(SCAN(0,TRANSPOSE(VSTACK(A2:B21)),LAMBDA(a,v,IF(v,a)+v))),y,FILTER(z,TAKE(VSTACK(DROP(z=0,1),0)*z,,1)),
VSTACK(HSTACK("Group",A1:B1),HSTACK("Group "&SEQUENCE(ROWS(y)),y)))

LinkedIn Post by:
Bo Rydobon

=LET(z,A2:B20,q,REDUCE(VSTACK(A1:B1,{0,0}),SEQUENCE(ROWS(z)),LAMBDA(a,n,LET(v,INDEX(z,n,),p,TAKE(a,-1),IF(SUM(v),VSTACK(DROP(a,-1),p+v),IF(SUM(p),VSTACK(a,v),a))))),
HSTACK("Group "&TEXT(SEQUENCE(ROWS(q),,0),"#"),q))

Power Query

let
	Source = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
	Group  = Table.Group (
		Source,
		"Quantity",
		{ "R", each [ Quantity = List.Sum ( [Quantity] ), Amount = List.Sum ( [Amount] ) ] },
		0,
		( x, y ) => Number.From ( y = null )
	),
	Select = List.Select ( Group[R], each [Quantity] <> null ),
	Output = List.Transform (
		{ 1 .. List.Count ( Select ) },
		each [ Group = Number.ToText ( _, "Group 0" ) ] & Select{_ - 1}
	),
	Return = Table.FromRecords ( Output )
in
	Return

PQ_Challenge_75.xlsx (23.9 KB)