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

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

Собакенские будни
Рвав-рвав, сегодня я — собака-вспоминака!

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

Пример:

  • Таблица «Данные по сотрудникам» содержит необходимые сведения о сотрудниках, а именно, ID сотрудника (например, менеджера по закупкам), некое значение (например, количество заказов), ID ответственного лица (пусть это будет куратор соответствующего менеджера):


  • Таблица «Справочник сотрудников» содержит ID сотрудника, и его фамилию:


Задача:

Подтянуть в таблицу «Данные по сотрудникам» фамилии как сотрудников, так и ответственных лиц.

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

Получение значения «Фамилия сотрудника»:

  • Тут все просто, необходимо настроить нужную связь на уровне модели по полю «ID Сотрудника»:



  • Дальше можно переходить непосредственно к созданию расчетного столбца в таблице «Данные по сотрудникам», используя следующую формулу:

Фамилия Cотрудника =
RELATED ('Справочник сотрудников'[Фамилия])

  • Затем можно проверить получившийся результат:


Получение значения «Фамилия ответственного»:

  • Необходимо настроить вторую связь на уровне модели по полю «ID Ответственного», при этом то, что она будет неактивной — это нормально:


  • Дальше можно переходить непосредственно к созданию расчетного столбца в таблице «Данные по сотрудникам», используя следующую формулу:

Фамилия ответственного =
CALCULATE (
    MINX (
        'Данные по сотрудникам',
        RELATED ( 'Справочник сотрудников'[Фамилия] )
    ),
    ALL ( 'Справочник сотрудников' ),
    USERELATIONSHIP ( 'Данные по сотрудникам'[ID Ответственного], 'Справочник сотрудников'[ID Сотрудника] )
)

  • Затем можно проверить получившийся результат:


Рвав-рвав, товарищи, намешали, что могли, получили, что хотели…
Всем хорошей погоды и горячей воды!
Ваш Смайл