Как сохранить столбец в контексте фильтра и выполнить расчет суммы? - PullRequest
1 голос
/ 02 апреля 2020

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

Мои данные находятся в плоской таблице:

ForecastName    FiscalYear  TransactionType Value
Forecast1      2019         borrowing       10
Forecast1      2020         borrowing       10
Forecast1      2021         borrowing       10
Forecast1      2022         borrowing       20
Forecast1      2023         borrowing       25
Forecast2      2019         borrowing       30
Forecast2      2019         turnover        40
Forecast3      2019         turnover        50
Forecast3      2020         turnover        50

У меня есть мера для расчета заимствования:

Borrowing = CALCULATE(SUM(Table[Value]),Table[TransactionType]="borrowing")

И мера для mutiplier (в основном это возвращает {1, 1, 0.5, 0}):

Multiplier = 
VAR YearNumber = MAX(Table[Fiscal Year])-2018
RETURN
IF(2.5 > YearNumber,1, IF(2.5 > YearNumber-1,.5,0))

Вот моя попытка написать меру стиля суммы продукта:

Borrowing Forecast = 
VAR CurrentFiscalYear = MAX(Table[Fiscal Year])

RETURN
SUMX((FILTER(ALLEXCEPT(Table,Table[ForecastName]),
           Table[Fiscal Year] < CurrentFiscalYear + 4 &&
           Table[Fiscal Year] >= CurrentFiscalYear)
Mutiplier x Borrowing)

Идея состоит в том, что когда вы помещаете меру в таблицу с FiscalYear в строке, отфильтрованной по ForecastName, она берет финансовый год из строки и помещает его в переменную, а затем использует его для фильтрации всей таблицы по текущему и следующим 3 финансовым годам, но сохраняет фильтр в ForecastName, затем выполняет вычисление и суммирует его. Таблица показывает мой желаемый результат для Forecast1:

Fiscal Year Borrowing Forecast - DESIRED
2019         25 ((10*1)+(10*1)+(10*0.5)+(20*0))
2020         30 ((10*1)+(10*1)+(20*0.5)+(25*0))

Фактический результат - большое число, которое я не понимаю, но я думаю, что одна из проблем заключается в том, что часть ALLEXCEPT, похоже, не работает ..

Мне также было интересно, содержит ли CALCULATE тот факт, что мера, которую я пытаюсь использовать в расчетной части SUMX?

Большое спасибо!

1 Ответ

1 голос
/ 02 апреля 2020

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

Вот как я могу сделать это следующим образом: одна мера:

Borrowing Forecast = 
VAR ThisYear = SELECTEDVALUE ( 'Table'[FiscalYear] ) 
VAR Years =
    SUMMARIZE (
        ALLSELECTED ( 'Table' ),
        'Table'[FiscalYear],
        "Multiplier", SWITCH (
            TRUE (),
            'Table'[FiscalYear] < ThisYear, 0,
            'Table'[FiscalYear] - ThisYear < 2, 1,
            'Table'[FiscalYear] - ThisYear < 3, 0.5,
            0
        ),
        "Borrowing", CALCULATE (
            SUM ( 'Table'[Value] ),
            'Table'[TransactionType] = "borrowing"
        )
    )
RETURN
    SUMX ( Years, [Multiplier] * [Borrowing] )

Меру Borrowing легко определить отдельно, но множитель сложнее ...


ОК. Я думаю, что у меня это есть с некоторыми хакерами DAX c.

Чтобы выделить множитель, давайте определим его следующим образом:

MinYear = CALCULATE ( MIN ( 'Table'[FiscalYear] ), ALL ( 'Table' ) )

Multiplier = 
VAR YearDiff = SELECTEDVALUE ( 'Table'[FiscalYear] ) - [MinYear]
RETURN
    SWITCH (
        TRUE (),
        YearDiff < 0, 0,
        YearDiff < 2, 1,
        YearDiff < 3, 0.5,
        0
    )

Теперь мы можем записать прогнозную меру следующим образом:

Forecast = 
VAR Offset = SELECTEDVALUE ( 'Table'[FiscalYear] ) - [MinYear]
RETURN
    SUMX (
        ALL ( 'Table'[FiscalYear] ),
        CALCULATE (
            [Multiplier],
            'Table'[FiscalYear] = EARLIER ( 'Table'[FiscalYear] ) - Offset
        ) * [Borrowing]
    )

Обратите внимание, что мы по существу передаем EARLIER ( 'Table'[FiscalYear] ) - Offset как переменную для меры Multiplier. Также обратите внимание, что Offset содержит [MinYear], который заменяется на единицу в YearDiff после прохождения, так что эффективно

YearDiff = EARLIER ( 'Table'[FiscalYear] ) - SELECTEDVALUE ( 'Table'[FiscalYear] )

, где первым является год от контекст строки, а последний - год из контекста фильтра.

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

Вот как это выглядит в матрице:

PBI Visuals

...