Россия Нет

Создание таблиц из пересечений строк: DAX функции GENERATE, GENERATEALL и CROSSJOIN в Power BI и Power Pivot

 Содержание статьи: (кликните, чтобы перейти к соответствующей части статьи):


Приветствую Вас, дорогие друзья, с Вами Будуев Антон. В этой статье мы обсудим функции GENERATE, GENERATEALL и CROSSJOIN в Power BI и Power Pivot, которые способны в коде языка DAX создавать вычисляемые таблицы на основе пересечений строк других таблиц.

Давайте рассмотрим каждую из этих функций отдельно, подробно разбирая то, как они работают на примерах формул в Power BI. Так как в этой программе можно создавать таблицы в модели данных, что нам пригодится для демонстрации примеров.

В Power Pivot (Excel) функции GENERATE, GENERATEALL и CROSSJOIN также работают, только таблицы они там создают виртуально, во время вычисления самой формулы.

Итак, переходим к разбору функций.

Для Вашего удобства, рекомендую скачать «Справочник DAX функций для Power BI и Power Pivot» в PDF формате.

Если же в Ваших формулах имеются какие-то ошибки, проблемы, а результаты работы формул постоянно не те, что Вы ожидаете и Вам необходима помощь, то записывайтесь в бесплатный экспресс-курс «Быстрый старт в языке функций и формул DAX для Power BI и Power Pivot».

 

DAX функции GENERATE и GENERATEALL в Power BI и Power Pivot

GENERATE () и GENERATEALL () — создают таблицу из всех пересечений строк двух таблиц, входящих в параметры функций. То есть, для каждой строки первой таблицы возвращаются (по очереди вычисляются) все строки из второй.

Иногда, на просторах Интернета я встречаю, что некоторые пользователи несколько неверно прописывают имя этих функций, добавляя второе слово: generate table. Слово table здесь не нужно.

Синтаксис:

GENERATE ('Таблица 1'; 'Таблица 2')
GENERATEALL ('Таблица 1'; 'Таблица 2')

Где: Таблица — исходная таблица или табличное выражение

! — Названия столбцов в обеих таблицах должны быть разными

Обе функции GENERATE и GENERATEALL работают практически одинаково, за исключением того, как они обрабатывают пустую вторую таблицу.

Давайте сначала разберемся как они обе функционируют, а затем рассмотрим различия в их работе.

Примеры формул на основе DAX функций GENERATE и GENERATEALL.

В Power BI Desktop имеются 2 исходные таблицы «Год» и «Месяц»:

 

Создадим при помощи функции GENERATE формулу, возвращающую календарь из пересечений строк всех годов со всеми имеющимися месяцами:

Календарь = GENERATE (‘Год’;’Месяц’)

Результатом выполнения этой формулы будет перечисление всех 3 месяцев по каждому году:

 

Итог будет абсолютно тем же самым, если вместо GENERATE мы пропишем DAX функцию GENERATEALL:

Календарь = GENERATEALL ('Год';'Месяц')

 

Теперь давайте поговорим о разнице этих 2 функций. А вся разница, как я уже писал выше, заключается в обработке пустой второй таблицы.

Рассмотрим пример, когда вторая таблица «Месяц» полностью пустая:

 

При тех же формулах:

Календарь = GENERATE ('Год';'Месяц')
Календарь = GENERATEALL ('Год';'Месяц')

В этот раз результат будет разным.

GENERATE — возвратит вообще пустую таблицу:

 

А DAX функция GENERATEALL возвратит таблицу, состоящую из двух столбцов, где будут прописаны года, а месяца останутся пустыми:

 

Рассмотрим еще одну DAX функцию, похожую на GENERATE и GENERATEALL, которая также возвращает пересечение всех строк, только уже не двух, а многих таблиц.

 

DAX функция CROSSJOIN в Power BI и Power Pivot

CROSSJOIN () — создает таблицу из всех пересечений строк всех таблиц, входящих в параметры функции.

Синтаксис:

CROSSJOIN ('Таблица 1'; 'Таблица 2'; 'Таблица N')

Где: Таблица — исходная таблица или табличное выражение

! — Названия столбцов во всех таблицах должны быть разными

Рассмотрим пример формулы на основе DAX функции CROSSJOIN.

В Power BI Desktop имеются 3 исходные таблицы «Год», «Месяц», «День»:

 

Напишем формулу календаря из пересечения всех строк года, месяца и дня на основе функции CROSSJOIN:

Календарь = CROSSJOIN ('Год'; 'Месяц'; 'День')

Результатом выполнения этой формулы будет следующее пересечение всех строк:

 

Так как все эти 3 функции GENERATE, GENERATEALL и CROSSJOIN в итоге своей работы возвращают таблицы, то всех их можно легко использовать в сочетании со многими другими функциями в DAX.

Например, результаты таблицы, созданной на основе CROSSJOIN можно отфильтровать функцией FILTER. Таким образом, убрать какие-то лишние строки из того количества пересечений, которое было создано.

На этом, с функциями создания таблиц в Power BI и Power Pivot из пересечений строк, в этой статье, все.

Пожалуйста, оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(18 голосов, в среднем: 5 из 5 баллов)
[Экспресс-видеокурс] Быстрый старт в языке DAX

 
 
Антон БудуевУспехов Вам, друзья!
С уважением, Будуев Антон.
Проект «BI — это просто»
 
 
 
 

Если у Вас появились какие-то вопросы по материалу данной статьи, задавайте их в комментариях ниже. Я Вам обязательно отвечу. Да и вообще, просто оставляйте там Вашу обратную связь, я буду очень рад.
 
Также, делитесь данной статьей со своими знакомыми в социальных сетях, возможно, этот материал кому-то будет очень полезен.

 
Понравился материал статьи?
Избранные закладкиДобавьте эту статью в закладки Вашего браузера, чтобы вернуться к ней еще раз. Для этого, прямо сейчас нажмите на клавиатуре комбинацию клавиш Ctrl+D

Автор статьи:
Категория: Язык функций и формул DAX для Power BI и Excel (Power Pivot)

Добавить комментарий

* Заполняя форму отправки комментария своими персональными данными (имя, email, сайт и др.), Вы автоматически подтверждаете свое согласие на обработку своих персональных данных