Записки охотника

Конструкция Userelationship

Конструкции
Рвав-рвав,

сегодня мы рассмотрим использование такой конструкции, как Userelationship. При помощи данной функции можно переопределить активную связь на время выполнение запроса. Синтаксис указанной функции из серии «проще практически не бывает», однако, покопавшись в памяти, собака-вспоминака вспомнил, что встречал в одном сообществе такую вот задачку: «Так и так, хочу в одну таблицу подтянуть столбец из другой таблицы (по принципу работы RELATED), но при этом активную связь надо переопределить, не перестраивая связи в модели…»

Пример

Имеется базовый набор данных, содержащий только ID необходимых нам записей:
Базовый набор данных (таблица t_Dataset)
Для вашего удобства, на иллюстрациях мы будем отображать только часть информации, а именно первые 10 записей.
Дополнительно, у нас есть еще один набор данных, который является справочником, содержащим текстовое описание значений, присутствующих в наборе данных:
Справочник (таблица t_Breed)
Для вашего удобства, на иллюстрации показаны только те записи справочника, которые соответствуют только первым10 записям набора данных.

Задача

Дополнить набор данных текстовой информацией из справочника, используя в качестве ключа записи поле «Breed ID».
Рвав-рвав, конечно, есть много неспортивных способов выполнения поступившего запроса (например, с использованием функции «Switch», условного столбца в Power Query и так далее), но поскольку это не интересно и не универсально, мы это, не рассматриваем.

Функция RELATED

Для получения данных из справочника можно использовать функцию «Related», однако, эта функция работает только при наличии связей между данными, которые устанавливаются непосредственно на уровне модели:
Связь типа "Многие к одному" от справочника (таблица t_Breed) к набору данных (таблица t_Dataset) по полю Breed ID
При создании связей важен не только сам тип связи, но и ее направление,  примере показана самая простая связь с использованием ключевого поля «Breed ID».
После создания связи можно использовать конструкцию следующего вида:
Breed =
RELATED ( t_Breed[Breed] )
Результат работы формулы:
Добавление столбца Breed (таблица t_Dataset)

Функция USERELATIONSHIP

Для получения данных по полю «Friend ID» необходимо настроить вторую связь, при этом она будет неактивной, поскольку одна активная связь, по полю «Breed ID», уже есть:
Связь типа "Многие к одному" от справочника (таблица t_Breed) к набору данных (таблица t_Dataset) от поля Breed ID к полю Friend ID
После создания связи можно использовать конструкцию следующего вида:
Friend =
CALCULATE (
    MINX (
        't_Dataset',
        RELATED ( 't_Breed'[Breed] )
    ),
    ALL ( 't_Breed' ),
    USERELATIONSHIP ( 't_Dataset'[Friend ID], 't_Breed'[Breed ID] )
)
Результат работы формулы:
Добавление столбца Friend (таблица t_Dataset)
Рвав-рвав, некоторые записи остались пустыми намеренно, поскольку эти породы между собой плохо уживаются…

Результат

В итоге, при помощи DAX, а именно функции «Userelationship», исходный набор данных, содержащий только ID записи, был дополнен текстовым описанием из соответствующего справочника (столбцы «Breed» и "Friend"), а активная связь в модели данных осталась в исходном виде.
Всем хорошей погоды и горячей воды!

Ваш Смайл