Мера Power BI для фильтрации на основе атрибута, связанного с UPN, — неправильная фильтрация

#powerbi #dax

#powerbi #dax

Вопрос:

Я пытаюсь создать меру, которая будет суммировать затраты для человека, использующего отчет, а также любые затраты от сотрудников, которые работают на них напрямую, или работают на менеджеров, которые работают на них.

Мои данные имеют EmpID в таблице фактов, и у меня есть таблица измерений с EmpID и связанным с ним адресом электронной почты, который является их UPN. В результате этого вычисления значение EmpID равно 3 при использовании представления в качестве роли emp3@email.com в моем тесте:

 Logged In EmpID = CALCULATE(MAX(dim_Employee[EmpID]),USERPRINCIPALNAME()=dim_Employee[UPN])
 

У меня есть другая мера, которая измеряет стоимость с помощью calculate и фильтра для EmpID UPN пользователя или где этот идентификатор находится в поле Manager или Director.

 myCost = CALCULATE(SUM(fact_Cost[Cost]),
FILTER(dim_Employee,
[EmpID]=[Logged In EmpID]
||dim_Employee[MgrID]=[Logged In EmpID]
||dim_Employee[DirectorID]=[Logged In EmpID]
)
)
 

Использование представления в качестве роли emp3@email.com , который является EmpID 3, это должно привести к 125 долларам. Однако показываемый результат составляет всего 15 долларов, где EmpID равен 3, поэтому похоже, что он не улавливает Mgr и DirID часть фильтра.

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

введите описание изображения здесь

Это таблица измерений с отношениями сотрудников к менеджерам и директорам:

введите описание изображения здесь

ОБНОВЛЕНИЕ: уточнение визуального изображения, которое должно показывать 125 долларов, — это то, в котором у меня нет никаких других данных:

введите описание изображения здесь

Я попробовал ВСЕ, что было включено в фильтр для первого комментария ниже, и я все еще не получаю больше 15 долларов.

Когда я уменьшаю формулу только до менеджера или только директора, я получаю пробел. Таким образом, он не может получить мне записи, где [Logged In EmpID] = [MgrID] или [DirectorID]

 Manager only where I get blank:
    myCost just Manager = 
    CALCULATE(SUM(fact_Cost[Cost]),
            FILTER(dim_Employee,
                dim_Employee[MgrID]=[Logged In EmpID]
                )
            )
 

и попробовал со ВСЕМИ:

    myCost Manager ALL = 
    CALCULATE (
        SUM ( fact_Cost[Cost] ),
        FILTER (
            ALL(dim_Employee[MgrID]),
                dim_Employee[MgrID] = [Logged In EmpID]
               )
            )
 

введите описание изображения здесь

Есть идеи, что я делаю неправильно, или альтернативный подход? Спасибо.

Ответ №1:

Причина, по которой отображается только стоимость для одного сотрудника: в вашем визуальном представлении у вас есть сотрудники, менеджеры и директора по строкам. Строки служат фильтрами. Итак, ваша текущая формула по существу выполняет следующее (я буду использовать 3-ю строку в качестве примера):

  • Фильтруйте таблицу «fact_Cost» для записей, где Employee = 3, Manager = 6 и Director = 7 (этот запрос на фильтрацию поступает из вашего визуального). Результат: одна запись с этой комбинацией идентификаторов.
  • Отфильтруйте эту запись дальше для идентификатора сотрудника = 3, ИЛИ Manager_ID = 3, ИЛИ Director_ID = 3. Первый критерий — True, другие — false (потому что 6 <> 3, 7 <> 3). Но запись остается.
  • Оставшаяся запись фильтрует таблицу с затратами и суммирует их. Поскольку у нас есть только 1 запись, она показывает ее стоимость — 15.

Решение: перед применением вашего критерия «ИЛИ» вам необходимо «удалить» фильтры, которые поступают из вашего визуального изображения, чтобы вместо 1 записи вы могли «видеть» их все. Например:

 myCost =
VAR Login_ID = [Logged In EmpID]
RETURN
CALCULATE (
    SUM ( fact_Cost[Cost] ),
    FILTER (ALL(dim_Employee[EmpID],dim_Employee[MgrID],dim_Employee[DirectorID]),
        dim_Employee[EmpID] = Login_ID ||
        dim_Employee[MgrID] = Login_ID ||
        dim_Employee[DirectorID] = Login_ID
    )
)
 

Здесь мы сначала удаляем все фильтры из столбцов, к которым нам нужен доступ в dim Employee. Затем мы повторно фильтруем эти столбцы по мере необходимости и применяем результирующий набор записей к таблице затрат.

Редактировать:

Вышеуказанная мера работает правильно. Чтобы проверить это, замените свою меру [Logged In EmpID] на определенный идентификатор сотрудника, т.Е. 3:

     myCost =
    VAR Login_ID = 3
    RETURN
    CALCULATE (SUM ( fact_Cost[Cost] ), 
    FILTER (ALL(dim_Employee[EmpID],dim_Employee[MgrID],dim_Employee[DirectorID]),
            dim_Employee[EmpID] = Login_ID ||
            dim_Employee[MgrID] = Login_ID ||
            dim_Employee[DirectorID] = Login_ID
        )
    )
 

Результат, который я получил в вашем файле pbix:

введите описание изображения здесь

Итак, единственной причиной, по которой вы получаете пробелы, должна быть мера [Logged In EmpID] — она не возвращает «3», как ожидалось. Это означает, что функция userprincipalname не возвращает соответствующую строку для dim_Employee[UPN], другими словами, эта часть вашей формулы:

 USERPRINCIPALNAME()=dim_Employee[UPN]
 

работает не так, как предполагалось.

У меня нет возможности протестировать эту часть на настольном Power BI, потому что я не вижу ваши логины. Но вы можете легко сделать это самостоятельно: создайте меру, которая показывает имя пользователя:

 User Name = USERPRINCIPALNAME()
 

и тщательно сравните его результат с содержимым столбца dim_Employee [UPN]. Я предполагаю, что они не будут точно совпадать. Как только вы выясните, как сделать их идентичными, формула будет работать.

Комментарии:

1. Спасибо за подробный ответ, RADO. Результат просмотра, который я изначально не публиковал, я обновил вопрос, включив его, и попробовал вашу рекомендацию. Я получил тот же результат — 15 долларов. Затем я попытался удалить часть фильтра EmpID = Logged In EmpID, и она стала пустой. Таким образом, он не может вычислить myCost с фильтром для [MgrID] или [DirectorID] = [Logged In EmpID] . Возможно, из-за того, как я вычисляю [Logged In EmpID] . Очень странно. Я также не смог заставить переменную идентификатора входа работать так, как вы опубликовали, что также было странно.

2. Можете ли вы поделиться книгой pbix?

3. конечно, опубликовано на диске: drive.google.com/file/d/1G2Du8XMwOTKbog12dicSGEvc1i4nP-fx /…

4. Я проверил результат [Logged In EmpID], используя Моделирование> Просмотр по мере ввода роли emp3@email.com . У меня есть таблица в правом верхнем углу с результатом 3. Очень странное переопределение с помощью VAR Login_ID = 3 работает правильно. При первой попытке вашего подхода с помощью VAR Login_ID = [Logged in EmpID] я получил ошибку, но попробовал ее с вашей версией that = 3, и она работает, как вы сказали. Затем я заменил 3 на VAR Login_ID = [Logged in EmpID], и теперь это работает! Похоже, это не сработает, если я не использую переменную в мере для [Logged in EmpID] . Мне не хватало возврата. Первый раз с использованием переменных. Спасибо!