SOLVED

SUM not working with result from Lambda helper fn.

%3CLINGO-SUB%20id%3D%22lingo-sub-3189569%22%20slang%3D%22en-US%22%3ESUM%20not%20working%20with%20result%20from%20Lambda%20helper%20fn.%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3189569%22%20slang%3D%22en-US%22%3E%3CP%3EI%20picked%20up%20a%20banded%20commission%20problem%20from%20another%20forum%20and%20tried%20to%20apply%20routines%20I%20had%20written%20for%20FIFO%20allocation.%26nbsp%3B%20It%20may%20have%20been%20a%20sledgehammer%20to%20crack%20an%20awkwardly%20shaped%20nut%2C%20but%20the%20Lambda%20function%20produced%20a%20list%20of%20commissions%20payable%20on%20each%20service%20without%20difficulty.%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20OP%20was%20only%20interested%20in%20the%20total%20commission%20payable%20to%20the%20employee%20so%20I%20applied%20SUM%20to%20the%20result%20...%20%2C%20and%20got%20zero!%26nbsp%3B%20Using%20REDUCE%20to%20sum%20the%20commission%20worked.%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-excel-formula%22%3E%3CCODE%3E%22Fail%22%0A%3D%20LET(%0A%20%20commission%2C%20Allocate%CE%BB(salesAmount%2CBands%2C%20Rate)%2C%0A%20%20SUM(commission))%0A%0A%22Success%22%0A%3D%20LET(%0A%20%20commission%2C%20Allocate%CE%BB(salesAmount%2CBands%2C%20Rate)%2C%0A%20%20REDUCE(0%2Ccommission%2CAdd%CE%BB))%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3EAny%20ideas%3F%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22image.png%22%20style%3D%22width%3A%20433px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F349757i7901BD9A9847BF6E%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22image.png%22%20alt%3D%22image.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-3189569%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EExcel%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EFormulas%20and%20Functions%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EOffice%20365%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3189608%22%20slang%3D%22en-US%22%3ERe%3A%20SUM%20not%20working%20with%20result%20from%20Lambda%20helper%20fn.%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3189608%22%20slang%3D%22en-US%22%3E%3CP%3EFor%20what%20it%20is%20worth%2C%20these%20are%20the%20other%20named%20formulae%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-excel-formula%22%3E%3CCODE%3EAccumulate%CE%BB%20%3D%20LAMBDA(arr%2C%20%5Binit%5D%2C%20%5Bopening%5D%2C%0A%20%20%20%20LET(%0A%20%20%20%20%20%20%20%20acc%2C%20SCAN(init%2C%20arr%2C%20Add%CE%BB)%2C%0A%20%20%20%20%20%20%20%20open%2C%20IF(ISOMITTED(opening)%2C%201%2C%20opening)%2C%0A%20%20%20%20%20%20%20%20accumulated%2C%20IF(open%2C%20acc%2C%20acc%20-%20arr)%2C%0A%20%20%20%20%20%20%20%20accumulated%0A%20%20%20%20)%0A)%3B%0A%0AAdd%CE%BB%20%3D%20LAMBDA(x%2C%20y%2C%20(x%20%2B%20y))%3B%0A%0AAllocate%CE%BB%20%3D%20LAMBDA(outputArray%2C%20inputArray%2C%20%5Bweight%5D%2C%0A%20%20%20%20LET(%0A%20%20%20%20%20%20%20%20cumulativeOutput%2C%20Accumulate%CE%BB(outputArray%2C%200%2C%20%7B0%2C%201%7D)%2C%0A%20%20%20%20%20%20%20%20cumulativeInput%2C%20Accumulate%CE%BB(inputArray%2C%200%2C%20%7B0%2C%201%7D)%2C%0A%20%20%20%20%20%20%20%20m%2C%20ROWS(outputArray)%2C%0A%20%20%20%20%20%20%20%20n%2C%20ROWS(inputArray)%2C%0A%20%20%20%20%20%20%20%20allocationArray%2C%20MAKEARRAY(%0A%20%20%20%20%20%20%20%20%20%20%20%20m%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20LAMBDA(k%2C%20h%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20LET(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20u%2C%20%7B-1%2C%201%7D%20*%20INDEX(cumulativeOutput%2C%20k%2C%20%7B1%2C%202%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%2C%20%7B-1%2C%201%7D%20*%20INDEX(cumulativeInput%2C%20h%2C%20%7B1%2C%202%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20d%2C%20SUM(IF(u%20%26lt%3B%20v%2C%20u%2C%20v))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20q%2C%20IF(d%20%26gt%3B%200%2C%20d%2C%200)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20w%2C%20IF(ISOMITTED(weight)%2C%201%2C%20INDEX(weight%2C%20h))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20q%20*%20w%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20IF(ISOMITTED(weight)%2C%20allocationArray%2C%20BYROW(allocationArray%2C%20Sum%CE%BB))%0A%20%20%20%20)%0A)%3B%0A%0ADiff%CE%BB%20%3D%20LAMBDA(s%2C%20%5Bs0%5D%2C%20%5Bd%5D%2C%0A%20%20%20%20MAKEARRAY(%0A%20%20%20%20%20%20%20%20ROWS(s)%2C%0A%20%20%20%20%20%20%20%20COLUMNS(s)%2C%0A%20%20%20%20%20%20%20%20LAMBDA(k%2C%20h%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20LET(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20a%2C%20INDEX(s%2C%20k%2C%20h)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%2C%20IF(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20d%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IF(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20h%20%26gt%3B%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20INDEX(s%2C%20k%2C%20h%20-%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IF(TYPE(s0)%20%3D%2064%2C%20INDEX(s0%2C%20k)%2C%20s0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IF(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k%20%26gt%3B%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20INDEX(s%2C%20k%20-%201%2C%20h)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IF(TYPE(s0)%20%3D%2064%2C%20INDEX(s0%2C%20h)%2C%20s0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20a%20-%20b%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A)%3B%0A%0AExpand%CE%BB%20%3D%20LAMBDA(row%CF%91%2C%0A%20%20%20%20LET(%0A%20%20%20%20%20%20%20%20n%E2%82%81%2C%20ROWS(INDEX(row%CF%91%2C%201)())%2C%0A%20%20%20%20%20%20%20%20n%E2%82%82%2C%20COLUMNS(row%CF%91)%2C%0A%20%20%20%20%20%20%20%20result%2C%20MAKEARRAY(%0A%20%20%20%20%20%20%20%20%20%20%20%20n%E2%82%81%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n%E2%82%82%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20LAMBDA(i%E2%82%81%2C%20i%E2%82%82%2C%20INDEX(INDEX(row%CF%91%2C%201%2C%20i%E2%82%82)()%2C%20i%E2%82%81))%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20result%0A%20%20%20%20)%0A)%3B%0A%0A%0ASum%CE%BB%20%3D%20LAMBDA(x%2C%20SUM(x))%3B%0A%0AThunkByCol%CE%BB%20%3D%20LAMBDA(array%2C%20BYCOL(array%2C%20Thunk%CE%BB))%3B%0A%0AThunk%CE%BB%20%3D%20LAMBDA(x%2C%20LAMBDA(x))%3B%3C%2FCODE%3E%3C%2FPRE%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3189944%22%20slang%3D%22en-US%22%3ERe%3A%20SUM%20not%20working%20with%20result%20from%20Lambda%20helper%20fn.%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3189944%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F214174%22%20target%3D%22_blank%22%3E%40Peter%20Bartholomew%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EThis%20one%20works%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-excel-formula%22%3E%3CCODE%3E%3D%20LET(%0A%20%20%20commission%2C%20Allocate%CE%BB(%2BsalesAmount%2CBands%2C%20Rate)%2C%0A%20%20%20SUM(commission))%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3EThe%20difference%20is%20in%20%3CFONT%20color%3D%22%23DF0000%22%3E%3CSTRONG%3E%2B%3C%2FSTRONG%3E%3C%2FFONT%3EsalesAmount%20.%20Auto-lifting%20not%20always%20works.%3C%2FP%3E%3C%2FLINGO-BODY%3E
Trusted Contributor

I picked up a banded commission problem from another forum and tried to apply routines I had written for FIFO allocation.  It may have been a sledgehammer to crack an awkwardly shaped nut, but the Lambda function produced a list of commissions payable on each service without difficulty. 

The OP was only interested in the total commission payable to the employee so I applied SUM to the result ... , and got zero!  Using REDUCE to sum the commission worked. 

"Fail"
= LET(
  commission, Allocateλ(salesAmount,Bands, Rate),
  SUM(commission))

"Success"
= LET(
  commission, Allocateλ(salesAmount,Bands, Rate),
  REDUCE(0,commission,Addλ))

Any ideas?

image.png

3 Replies

For what it is worth, these are the other named formulae

Accumulateλ = LAMBDA(arr, [init], [opening],
    LET(
        acc, SCAN(init, arr, Addλ),
        open, IF(ISOMITTED(opening), 1, opening),
        accumulated, IF(open, acc, acc - arr),
        accumulated
    )
);

Addλ = LAMBDA(x, y, (x + y));

Allocateλ = LAMBDA(outputArray, inputArray, [weight],
    LET(
        cumulativeOutput, Accumulateλ(outputArray, 0, {0, 1}),
        cumulativeInput, Accumulateλ(inputArray, 0, {0, 1}),
        m, ROWS(outputArray),
        n, ROWS(inputArray),
        allocationArray, MAKEARRAY(
            m,
            n,
            LAMBDA(k, h,
                LET(
                    u, {-1, 1} * INDEX(cumulativeOutput, k, {1, 2}),
                    v, {-1, 1} * INDEX(cumulativeInput, h, {1, 2}),
                    d, SUM(IF(u < v, u, v)),
                    q, IF(d > 0, d, 0),
                    w, IF(ISOMITTED(weight), 1, INDEX(weight, h)),
                    q * w
                )
            )
        ),
        IF(ISOMITTED(weight), allocationArray, BYROW(allocationArray, Sumλ))
    )
);

Diffλ = LAMBDA(s, [s0], [d],
    MAKEARRAY(
        ROWS(s),
        COLUMNS(s),
        LAMBDA(k, h,
            LET(
                a, INDEX(s, k, h),
                b, IF(
                    d,
                    IF(
                        h > 1,
                        INDEX(s, k, h - 1),
                        IF(TYPE(s0) = 64, INDEX(s0, k), s0)
                    ),
                    IF(
                        k > 1,
                        INDEX(s, k - 1, h),
                        IF(TYPE(s0) = 64, INDEX(s0, h), s0)
                    )
                ),
                a - b
            )
        )
    )
);

Expandλ = LAMBDA(rowϑ,
    LET(
        n₁, ROWS(INDEX(rowϑ, 1)()),
        n₂, COLUMNS(rowϑ),
        result, MAKEARRAY(
            n₁,
            n₂,
            LAMBDA(i₁, i₂, INDEX(INDEX(rowϑ, 1, i₂)(), i₁))
        ),
        result
    )
);


Sumλ = LAMBDA(x, SUM(x));

ThunkByColλ = LAMBDA(array, BYCOL(array, Thunkλ));

Thunkλ = LAMBDA(x, LAMBDA(x));
best response confirmed by Peter Bartholomew (Trusted Contributor)
Solution

@Peter Bartholomew 

This one works

= LET(
   commission, Allocateλ(+salesAmount,Bands, Rate),
   SUM(commission))

The difference is in +salesAmount . Auto-lifting not always works.

@Sergei Baklan 

Thank you for that suggestion.  The use of REDUCE did appear as overkill and was difficult to justify.  The '+' is far neater and it appears to work used preceding any of the 3 parameters or even outside the Allocateλ function.

= SUM(+Allocateλ(salesAmount,Bands,Rate))

 Now I just have to hope that someone contributes a more standard approach on the Chandoo forum, otherwise I may feel obliged to actually assist!