Home » Pay All Quarters Customers

Pay All Quarters Customers

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))))))

&&&

Leave a Reply