#### Table of Contents

Excel offers many possibilities for analyzing and preparing table data. Especially with larger amounts of data, it is often helpful to group and sort the data according to certain criteria to get a better overview.

In my daily work with Excel, I often encounter situations where I need to clearly present and evaluate data. The standard functions are not always sufficient for this. Especially when the grouped data should be displayed below each other on a worksheet, you quickly reach limits with built-in tools like pivot tables or the Power Query Editor.

Thatās why I looked for a solution to flexibly group table data with formulas. The data should be dynamically summarized based on the values in the first column. Within the groups, you should be able to sort the rows individually.

Perhaps this task will become easier with the introduction of the GROUPBY function. However, this formula is only available in the beta channel of Excel.

After some research, I came across an interesting solution on Reddit that served as a starting point. I adapted the formula and now want to share it here on my blog.

In the following, I show how the formula is structured and which Excel functions are used. Using a practical example, I explain how to apply the formula.

## Requirements

- Microsoft 365 (Amazon Affiliate-Link)

## Source Table

The formula should group the data from a table (or range) based on the first column.

Letās assume we have the following table:

Kaffeesorte | Herkunft | RĆ¶stgrad | Preis/kg | Bewertung |
---|---|---|---|---|

Arabica | Kolumbien | mittel | 28,00 ā¬ | 4,5 |

Robusta | Vietnam | dunkel | 18,00 ā¬ | 3,8 |

Arabica | Ćthiopien | hell | 32,00 ā¬ | 4,8 |

Liberica | Philippinen | mittel | 24,00 ā¬ | 4,2 |

Arabica | Brasilien | mittel | 26,00 ā¬ | 4,4 |

Robusta | Indonesien | dunkel | 20,00 ā¬ | 4,0 |

Arabica | Kenia | hell | 30,00 ā¬ | 4,7 |

Excelsa | SĆ¼dostasien | dunkel | 22,00 ā¬ | 4,1 |

Arabica | Guatemala | mittel | 29,00 ā¬ | 4,6 |

Robusta | Uganda | mittel | 19,00 ā¬ | 3,9 |

Arabica | Costa Rica | hell | 31,00 ā¬ | 4,9 |

Liberica | Malaysia | dunkel | 23,00 ā¬ | 4,3 |

Arabica | Jamaika | mittel | 35,00 ā¬ | 5,0 |

## Goal

The formula should group the data by coffee type. Within the groups, the rows are sorted individually. The result should look something like this:

Kaffeesorte | |||
---|---|---|---|

Arabica | |||

Herkunft | RĆ¶stgrad | Preis/kg | Bewertung |

Jamaika | mittel | 35,00 ā¬ | 5,0 |

Costa Rica | hell | 31,00 ā¬ | 4,9 |

Ćthiopien | hell | 32,00 ā¬ | 4,8 |

Kenia | hell | 30,00 ā¬ | 4,7 |

Guatemala | mittel | 29,00 ā¬ | 4,6 |

Kolumbien | mittel | 28,00 ā¬ | 4,5 |

Brasilien | mittel | 26,00 ā¬ | 4,4 |

Robusta | |||

Herkunft | RĆ¶stgrad | Preis/kg | Bewertung |

Indonesien | dunkel | 20,00 ā¬ | 4,0 |

Uganda | mittel | 19,00 ā¬ | 3,9 |

Vietnam | dunkel | 18,00 ā¬ | 3,8 |

Liberica | |||

Herkunft | RĆ¶stgrad | Preis/kg | Bewertung |

Malaysia | dunkel | 23,00 ā¬ | 4,3 |

Philippinen | mittel | 24,00 ā¬ | 4,2 |

Excelsa | |||

Herkunft | RĆ¶stgrad | Preis/kg | Bewertung |

SĆ¼dostasien | dunkel | 22,00 ā¬ | 4,1 |

## Explanation of Used Excel Functions

To achieve this, several formulas are needed.

### UNIQUE

Returns a list of the unique values in a range or array.

```
=UNIQUE(A1:A10)
```

Returns a list of unique values from the range A1:A10.

A |
---|

Apple |

Pear |

Apple |

Banana |

Pear |

Result:

Unique Values |
---|

Apple |

Pear |

Banana |

### SWITCH

Compares a value to a list of values and returns the first result that matches the condition.

```
=SWITCH(A1=1,"Yes",A1=0,"No",TRUE,"Unknown")
```

Compares the value in A1 to 1 and returns āYesā if equal, āNoā if 0, and āUnknownā for all other values.

### FILTER

Filters an array based on a condition and returns the resulting array.

```
=FILTER(A1:A5,A1:A5>3)
```

Returns all values in the range A1:A5 that are greater than 3.

A |
---|

1 |

5 |

2 |

7 |

3 |

Result:

Filtered Values |
---|

5 |

7 |

### LAMBDA

Defines a named function that can be used in other formulas.

```
=LAMBDA(x, x * 2)(5)
```

Defines a function that multiplies the argument x by 2 and returns the result for x=5 (10).

### LET

Defines a function that multiplies the argument x by 2 and returns the result for x=5 (10).

```
=LET(x, 5, y, 10, x+y)
```

Result: 15. The variables x and y are defined within the LET function and can be used in the calculation.

### INDEX

Returns a value or reference to a value at a specific position in a range or array.

```
=INDEX(A1:C5, 2, 3)
```

Returns the value in the second row and third column of the range A1:C5.

A | B | C |
---|---|---|

1 | 2 | 3 |

4 | 5 | 6 |

7 | 8 | 9 |

Result: 6.

### MAP

Applies a function to each element of an array and returns the resulting array.

```
=MAP(A1:A5, LAMBDA(x, x * 2))
```

Multiplies each element in the range A1:A5 by 2.

A |
---|

1 |

5 |

2 |

7 |

3 |

Result:

Doubled Values |
---|

2 |

10 |

4 |

14 |

6 |

### MAKEARRAY

Creates an array based on the specified dimensions and a lambda function.

```
=MAKEARRAY(3, 3, LAMBDA(row, col, row * col))
```

Creates a 3x3 array where each element is the product of the row and column index.

### MAX

Returns the largest number in a set of values.

```
=MAX(A1:A5)
```

Returns the largest value in the range A1:A5.

### MOD

Returns the remainder of a division.

```
=MOD(10, 3)
```

Returns the remainder of dividing 10 by 3 (1).

### SCAN

Performs a calculation for each element of an array and returns a cumulative result.

```
=SCAN(0, A1:A5, LAMBDA(cumulative, value, cumulative + value))
```

Calculates the cumulative sum of the values in the range A1:A5.

### SEQUENCE

Creates an array of sequential numbers based on the specified parameters.

```
=SEQUENCE(5, 1, 1, 1)
```

Creates an array with the numbers 1 to 5.

### SORT

Sorts the rows of a table or range based on the values in one or more columns.

```
=SORT(A1:C10, 2, -1)
```

Sorts the range A1:C10 based on the values in the second column in descending order.

### SUM

Adds all numbers in a range of cells.

```
=SUMME(A1:A10)
```

Adds all values in the range A1:A10.

### COLUMNS

Returns the number of columns in a reference or array.

```
=COLUMNS(A1:C5)
```

Returns the number of columns in the range A1:C5 (3).

### DROP

Removes a specified number of rows or columns from a table or range.

```
=DROP(A1:C5, 2, 1)
```

Removes 2 rows and 1 column from the range A1:C5, starting from the top left.

### IF

Performs a logical test and returns one value if the result is true, and another value if it is false.

```
=IF(A1 > 10, "Greater than 10", "Less than or equal to 10")
```

Checks if the value in A1 is greater than 10 and returns āGreater than 10ā if true, or āLess than or equal to 10ā if false.

### XMATCH

Searches for a specific item in an array or range and returns the relative position of the first match.

```
=XMATCH("B", A1:A5, 0)
```

Searches for the value āBā in the range A1:A5 and returns the relative position.

## Formula

The following formula groups the data by the first column and sorts it.

```
=LET(
sourceTable, Table1[#All],
tableWithoutHeader, DROP(sourceTable,1),
sortedTable, SORT(tableWithoutHeader,{1,3},{1,-1}),
firstColumn, INDEX(sortedTable,,1),
uniqueValues, UNIQUE(firstColumn),
countOccurrences, 3+MAP(uniqueValues,LAMBDA(value, SUM(--(value=firstColumn)))),
runningTotal, SCAN(0,countOccurrences,LAMBDA(runningSum,count,runningSum+count)),
differences, runningTotal-countOccurrences,
rowNumbers, SEQUENCE(MAX(runningTotal)-1),
lookupIndices, XMATCH(rowNumbers,runningTotal,1),
remainders, MOD(rowNumbers-INDEX(differences,lookupIndices),INDEX(countOccurrences,lookupIndices)),
outputTable, MAKEARRAY(
MAX(runningTotal)-1,
COLUMNS(sourceTable)-1,
LAMBDA(rowNum,colNum,
SWITCH(
INDEX(remainders,rowNum)=0,"",
INDEX(remainders,rowNum)=1, IF(colNum=1," "&INDEX(uniqueValues,INDEX(lookupIndices,rowNum)),""),
INDEX(remainders,rowNum)=2, INDEX(sourceTable,1,colNum+1),
INDEX(
FILTER(sortedTable,firstColumn=INDEX(uniqueValues,INDEX(lookupIndices,rowNum))),
INDEX(remainders,rowNum)-2,
colNum+1
)
)
)
),
outputTable
)
```

## Application

- Copy the formula into a cell.
- Adjust the range at
`sourceTable`

. - Adjust the sorting at
`sortedTable`

. - Adjust the headers at
`outputTable`

(e.g.`[...]1,IF(colNum=1,"Coffee Type - "&[...]`

)).

The result should then look like this:

With conditional formatting, the headers can also be highlighted.

## Alternatives

If the data does not need to be displayed in this format, pivot tables can also be used. These are easier to create and maintain. If the data is to be displayed side by side, the `FILTER`

function is sufficient for the most part.

## Conclusion

With this formula, table data in Excel can be grouped and sorted based on a column. The formula uses various Excel functions such as LET, DROP, SORT, UNIQUE, MAP, SCAN, SEQUENCE, XMATCH, MOD, MAKEARRAY and SWITCH to generate the desired output.