Forum Discussion

brunomerola's avatar
brunomerola
Brass Contributor
Aug 29, 2022

Tabular Pivot Table with Excel Lambda and new array functions

Hello everyone,

 

I've been learning and practicing Lambda helper functions for the last few months and I'm amazed by advanced techniques, especially with those that handle arrays of arrays - PeterBartholomew1's thunks  and SergeiBaklan's magic solution DROP/REDUCE/VSTACK.

 

I need a little help with a problem that seems simpler than that.

 

How can we replicate a tabular pivot table using Excel's new set of functions in the most efficient way and one single formula?

 

I have attached a simple example containing two columns of hierarchized categories and one of values that must be added up.

 

Thanks in advance!

 

  • brunomerola 

    This might explain my hesitance getting involved with issues of layout!

    = LET(
        wildcards,      IFNA(HSTACK(UNIQUE(Data[Class]), "*"),"*"),
        distinct,       SORT(VSTACK(wildcards, UNIQUE(Data[[Class]:[Category]])),{1,2}),
        class,          CHOOSECOLS(distinct,1),
        category,       CHOOSECOLS(distinct,2),
        sumValue,       SUMIFS(Data[Value], Data[Class], class, Data[Category], category),
        outputClass,    IF(category="*", class, ""),
        outputCategory, IF(category<>"*", category, ""),
        output,         HSTACK(outputClass, outputCategory, sumValue),
        totalrow,       HSTACK("Total", "", SUM(Data[Value])),
        VSTACK(output, totalrow) 
     )

  • brunomerola 

    This is intended as a 'starter for one' to allow for further refinement.  Because your data is hierarchical and the Category starts the class as its first character, it is only necessary to work with the category.

    The basic ways of getting conditional sums are to use SUMIFS over the source data or to FILTER the data and sum each category.

    = LET(
        category, SORT(UNIQUE(Data[Category])),
        sumValue, SUMIFS(Data[Value], Data[Category], category),
        HSTACK(category, sumValue)
      )

    Alternatively

    = LET(
        category, SORT(UNIQUE(Data[Category])),
        sumValue, MAP(category, LAMBDA(cat,
          SUM(FILTER(Data[Value], Data[Category]= cat)))
        ),
        HSTACK(category, sumValue)
      )

    Many refinements are possible but it is up to you to decide what is important.  For example interlacing subtotals presents a bit of a challenge but may not be needed.

     

    • brunomerola's avatar
      brunomerola
      Brass Contributor
      Thank you very much for the quick response, but how can we actually interlace class and subtotals and sort each group of categories inside each class?

      The example has categories that start with the class letter, but this will not be the case in my real case application.
      • PeterBartholomew1's avatar
        PeterBartholomew1
        Silver Contributor

        brunomerola 

        This might explain my hesitance getting involved with issues of layout!

        = LET(
            wildcards,      IFNA(HSTACK(UNIQUE(Data[Class]), "*"),"*"),
            distinct,       SORT(VSTACK(wildcards, UNIQUE(Data[[Class]:[Category]])),{1,2}),
            class,          CHOOSECOLS(distinct,1),
            category,       CHOOSECOLS(distinct,2),
            sumValue,       SUMIFS(Data[Value], Data[Class], class, Data[Category], category),
            outputClass,    IF(category="*", class, ""),
            outputCategory, IF(category<>"*", category, ""),
            output,         HSTACK(outputClass, outputCategory, sumValue),
            totalrow,       HSTACK("Total", "", SUM(Data[Value])),
            VSTACK(output, totalrow) 
         )

Resources