Привет, Хабр! В аналитическом языке DAX одной из важных функций является SUMMARIZECOLUMNS. Эта функция готовит данные для дашбордов, также реализует декартово произведение полей группировки (если поля группировки из разных таблиц). Для понимания DAX полезно ознакомиться с особенностями SUMMARIZECOLUMNS, интересующимся деталями SUMMARIZECOLUMNS — добро пожаловать под кат :)
Функция SUMMARIZECOLUMNS из Power BI до сих пор развивается и дорабатывается Microsoft. Например, в 2024 году добавлено использование SUMMARIZECOLUMNS в мерах в Power BI. Синтаксис SUMMARIZECOLUMNS выглядит следующим образом:


Назначение параметров для группировки, фильтрации и выражений может быть интуитивно понятно, особенность SUMMARIZECOLUMNS заключается в декартовом произведении полей группировки. Для иллюстрации рассмотрим данные в таблице sales с полями productId, customerId и amount:

Для полей группировки из одной таблицы sales[productId] и sales[cusomerId] декартового произведения нет:

Для полей группировки из разных таблиц products[productId] и customers[customerId] в результатах появляется декартово произведение:

Это одна из главных особенностей SUMMARIZECOLUMNS.
Есть также вторая особенность, связанная с декартовым произведением, — постраничный просмотр результатов SUMMARIZECOLUMNS. Например, рассмотрим 100 000 записей в таблице products и 100 000 записей в customers и простейший дашборд-матрицу.

Декартово произведение products[productId] на customers[cusatomerId] дает 100 000 x 100 000 записей, но благодаря постраничному просмотру результаты такой размерности бл��гополучно отображаются в Power BI, и, конечно, нигде не хранятся 100 000 x 100 000 записей, а получаются постранично. Часть DAX для приведенного дашборда — это SUMMARIZECOLUMNS с размерностью результата 100 000 х 100 000

Видно, что Power BI в случае размерности 100 000 х 100 000 для SUMMARIZECOLUMNS разбивает результаты на страницы, условно по аналогии с действиями с разреженной матрицей, и не пытается хранить результат 100 000 х 100 000, что было бы неоптимально.
Естественно, что функционал, в чем-то аналогичный SUMMARIZECOLUMNS из аналитического языка DAX, может быть в большей или меньшей степени реализован на разных языках, например на C# (например, в NuGet пакете DaxSharp) или на других языках.
Надеюсь, приведенные особенности могут быть полезными, успешных дашбордов :)
