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

#powerbi #dax #powerbi-desktop

#powerbi #dax #powerbi-desktop

Вопрос:

Я сталкиваюсь со следующей проблемой:

Некоторая дополнительная информация: мне нужно получить последнюю версию FX определенного типа, чтобы использовать ее в качестве коэффициента пересчета. Я делаю это с помощью вычисляемого столбца true / false:

 bool_Latest_FX_Act = 
var latestDate = 
CALCULATE(
    MAX(FX_Table[Month-Year])
    ,FILTER(ALL(FX_Table)
        , FX_Table [Type] = "Actuals"
    )
)
return
IF((FX_Table [Month-Year] = latestDate) amp;amp; (FX_Table [Type] = "Actuals"), TRUE(), FALSE())
  

Это возвращает значение true, если значения являются самыми последними значениями. Если нет, то значение равно False. (это работает) На самом деле это не относится к проблеме, но объясняет, как я получаю значение true / false для меры CP.

У меня есть эта модель: Модель PBI

Я создал две меры, каждая из которых возвращает 1 дату:

[CP] и [CP_PY]

(Текущий период) и (Текущий период прошлого года)

 CP = 
VAR ThisActMonth =
    CALCULATE (
        DISTINCT (FX_Table[Month-Year] ),
        FX_Table[bool_Latest_FX_Act] = TRUE ()
    )
RETURN
    ThisActMonth
  

Эта мера возвращает февраль 2019 года в формате даты:

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

 CP Actuals = SUMX(
     FILTER (ValuesTable, ValuesTable [Type] = "Actuals" amp;amp; ValuesTable [Month-Year]=[CP]),
            ValuesTable [RestCurrAct]
     )
  

Когда я использую эту меру, результаты возвращаются, как и ожидалось, мои данные фильтруются по типу и по последнему периоду обмена валют (динамически изменяется в зависимости от того, что загружено в модель).

За предыдущий год:

 CP_PY = SUMX(
    Filter('Date', 'Date'[Date Hierarchy]=[CP]),
    SAMEPERIODLASTYEAR('Date'[Date Hierarchy])
)
  

Эта мера возвращает февраль 2018 года:

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

 LY Actuals (NoFX) = SUMX(
     FILTER (ValuesTable, ValuesTable [Type] ="Actuals" amp;amp; ValuesTable [Month-Year]=[CP_PY]),
            ValuesTable [USDNoFX(xElim)]
     )
  

Я проверил, что показатели периода идентичны значениям ValuesTable [месяц-год], и я убедился, что на самом деле существуют значения предыдущего года 😉 . У меня такое чувство, что именно так написан мой CP_PY, но я понятия не имею, где я ошибаюсь. Я действительно смущен тем, почему это работает для CP, а не для CP_PY. Любая помощь была бы очень признательна.

Ответ №1:

Когда вы пишете

 FILTER ( ValuesTable, ... )
  

Таблица, которую вы фильтруете, ValuesTable не обязательно является всей таблицей, но оценивается в рамках вашего текущего контекста фильтра. Я предполагаю, что вы пытаетесь оценить эту меру в контексте, который не включает февраль 2018 года, что означает, что добавление [CP_PY] условия заставит FILTER функцию возвращать пустой набор, поскольку она не может одновременно включать и исключать этот месяц.

Есть несколько способов исправить это. Простым решением может быть обертывание ValuesTable в соответствующий вариант ALL , ALLSELECTED или ALLEXCEPT . То есть что-то вроде

 FILTER ( ALL ( ValuesTable ), ... )
  

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

 LY Actuals (NoFX) =
VAR PrevYear = [CP_PY]
RETURN
    CALCULATE (
        SUM ( ValuesTable[USDNoFX(xElim)] ),
        ValuesTable[Type] = "Actuals",
        ValuesTable[Month-Year] = PrevYear
    )
  

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

1. Спасибо Алексис, я отмечу ваш ответ; Перенос таблицы значений в вариант ALL и т.д. странным образом не работает. Однако; объявление «переменной measure (CP_PY)» в качестве переменной, как вы проиллюстрировали в своем примере, решило проблему. Есть идеи, почему это могло произойти? Спасибо за вашу помощь, действительно ценится.