Home » Max Monthly Sales Change

Max Monthly Sales Change

List the total sales, maximum change in sales month on month basis (absolute value) and From and To months when this maximum change occurred.

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 180
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Max Monthly Sales Change with Power Query

Power Query solution 1 for Max Monthly Sales Change, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Ans = Table.Combine(
    Table.Group(
      Source, 
      "Sales", 
      {
        "T", 
        each 
          let
            e = [#"Emp-Month"], 
            s = [Sales], 
            d = List.Transform(List.Zip({s, List.Skip(s)}), each Number.Abs(_{0} - _{1})), 
            x = List.Max(d), 
            i = List.PositionOf(d, x)
          in
            Table.FromRows(
              {{e{0}, List.Sum(s), x, e{i} & " - " & e{i + 1}}}, 
              {"Emp", "Total Sales", "Max Sales Change", "From - To Months"}
            )
      }, 
      0, 
      (b, e) => Number.From(e = null)
    )[T]
  )
in
  Ans
Power Query solution 2 for Max Monthly Sales Change, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  S = Table.FromRows(
    Table.Group(
      Source, 
      "Sales", 
      {
        {
          "A", 
          each 
            let
              l = Table.ToRows(_), 
              c = List.TransformMany(
                l, 
                each List.Select(l, (m) => List.PositionOf(l, m) = List.PositionOf(l, _) + 1), 
                (i, _) => {Number.Abs(i{1} - _{1})} & {i{0} & " - " & _{0}}
              )
            in
              {[#"Emp-Month"]{0}} & {List.Sum([Sales])} & List.Max(c, 0, each _{0})
        }
      }, 
      0, 
      (b, n) => Byte.From(n = null)
    )[A], 
    {"Emp", "Total Sales", "Max Sales Change", "From - To Months"}
  )
in
  S
Power Query solution 3 for Max Monthly Sales Change, proposed by Kris Jaganah:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Emp = Table.AddColumn(Source, "Emp", each if [Sales] = null then [#"Emp-Month"] else null), 
  FillDown = Table.FillDown(Emp, {"Emp"}), 
  SalesChange = Table.AddColumn(
    FillDown, 
    "Change", 
    each 
      let
        a = Table.AddColumn(FillDown, "Merge", each [#"Emp-Month"] & [Emp])[Merge], 
        b = List.PositionOf(a, [#"Emp-Month"] & [Emp]), 
        c = if b - 1 < 0 then 0 else b - 1, 
        d = FillDown[Sales]{c}, 
        e = if d = null then 0 else d, 
        f = Number.Abs([Sales] - e)
      in
        f
  ), 
  Max = Table.AddColumn(
    SalesChange, 
    "Max Sales Change", 
    each List.Max(Table.SelectRows(SalesChange, (x) => x[Emp] = [Emp])[Change])
  ), 
  FromTo = Table.AddColumn(
    Max, 
    "From_To", 
    each 
      if [Change] = [Max Sales Change] then
        Max[#"Emp-Month"]{List.Max({List.PositionOf(Max[#"Emp-Month"], [#"Emp-Month"]) - 1, 0})}
          & " - "
          & [#"Emp-Month"]
      else
        null
  ), 
  Group = Table.Group(
    FromTo, 
    {"Emp"}, 
    {
      {"Total Sales", each List.Sum([Sales])}, 
      {"Max Sales Change", each List.Max([Max Sales Change])}, 
      {"From - To Months", each Text.Combine([From_To])}
    }
  )
in
  Group
Power Query solution 4 for Max Monthly Sales Change, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Emp-Month", "Sales"}, 
    {
      "R", 
      each [
        TR = Table.ToRows(_), 
        L1 = List.RemoveLastN(List.Skip(TR), 1), 
        L2 = List.Skip(TR, 2), 
        Z = List.Zip({L1, L2}), 
        C = List.Transform(
          Z, 
          (f) => [
            Max Sales Change = Number.Abs(f{0}{1} - f{1}{1}), 
            From To Month    = f{0}{0} & " - " & f{1}{0}
          ]
        ), 
        M = List.Max(C, null, (f) => f[Max Sales Change]), 
        R = [E = Table.FirstValue(_), TS = List.Sum([Sales])] & M
      ][R]
    }, 
    0, 
    (x, y) => Number.From(y[Sales] = null)
  ), 
  Return = Table.FromRecords(Group[R])
in
  Return
Power Query solution 5 for Max Monthly Sales Change, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Emp-Month", "Sales"}, 
    {
      {"Total Sales", each List.Sum([Sales])}, 
      {
        "A", 
        each 
          let
            a = List.Transform(
              {1 .. List.Count([Sales])}, 
              (x) => Number.Abs([Sales]{x}? - [Sales]{x - 1})
            ), 
            b = List.PositionOf(a, List.Max(a)), 
            c = {
              List.Max(a), 
              let
                s = List.Skip([#"Emp-Month"]), 
                t = {s{b - 1}, s{b}}
              in
                Text.Combine(t, "-")
            }
          in
            Table.FromRows({c}, {"Max Sales Change", "From To Months"})
      }
    }, 
    0, 
    (x, y) => Number.From(y[Sales] = null)
  ), 
  Sol = Table.RenameColumns(
    Table.RemoveColumns(
      Table.ExpandTableColumn(Group, "A", Table.ColumnNames(Group[A]{0})), 
      "Sales"
    ), 
    {"Emp-Month", "Emp"}
  )
in
  Sol
Power Query solution 6 for Max Monthly Sales Change, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  add = Table.AddColumn(Fonte, "tb", each if [Sales] = null then [#"Emp-Month"] else null), 
  gp = Table.Group(
    add, 
    {"tb"}, 
    {
      {"Total Sales", each List.Sum([Sales])}, 
      {
        "calculo", 
        each 
          let
            t = Table.Split(Table.SelectRows(_, each [Sales] <> null), 2), 
            s = List.RemoveNulls(
              List.Transform(
                List.Transform(t, each _[Sales]), 
                (x) => Number.Abs(x{0} - x{1}? ?? null)
              )
            ), 
            max = List.Max(s), 
            p = List.PositionOf(s, max), 
            f = Text.Combine(t{p}[#"Emp-Month"], " - ")
          in
            Table.FromRows({{max, f}}, {"Max Sales Change", "From - To Months"})
      }
    }, 
    0, 
    (x, y) => Number.From(y[tb] <> null)
  ), 
  res = Table.ExpandTableColumn(gp, "calculo", Table.ColumnNames(gp[calculo]{0}))
in
  res
Power Query solution 7 for Max Monthly Sales Change, proposed by Hussein SATOUR:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  AddEmp = Table.AddColumn(Source, "Custom", each if [Sales] is null then [#"Emp-Month"] else null), 
  FillD = Table.FillDown(AddEmp, {"Custom"}), 
  FilterNull = Table.SelectRows(FillD, each ([Sales] <> null)), 
  Group = Table.Group(
    FilterNull, 
    {"Custom"}, 
    {{"Total", each List.Sum([Sales])}, {"All", each _, type table}}
  ), 
  AddCustom = Table.AddColumn(
    Group, 
    "Custom.1", 
    each 
      let
        a = Table.AddIndexColumn([All], "Ind"), 
        b = Table.AddColumn(
          a, 
          "Var", 
          each try Number.Abs([Sales] - a[Sales]{[Ind] - 1}) otherwise [Sales]
        ), 
        c = List.Max(b[Var]), 
        d = List.Max(Table.SelectRows(b, each ([Var] = c))[Ind]), 
        e = Table.SelectRows(b, each [Ind] = d or [Ind] = d - 1)
      in
        Text.Combine({Text.From(c), Text.Combine(e[#"Emp-Month"], "-")}, "/")
  ), 
  Split = Table.SplitColumn(
    AddCustom, 
    "Custom.1", 
    Splitter.SplitTextByDelimiter("/", QuoteStyle.Csv), 
    {"Max Change", "From - To"}
  ), 
  RemovCol = Table.RemoveColumns(Split, {"All"})
in
  RemovCol
Power Query solution 8 for Max Monthly Sales Change, proposed by Brian Julius:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  AddEmp = Table.SelectRows(
    Table.FillDown(
      Table.AddColumn(Source, "Emp", each if [Sales] = null then [#"Emp-Month"] else null), 
      {"Emp"}
    ), 
    each [Sales] <> null
  ), 
  AddIndex0 = Table.AddIndexColumn(AddEmp, "Index0", 0, 1), 
  AddIndex1 = Table.AddIndexColumn(AddIndex0, "Index1", 1, 1), 
  Join = Table.NestedJoin(AddIndex0, "Index0", AddIndex1, "Index1", "Prev"), 
  Expand = Table.ExpandTableColumn(
    Join, 
    "Prev", 
    {"Emp", "Emp-Month", "Sales"}, 
    {"Prev.Emp", "Prev.Emp-Month", "Prev.Sales"}
  ), 
  AddSalesChg = Table.AddColumn(Expand, "SalesChange", each Number.Abs([Sales] - [Prev.Sales])), 
  Group = Table.Group(
    AddSalesChg, 
    {"Emp"}, 
    {
      {"TotalSales", each List.Sum([Sales])}, 
      {"MaxSalesChang", each List.Max([SalesChange])}, 
      {"All", each _}
    }
  ), 
  ReExpand = Table.SelectRows(
    Table.ExpandTableColumn(
      Group, 
      "All", 
      {"Prev.Emp-Month", "Emp-Month", "SalesChange"}, 
      {"Prev.Emp-Month", "Emp-Month", "SalesChange"}
    ), 
    each [MaxSalesChang] = [SalesChange]
  ), 
  Merge = Table.RemoveColumns(
    Table.CombineColumns(
      ReExpand, 
      {"Prev.Emp-Month", "Emp-Month"}, 
      Combiner.CombineTextByDelimiter("-", QuoteStyle.None), 
      "From-To"
    ), 
    "SalesChange"
  )
in
  Merge
Power Query solution 9 for Max Monthly Sales Change, proposed by Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  A = Table.AddColumn, 
  T = Table.TransformColumns, 
  G = Table.Group, 
  a = Table.FillDown(A(S, "N", each if [Sales] = null then [#"Emp-Month"] else null), {"N"}), 
  b = G(Table.SelectRows(a, each [Sales] <> null), {"N"}, {"G", each _}), 
  c = T(b, {"G", each Table.AddIndexColumn(_, "I")}), 
  d = A(
    c, 
    "H", 
    each 
      let
        x = [G], 
        y = A(x, "S", each try x[Sales]{[I] - 1} otherwise null)
      in
        y
  ), 
  e = T(d, {"H", each A(_, "D", each Number.Abs([Sales] - [S]))}), 
  f = A(
    e, 
    "J", 
    each 
      let
        x = [H], 
        y = A(x, "M", each try x[#"Emp-Month"]{[I] - 1} otherwise null)
      in
        y
  ), 
  g = T(f, {"J", each A(_, "FT", each [M] & " - " & [#"Emp-Month"])[[N], [Sales], [D], [FT]]})[[J]], 
  h = G(
    Table.Combine(g[J]), 
    {"N"}, 
    {{"G", each List.Sum([Sales])}, {"H", each Table.MaxN(_, "D", 1)[[D], [FT]]}}
  ), 
  Sol = Table.RenameColumns(
    Table.ExpandTableColumn(h, "H", {"D", "FT"}), 
    {{"N", "Emp"}, {"G", "Total Sales"}, {"D", "Max Sales Change"}, {"FT", "From - To Months"}}
  )
in
  Sol
Power Query solution 10 for Max Monthly Sales Change, proposed by Eric Laforce:
let
  Source = Excel.CurrentWorkbook(){[Name = "tData180"]}[Content], 
  AddEmp = Table.FillDown(
    Table.AddColumn(Source, "Emp", each if [Sales] = null then [#"Emp-Month"] else null), 
    {"Emp"}
  ), 
  Group = Table.Group(
    AddEmp, 
    "Emp", 
    {
      "G", 
      each 
        let
          M = List.Skip([#"Emp-Month"]), 
          S = List.Skip([Sales]), 
          C = List.Transform(
            List.Zip({List.Skip(S), List.RemoveLastN(S)}), 
            each Number.Abs(_{1} - _{0})
          ), 
          MC = List.Max(C), 
          P = List.PositionOf(C, MC)
        in
          {[Emp]{0}, List.Sum(S), MC, M{P} & " - " & M{P + 1}}
    }
  ), 
  Result = Table.FromRows(Group[G], {"Emp", "Total Sales", "Max Sales CHange", "From - To Months"})
in
  Result
Power Query solution 11 for Max Monthly Sales Change, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  A = Table.AddColumn(S, "Emp", each if [Sales] = null then [#"Emp-Month"] else null), 
  B = Table.FillDown(A, {"Emp"}), 
  C = Table.RenameColumns(B, {{"Emp-Month", "Month"}}), 
  D = Table.SelectRows(C, each ([Sales] <> null)), 
  E = Table.Group(D, {"Emp"}, {{"T", each _}}), 
  G = Table.AddColumn(E, "T1", each Table.AddIndexColumn([T], "Ind", 1, 1)), 
  F = (TB) =>
    let
      A = Table.TransformColumnTypes(
        TB, 
        {{"Month", type text}, {"Sales", Int64.Type}, {"Emp", type text}, {"Ind", Int64.Type}}
      ), 
      B = Table.AddColumn(
        A, 
        "%Sales", 
        each try Number.Abs([Sales] - A[Sales]{[Ind] - 2}) otherwise null
      ), 
      C = Table.AddColumn(B, "FT", each try A[Month]{[Ind] - 2} & "-" & [Month] otherwise null), 
      D = Table.Sort(C, {{"%Sales", Order.Descending}}), 
      E = Table.AddIndexColumn(D, "Index", 1, 1, Int64.Type), 
      F = Table.SelectRows(E, each [Index] = 1), 
      G = Table.SelectColumns(F, {"Emp", "%Sales", "FT"})
    in
      G, 
  I = Table.AddColumn(G, "F", each F([T1])), 
  J = Table.AddColumn(I, "Total Sales", each List.Sum([T1][Sales])), 
  K = Table.SelectColumns(J, {"F", "Total Sales"}), 
  L = Table.ExpandTableColumn(K, "F", {"Emp", "%Sales", "FT"}, {"Emp", "%Sales", "FT"})
in
  L
Power Query solution 12 for Max Monthly Sales Change, proposed by Venkata Rajesh:
let
  Source = Data, 
  Emp = Table.AddColumn(Source, "Emp", each if [Sales] = null then [#"Emp-Month"] else null), 
  #"Filled Down" = Table.FillDown(Emp, {"Emp"}), 
  #"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([Sales] <> null)), 
  #"Added Index" = Table.AddIndexColumn(#"Filtered Rows", "Index", 1, 1, Int64.Type), 
  #"Sales Change" = Table.AddColumn(
    #"Added Index", 
    "Sales Change", 
    each try
      
        if [Emp] = #"Added Index"{[Index]}[Emp] then
          Number.Abs(#"Added Index"{[Index]}[Sales] - [Sales])
        else
          null
    otherwise
      null, 
    Int64.Type
  ), 
  #"Grouped Rows" = Table.Group(
    #"Sales Change", 
    {"Emp"}, 
    {
      {"Total Sales", each List.Sum([Sales]), type nullable number}, 
      {"Max Sales Change", each List.Max([Sales Change]), type nullable number}, 
      {
        "From - To Months", 
        each [
          MaxSales = List.Max([Sales Change]), 
          Index = Table.SelectRows(#"Sales Change", each [Sales Change] = MaxSales)[Index]{0}, 
          FromTo = #"Sales Change"{Index - 1}[#"Emp-Month"]
            & " - "
            & #"Sales Change"{Index}[#"Emp-Month"]
        ][FromTo]
      }
    }
  )
in
  #"Grouped Rows"
Power Query solution 13 for Max Monthly Sales Change, proposed by Kalyan Kumar Reddy Kethireddy:
let
  Source = ExcelBI_Sunday, 
  Emp = Table.AddColumn(Source, "Emp", each if [Sales] = null then [#"Emp-Month"] else null), 
  FilledDown = Table.FillDown(Emp, {"Emp"}), 
  #"Filtered Rows" = Table.SelectRows(FilledDown, each ([Sales] <> null)), 
  #"Added Index" = Table.AddIndexColumn(#"Filtered Rows", "Index", 0, 1, Int64.Type), 
  MaxSales = Table.AddColumn(
    #"Added Index", 
    "Max Sales Change", 
    each 
      let
        A = #"Added Index"[Sales]{[Index]}, 
        B = try #"Added Index"[Sales]{[Index] + 1} otherwise null
      in
        Number.Abs(A - B)
  ), 
  FromToMonth = Table.AddColumn(
    MaxSales, 
    "Custom", 
    each 
      let
        A = #"Added Index"[#"Emp-Month"]{[Index]}, 
        B = #"Added Index"[#"Emp-Month"]{[Index] + 1}
      in
        A & "-" & B
  ), 
  GroupedRows = Table.Group(
    FromToMonth, 
    {"Emp"}, 
    {
      {"Total Sales", each List.Sum([Sales]), type nullable number}, 
      {"Max Sales Change", each List.Max([Max Sales Change]), type nullable number}, 
      {"From To Months", each Table.Max(_, "Max Sales Change")[Custom]}
    }
  )
in
  GroupedRows

Solving the challenge of Max Monthly Sales Change with Excel

Excel solution 1 for Max Monthly Sales Change, proposed by Bo Rydobon 🇹🇭:
=LET(m,A2:A28,s,B2:B28,e,SCAN(0,s,LAMBDA(a,v,IF(v,a,@+A28:v))),
REDUCE(D1:G1,UNIQUE(e),LAMBDA(a,v,LET(y,e=v,d,y*ABS(s-DROP(VSTACK(s,0),1)),
VSTACK(a,HSTACK(v,SUM(y*s),MAX(d),XLOOKUP(MAX(d),d,m&" - "&DROP(m,1))))))))
Excel solution 2 for Max Monthly Sales Change, proposed by محمد حلمي:
=LET(e,SCAN(0,B2:B28=0,LAMBDA(a,v,a+v)),
REDUCE(D1:G1,UNIQUE(e),LAMBDA(a,v,LET(&
i,FILTER(A2:B28,e=v),x,ABS(DROP(i,1,1)-DROP(i,-1,1)),
m,MAX(x),VSTACK(a,HSTACK(@i,SUM(i),m,
TEXTJOIN(" - ",,INDEX(i,XMATCH(m,x)+{0,1}))))))))
Excel solution 3 for Max Monthly Sales Change, proposed by Kris Jaganah:
=LET(a,A2:A28,b,B2:B28,c,SCAN(,IF(b="",a,""),LAMBDA(x,y,IF(y="",x,y))),d,IF(b="",0,ABS(VSTACK(DROP(b,1),0)-b)),e,IF(MAP(c,LAMBDA(x,MAX(d*(c=x))))=d,a&"-"&VSTACK(DROP(a,1),""),""),VSTACK({"Emp","Total Sales","Max Sales Change","From - To Months"},DROP(GROUPBY(C2:C28,HSTACK(b,d,e),HSTACK(SUM,MAX,CONCAT),,0),1)))
Excel solution 4 for Max Monthly Sales Change, proposed by Julian Poeltl:
=LET(T,A2:B28,M,TAKE(T,,1),S,TAKE(T,,-1),Nr,SCAN(0,S=0,LAMBDA(A,B,A+B)),N,FILTER(M,S=0),TS,MAP(SEQUENCE(MAX(Nr)),LAMBDA(A,SUM(FILTER(S,Nr=A)))),Ch,IFERROR(ABS(S-DROP(S,1)),0),MSC,MAP(SEQUENCE(MAX(Nr)),LAMBDA(A,MAX(FILTER(Ch,Nr=A)))),FT,XLOOKUP(MSC,Ch,M)&" - "&INDEX(M,XMATCH(MSC,Ch)+1),VSTACK(HSTACK("Emp","Total Sales","Max Sales Change","From - To Months"),HSTACK(N,TS,MSC,FT)))
Excel solution 5 for Max Monthly Sales Change, proposed by Sunny Baggu:
=LET(
 _em, A2:A28,
 _sa, B2:B28,
 _e, TOCOL(IF(_sa = "", _em, x), 3),
 _ef, SCAN("", IF(_sa = "", _em, ""), LAMBDA(a, v, IF(v = "", a, v))),
 MAKEARRAY(
 ROWS(_e),
 4,
 LAMBDA(r, c,
 INDEX(
 LET(
 r, INDEX(_e, r, ),
 _t1, FILTER(A2:B28, _ef = r),
 _s, VSTACK(-1, ABS(DROP(TAKE(_t1, , -1), 1) - DROP(TAKE(_t1, , -1), -1))),
 _ms, MAX(_s),
 _ft, TEXTJOIN("-", , INDEX(TAKE(_t1, , 1), XMATCH(_ms, _s) + {-1; 0})),
 HSTACK(r, SUM(TAKE(_t1, , -1)), _ms, _ft)
 ),
 c
 )
 )
 )
)
Excel solution 6 for Max Monthly Sales Change, proposed by LEONARD OCHEA 🇷🇴:
=LET(e,A2:A28,s,B2:B28,n,SCAN(,e,LAMBDA(a,b,IF(ISNUMBER(--(1&"/"&b)),a,b))),d,IF(s,ABS(VSTACK(0,DROP(s,-1))-s),),g,DROP(GROUPBY(n,HSTACK(s,d),HSTACK(SUM,MAX),,0),1),i,XMATCH(TAKE(g,,-1),d),VSTACK(D1:G1,HSTACK(g,INDEX(e,i-1)&" - "&INDEX(e,i))))


2️⃣  With identification of empty space in sales column

=LET(e,A2:A28,s,B2:B28,n,SCAN("",B2:B28,LAMBDA(a,b,IF(b,a,OFFSET(b,,-1)))),d,IF(s,ABS(VSTACK(0,DROP(s,-1))-s),),g,DROP(GROUPBY(n,HSTACK(s,d),HSTACK(SUM,MAX),,0),1),i,XMATCH(TAKE(g,,-1),d),VSTACK(D1:G1,HSTACK(g,INDEX(e,i-1)&" - "&INDEX(e,i))))
Excel solution 7 for Max Monthly Sales Change, proposed by 🇵🇪 Ned Navarrete C.:
=LET(m,SCAN(0,B2:B28="",LAMBDA(c,v,c+v)),REDUCE(E1:H1,UNIQUE(m),LAMBDA(c,v,LET(t,FILTER(A2:B28,m=v),s,DROP(t,1,1),p,ABS(s-DROP(s,1)),x,MAX(TOCOL(p,2)),i,XMATCH(x,p)+1,VSTACK(c,HSTACK(@t,SUM(t),x,INDEX(t,i,1)&" - "&INDEX(t,i+1,1)))))))
Excel solution 8 for Max Monthly Sales Change, proposed by Md. Zohurul Islam:
=LET(u,A2:B28,v,TAKE(u,,1),w,TEXT(DATE(2025,SEQUENCE(,12),1),"mmm"),a,ABS(BYROW(v=w,OR)),b,IF(a=0,v,""),c,SCAN(,b,LAMBDA(x,y,IF(y="",x,y))),hdr,HSTACK("Emp","Total Sales","Max Sales Change","From - To Months"),d,REDUCE(hdr,UNIQUE(c),LAMBDA(x,y,LET(
g,DROP(FILTER(u,c=y),1),h,DROP(g,,1),s,ABS(VSTACK(0,DROP(h,1)-DROP(h,-1))),i,SUM(h),j,MAX(s),k,MATCH(j,s,0),m,TAKE(g,,1),n,INDEX(m,k-1)&" - "&INDEX(m,k),p,HSTACK(y,i,j,n),q,VSTACK(x,p),q))),d)
Excel solution 9 for Max Monthly Sales Change, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=HSTACK(LET(a,IFERROR(INDEX(A1:A28,IF(B2:B28="",ROW(B2:B28),"")),""),FILTER(a,a<>"")),LET(n,COUNTA(A2:A28),m,LET(b,IF(B2:B28="",ROW(B2:B28),""),FILTER(b,b<>"")),HSTACK(MAP(DROP(VSTACK(m,n+1),-1)+1,DROP(VSTACK(m-1,n+1),1),LAMBDA(x,y,SUM(INDEX(B:B,ROW(INDIRECT("B"&x&":"&"B"&y)))))),TEXTSPLIT(TEXTJOIN(,,MAP(DROP(VSTACK(m,n+1),-1)+1,DROP(VSTACK(m-1,n+1),1),LAMBDA(x,y,TEXTJOIN(",",,LET(h,INDEX(B:B,ROW(INDIRECT("B"&x&":"&"B"&y))),j,INDEX(A:A,ROW(INDIRECT("B"&x&":"&"B"&y))),p,h-VSTACK(DROP(h,1),0),o,ABS(p),HSTACK(MAX(ABS(p)),LET(a,MAX(ABS(p)),TEXTJOIN("-",,INDEX(j,HSTACK(MATCH(a,o,0),MATCH(a,o,0)+1)))))))))&"/"),",","/",TRUE))))
Excel solution 10 for Max Monthly Sales Change, proposed by Rayan S.:
=LET(
 m, A2:A28,
 n, B2:B28,
 nn, IF(n = 0, m, NA()),
 Un, SCAN("", nn, LAMBDA(x, y, IF(ISERROR(y), x, y))),
 d, ABS(IFERROR(n - DROP(n, 1), 0)),
 TS, MAP(UNIQUE(Un), LAMBDA(x, SUM(FILTER(n, Un = x)))),
 MSC, MAP(UNIQUE(Un), LAMBDA(x, MAX(FILTER(d, Un = x)))),
 FTM, MAP(MSC, LAMBDA(x, FILTER(m, d = x))),
 HSTACK(
 UNIQUE(Un),
 TS,
 MSC,
 FTM & " - " & XLOOKUP(FTM, m, VSTACK(DROP(m, 1), ""))
 )
)
Excel solution 11 for Max Monthly Sales Change, proposed by Burhan Cesur:
=LET(q,A2:A28,b,B2:B28,y,SCAN(0,B2:B28,LAMBDA(x,y,IF(y="",OFFSET(y,,-1,1,1),x))),
f,FILTER(A2:A28,b=""),REDUCE(D1:G1,f,LAMBDA(s,v,
LET(a,FILTER(b,y=v),t,SUM(a),m,ABS(a-DROP(VSTACK(a,0),1)),mx,MAX(m),fm,XLOOKUP(mx,m,FILTER(q,y=v)&" - "&DROP(FILTER(q,y=v),1)),VSTACK(s,HSTACK(v,t,mx,fm))))))
Excel solution 12 for Max Monthly Sales Change, proposed by Anil Kumar Goyal:
= case_match(sales, NA ~ emp_month)) %>% 
 fill(emp, .direction = "down") %>% 
 na.omit() %>% 
 reframe(
 total_sales = sum(sales),
 sales_change = abs(diff(c(NA, sales))),
 from_to_month = paste(lag(emp_month), 
 emp_month, 
 sep = " - "),
 .by = emp
 ) %>% 
 summarise(
 total_sales = max(total_sales),
 max_sales_change = max(sales_change, na.rm = TRUE),
 from_to_month = from_to_month[which.max(sales_change)],
 .by = emp
 )

Solving the challenge of Max Monthly Sales Change with Python

Python solution 1 for Max Monthly Sales Change, proposed by Konrad Gryczan, PhD:
import pandas as pd
input = pd.read_excel("PQ_Challenge_180.xlsx", sheet_name="Sheet1", usecols="A:B")
test = pd.read_excel("PQ_Challenge_180.xlsx", sheet_name="Sheet1", usecols="D:G", nrows=3)
input["Emp"] = input["Emp-Month"].where(input["Sales"].isnull()).ffill()
input = input.dropna(subset=["Sales"]).astype({"Sales": "int64"})
input["Total"] = input.groupby("Emp")["Sales"].transform("sum")
input[["Prev", "Prev_month"]] = input.groupby("Emp")[["Sales", "Emp-Month"]].shift(1)
input["Diff"] = abs(input["Sales"] - input["Prev"]).fillna(0).astype("int64")
input = input.loc[input.groupby("Emp")["Diff"].idxmax()]
input["From - To Months"] = input["Prev_month"] + " - " + input["Emp-Month"]
input = input.drop(columns=["Prev", "Prev_month", "Sales", "Emp-Month"]).reset_index(drop=True)
input.columns = test.columns
print(input.equals(test))
# True
                    
                  
Python solution 2 for Max Monthly Sales Change, proposed by Luan Rodrigues:
PY Solution
import pandas as pd
import numpy as np
df = pd.read_excel('PY/PQ_Challenge_180/PQ_Challenge_180.xlsx',usecols="A:B")
df['tab'] = df.apply(lambda x: x['Emp-Month'] if pd.isna(x['Sales']) else np.nan, axis=1).ffill()
df['Sales_abaixo'] = df['Sales'].shift(1)
df['Sales_abaixo'] = df['Sales_abaixo'].where(df['Sales_abaixo'].notna(), None)
df['Mes_abaixo'] = df['Emp-Month'].shift(1)
df['Mes_abaixo'] = df['Mes_abaixo'].where(df['Sales'].notna(), df['Emp-Month'])
df['dif'] = abs(df['Sales'] - df['Sales_abaixo'])
df['Mes-Concat'] = df['Mes_abaixo'] +' - '+ df['Emp-Month']
df_gp = df.groupby('tab').agg({'Sales':'sum','dif':'max'}).reset_index()
df_merge = df_gp.merge(df,left_on=['tab','dif'],right_on=['tab','dif'],how='inner')
df_merge = df_merge[['tab','Sales_x','dif','Mes-Concat']]
df_merge.columns = [['Emp-Month','Total Sales','Max Sales Change','From - To Months']]
print(df_merge)
                    
                  

Solving the challenge of Max Monthly Sales Change with Python in Excel

Python in Excel solution 1 for Max Monthly Sales Change, proposed by Abdallah Ally:
import pandas as pd
file_path = 'PQ_Challenge_180.xlsx'
df = pd.read_excel(file_path, usecols='A:B')
# Perform data transformation and cleansing
df['Emp'] = df['Emp-Month'].where(cond=pd.isnull(df['Sales']), other=float('nan')).ffill()
df = df.dropna(subset='Sales').reset_index(drop=True)
df['Order'] = df.groupby('Emp').cumcount()
df['Sales Change'] = (df['Sales'] - df['Sales'].shift(1)).where(df['Order'] > 0, float('nan')).abs()
df['From - To Months'] = (df['Emp-Month'].shift(1) + ' - ' + df['Emp-Month']).where(df['Order'] > 0, float('nan'))
df['Total Sales'] = df.groupby('Emp')['Sales'].transform('sum').astype(int)
df['Max Sales Change'] = df.groupby('Emp')['Sales Change'].transform('max').astype(int)
df = df[df['Sales Change'] == df['Max Sales Change']]
df = df.iloc[:, [2, 6, 7, 5]].reset_index(drop=True)
df
                    
                  

Solving the challenge of Max Monthly Sales Change with R

R solution 1 for Max Monthly Sales Change, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
input = read_excel("Power Query/PQ_Challenge_180.xlsx", range = "A1:B28")
test = read_excel("Power Query/PQ_Challenge_180.xlsx", range = "D1:G4")
result = input %>%
 mutate(Emp = ifelse(is.na(Sales), `Emp-Month`, NA_character_)) %>%
 fill(Emp) %>%
 filter(!is.na(Sales)) %>%
 mutate(lag_sales = lag(Sales, 1, default = 0),
 lag_month = lag(`Emp-Month`, 1, default = ""),
 total = sum(Sales), 
 change = abs(lag_sales - Sales),
 max_change = max(change),
 .by = Emp) %>%
 filter(change == max_change) %>%
 select(Emp, `Total Sales` = total, `Max Sales Change` = max_change, lag_month, `Emp-Month`) %>%
 unite("From - To Months", lag_month, `Emp-Month`, sep = " - ")
                    
                  
R solution 2 for Max Monthly Sales Change, proposed by Anil Kumar Goyal:
df <- read_xlsx("PQ/PQ_Challenge_180.xlsx", range = cell_cols(LETTERS[1:2])) %>% 
 clean_names()
df %>% 
 mutate(emp = case_match(sales, NA ~ emp_month)) %>% 
 fill(emp, .direction = "down") %>% 
 na.omit() %>% 
 summarise(
 total_sales = sum(sales),
 max_sales_change = max(abs(diff(c(NA, sales))), na.rm = TRUE),
 from_to_month = paste(lag(emp_month), 
 emp_month, 
 sep = " - ")[coalesce(abs(diff(c(NA, sales))) == 
 max(abs(diff(c(NA, sales))), na.rm = TRUE), FALSE)],
 .by = emp
 )
                    
                  

&&

Leave a Reply