Find those customers who have made at least one payment in all quarters in its range. Only that part of the range to be considered where either 0 or 1 is populated. Hence, for Delta, range will be considered from Apr to Dec. Hence, Delta needs to make at least one payment in these 3 quarters.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 208
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Pay All Quarters Customers with Power Query
Power Query solution 1 for Pay All Quarters Customers, proposed by Omid Motamedisedeh:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Custom2 = List.RemoveItems(
List.Transform(
{0 .. 8},
each
if List.AllTrue(
List.Transform(
List.Split(List.RemoveItems(List.Skip(Table.ToRows(Source){_}), {null}), 3),
(ox) => List.Sum(ox) >= 1
)
)
then
Source[Customer]{_}
else
"0"
),
{"0"}
)
in
Custom2
Power Query solution 2 for Pay All Quarters Customers, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Unpivot = Table.TransformColumns(
Table.UnpivotOtherColumns(Source, {"Customer"}, "M", "V"),
{"M", each Date.QuarterOfYear(Date.From("1" & _))}
),
Grouped = Table.SelectRows(
Table.Group(
Table.Group(Unpivot, {"Customer", "M"}, {"Sum", each List.Sum([V])}),
"Customer",
{"F", each not List.Contains([Sum], 0)}
),
each [F]
)[[Customer]]
in
Grouped
Power Query solution 3 for Pay All Quarters Customers, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
Solution = List.Transform(
List.Select(
Table.ToRows(Source),
each List.AllTrue(
List.Transform(
List.Select(
List.Transform(List.Split(List.Skip(_), 3), List.RemoveNulls),
each not List.IsEmpty(_)
),
each List.Contains(_, 1)
)
)
),
each _{0}
)
in
Solution
Power Query solution 4 for Pay All Quarters Customers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Unpivot = Table.UnpivotOtherColumns(Source, {"Customer"}, "Attribute", "Value"),
Date = Table.TransformColumns(
Unpivot,
{"Attribute", each Date.QuarterOfYear(Date.FromText("1-" & _))}
),
Group = Table.Group(
Date,
{"Customer", "Attribute"},
{
{
"Count",
each
let
a = try List.Distinct(List.Select([Value], each _ <> 0)){0} otherwise null
in
a
}
}
),
Sol = Table.SelectRows(
Table.Group(
Group,
{"Customer"},
{{"Q", each Table.RowCount(_)}, {"All", each List.Sum([Count])}}
),
each [Q] = [All]
)[[Customer]]
in
Sol
Power Query solution 5 for Pay All Quarters Customers, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
tab = Table.UnpivotOtherColumns(Fonte, {"Customer"}, "Atributo", "Valor"),
res = Table.SelectRows(
Table.Group(
tab,
{"Customer"},
{
{
"Contagem",
each List.AllTrue(List.Transform(List.Split(_[Valor], 3), each List.Contains(_, 1)))
}
}
),
each [Contagem] = true
)[[Customer]]
in
res
Solving the challenge of Pay All Quarters Customers with Excel
Excel solution 1 for Pay All Quarters Customers, proposed by Bo Rydobon 🇹🇭:
=LET(z,B2:M10,q,INT(SEQUENCE(COLUMNS(z),,0)/3),r,N(q=TOROW(UNIQUE(q))),FILTER(A2:A10,MMULT(N(MMULT(--z,r)+(MMULT(N(z=""),r)=3)>0),{1;1;1;1})=4))
Excel solution 2 for Pay All Quarters Customers, proposed by Bo Rydobon 🇹🇭:
=FILTER(A2:A10,BYROW(B2:M10,LAMBDA(a,AND(MMULT(WRAPROWS(IF(a="",1/3,a),3),{1;1;1})>=1))))
Excel solution 3 for Pay All Quarters Customers, proposed by John V.:
=FILTER(A2:A10,BYROW(B2:M10,LAMBDA(r,AND(MMULT(INDEX(r+(r=""),SEQUENCE(4,3)),{1;1;1})))))
✅=FILTER(A2:A10,BYROW(B2:M10,LAMBDA(r,AND(MMULT(WRAPROWS(r+(r=""),3),{1;1;1})))))
Excel solution 4 for Pay All Quarters Customers, proposed by محمد حلمي:
=FILTER(A2:A10,BYROW(IF(B2:M10="",1,B2:M10),LAMBDA(a,AND(MMULT(INDEX(a,SEQUENCE(4,3)),{1;1;1})))))
to:
=FILTER(A2:A10,BYROW(B2:M10,LAMBDA(a,AND(MMULT(WRAPROWS(IF(a="",1,a),3),{1;1;1})))))
Excel solution 5 for Pay All Quarters Customers, proposed by محمد حلمي:
=FILTER(A2:A10,BYROW(B2:M10,LAMBDA(a,AND(MMULT(WRAPROWS(IF(a="",1,a),3),{1;1;1})))))
Excel solution 6 for Pay All Quarters Customers, proposed by 🇰🇷 Taeyong Shin:
=FILTER(A2:A10, REDUCE(0, {3,6,9,12}, LAMBDA(a,n, LET(r, DROP(TAKE(B2:M10, , n), , n - 3), a + SIGN(MMULT(ISBLANK(r) + r, {1;1;1}))))) = 4)
Excel solution 7 for Pay All Quarters Customers, proposed by 🇰🇷 Taeyong Shin:
=FILTER(A2:A10, BYROW((B2:M10 = "") + B2:M10, LAMBDA(r, AND(MMULT(WRAPROWS(r, 3), {1;1;1})))))
Excel solution 8 for Pay All Quarters Customers, proposed by Kris Jaganah:
=FILTER(A2:A10,BYROW(B2:M10,LAMBDA(z,LET(a,TOCOL(IF(z="",-1,z)),b,CEILING(SCAN(0,IF(a<0,0,1),LAMBDA(x,y,IF(y>0,x+y,0)))/3,1),c,UNIQUE(a&b),--(COUNTA(FILTER(c,LEFT(c)="1"))=MAX(b))))))
Excel solution 9 for Pay All Quarters Customers, proposed by Timothée BLIOT:
=FILTER(A2:A10,MAP(SEQUENCE(ROWS(A2:A10)),LAMBDA(x,SUM(MAP(SEQUENCE(4),LAMBDA(y,IF(SUM(LET(A,INDEX(B2:M10,x,SEQUENCE(3,,((y-1)*3)+1)),IF(ISBLANK(A),1,A)))>=1,1,0))))=4)))
Excel solution 10 for Pay All Quarters Customers, proposed by Oscar Mendez Roca Farell:
=FILTER(A2:A10, BYROW(B2:M10, LAMBDA(r, LET(_c, ROUND(COUNT(r)/3,),_s, SUM(--(MMULT(WRAPROWS(IFERROR(1/r^-1, ), 3), {1;1;1})>0)),_s>=_c))))
Excel solution 11 for Pay All Quarters Customers, proposed by Sunny Baggu:
=FILTER(
A2:A10,
MAKEARRAY(
ROWS(A2:A10),
1,
LAMBDA(r, c,
AND(
BYROW(
INDEX(
IF(CHOOSEROWS(B2:M10, r) = "", 1, CHOOSEROWS(B2:M10, r)),
SEQUENCE(4, 3, )
),
LAMBDA(a, SUM(a) >= 1)
)
)
)
)
)
Excel solution 12 for Pay All Quarters Customers, proposed by Sunny Baggu:
=FILTER(
A2:A10,
DROP(
REDUCE(
"",
SEQUENCE(ROWS(A2:A10)),
LAMBDA(a, v,
VSTACK(
a,
AND(
BYROW(
BYROW(
WRAPROWS(
IF(
CHOOSEROWS(B2:M10, v) = "",
1,
CHOOSEROWS(B2:M10, v)
) * SEQUENCE(, 12) ^ 0,
3
),
LAMBDA(a, SUM(a))
),
LAMBDA(b, b >= 1)
)
)
)
)
),
1
)
)
Excel solution 13 for Pay All Quarters Customers, proposed by LEONARD OCHEA 🇷🇴:
=LET(d,B2:M10,f,ROWS(d),s,INT(SEQUENCE(f,12,0)/3),FILTER(A2:A10,BYROW(MAP(SEQUENCE(f,4,0),LAMBDA(a,SUM((a=s)*IF(d="",1,d)))),LAMBDA(x,AND(x)))))
Excel solution 14 for Pay All Quarters Customers, proposed by Md. Zohurul Islam:
=LET(u,A2:A10,v,B2:M10,
w,BYROW(v,LAMBDA(x,LET(a,WRAPROWS(IF(x="",1/3,x),3),b,SUM(ABS(BYROW(a,SUM)>=1)),b))),
z,FILTER(u,w=4),z)
Excel solution 15 for Pay All Quarters Customers, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=VSTACK(HSTACK(" ";TOROW(UNIQUE(TOCOL("Q"&ROUNDUP(TOROW(SEQUENCE(COUNTA(B1:M1)))/3;0))));"Answer Expcted");IFERROR(HSTACK(A2:A10;VALUE(TEXTSPLIT(CONCAT(MAP(A2:A10;LAMBDA(b;TEXTJOIN(",";;MAP(TOROW(UNIQUE(TOCOL("Q"&ROUNDUP(TOROW(SEQUENCE(COUNTA(B1:M1)))/3;0))));LAMBDA(a;SUMPRODUCT(("Q"&ROUNDUP(TOROW(SEQUENCE(COUNTA(B1:M1)))/3;0)=a)*(A2:A10=b)*($B$2:$M$10)))))&"?")));",";"?";TRUE;0;""));LET(m;VALUE(TEXTSPLIT(CONCAT(MAP(A2:A10;LAMBDA(b;TEXTJOIN(",";;MAP(TOROW(UNIQUE(TOCOL("Q"&ROUNDUP(TOROW(SEQUENCE(COUNTA(B1:M1)))/3;0))));LAMBDA(a;SUMPRODUCT(("Q"&ROUNDUP(TOROW(SEQUENCE(COUNTA(B1:M1)))/3;0)=a)*(A2:A10=b)*($B$2:$M$10)))))&"?")));",";"?";TRUE;0;""));LET(x;MAP(A2:A10;TAKE(m;;1);DROP(TAKE(m;;2);;1);DROP(TAKE(m;;-2);;-1);TAKE(m;;-1);LAMBDA(a;b;c;d;e;IF(AND(b>=1;c>=1;d>=1;e>=1);a;"")));FILTER(x;x<>""))));""))
Excel solution 16 for Pay All Quarters Customers, proposed by Pieter de Bruijn:
=LET(a,A2:M10,
b,DROP(a,,1),
FILTER(TAKE(a,,1),MMULT(WRAPROWS(TOCOL(SIGN(MMULT(WRAPROWS(TOCOL(b+(b="")),3),{1;1;1}))),4),{1;1;1;1})=4))
Excel solution 17 for Pay All Quarters Customers, proposed by Guillermo Arroyo:
=FILTER(A2:A10;BYROW(B2:M10;LAMBDA(a;AND(BYROW(WRAPROWS(a;3);LAMBDA(b;IFERROR(OR(TOROW(b;3));1)))))))
Excel solution 18 for Pay All Quarters Customers, proposed by Adam Carter:
=LET(data,R2:AC10,
names,Q2:Q10,
month,R1:AC1,
start_pos,DROP(REDUCE(0,SEQUENCE(ROWS(names)),LAMBDA(a,v,VSTACK(a,MATCH(1,--ISNUMBER(INDEX(data,v,)),0)))),1),
end_pos,DROP(REDUCE(0,SEQUENCE(ROWS(names)),LAMBDA(a,v,VSTACK(a,INDEX(start_pos,v,0)+COUNT(INDEX(data,v,))-1))),1),
find_sums,
DROP(REDUCE(0,SEQUENCE(ROWS(names)),LAMBDA(ac,va,VSTACK(ac,
REDUCE(0,SEQUENCE(4),LAMBDA(a,v,a+IFERROR(--(SUM(INDEX(data,va,INDEX(start_pos,va,1)+(v-1)*3):INDEX(data,va,INDEX(start_pos,va,1)+(v-1)*3+2))>0),0)))))),1),
periods,ROUNDUP((end_pos-start_pos+1)/3,0),
FILTER(names,find_sums=periods))
Excel solution 19 for Pay All Quarters Customers, proposed by Colin Davidson:
=LET(customers,B2:B10, data, C2:N10, FILTER(customers,BYROW(data, LAMBDA(curr_row, LET(input, curr_row, result, BYROW(WRAPROWS(FILTER(input,input<>""),3,0), LAMBDA(x, IF(SUM(x)>=1,1,0))), IF(SUM(result) = ROWS(result),1,0))))))
&&&
