#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] . Мне не хватало возврата. Первый раз с использованием переменных. Спасибо!