Привет, Хабр! В аналитическом языке 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
. Например, рассмотрим 100000 записей в таблице products
и 100000 записей в customers
и простейший дашборд-матрицу.

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

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