Как динамически изменить тип интервала функции DATEADD в PowerBI? - PullRequest
0 голосов
/ 17 января 2019

Я хотел бы дать своим пользователям возможность выбирать, сравнивать ли текущие данные с данными предыдущего месяца или года. Эта мера DAX написана в PowerBI. Следующий фрагмент кода использует выбор пользователя MarketShare и Match, чтобы определить расчет, и выбор пользователя Compare, чтобы определить, сравнивать ли с предыдущим месяцем или годом, но неэффективно, потому что я повторяю ScriptTypeVar. переменная для версии месяца и года.

Previous Amount Scripted = 
VAR SelectedMatch = FIRSTNONBLANK(Match[Match],1)
VAR SelectedMarketShare = FIRSTNONBLANK('Market Share'[Market Share],1)
VAR SelectedCompare = FIRSTNONBLANK('Compare'[Compare],1)


VAR PreviousMonthScriptTypeVar = SWITCH(TRUE(),
                SelectedMarketShare = "Quantity", CALCULATE(SUM(Scripts_Fact[Pack Quantity]),DATEADD('Date_Dimension'[Date], -1, ,MONTH)),
                SelectedMarketShare = "Quantity (Repeats)", CALCULATE(SUM(Scripts_Fact[Pack Quantity (Repeats)]),DATEADD('Date_Dimension'[Date], -1, ,MONTH)),
                SelectedMarketShare = "Value", CALCULATE(SUM(Scripts_Fact[Value]),DATEADD('Date_Dimension'[Date], -1, ,MONTH)),
                SelectedMarketShare = "Value (Repeats)", CALCULATE(SUM(Scripts_Fact[Value (Repeats)]),DATEADD('Date_Dimension'[Date], -1, ,MONTH))
            )

VAR PreviousYearScriptTypeVar = SWITCH(TRUE(),
                SelectedMarketShare = "Quantity", CALCULATE(SUM(Scripts_Fact[Pack Quantity]),DATEADD('Date_Dimension'[Date], -1, ,YEAR)),
                SelectedMarketShare = "Quantity (Repeats)", CALCULATE(SUM(Scripts_Fact[Pack Quantity (Repeats)]),DATEADD('Date_Dimension'[Date], -1, ,YEAR)),
                SelectedMarketShare = "Value", CALCULATE(SUM(Scripts_Fact[Value]),DATEADD('Date_Dimension'[Date], -1, ,YEAR)),
                SelectedMarketShare = "Value (Repeats)", CALCULATE(SUM(Scripts_Fact[Value (Repeats)]),DATEADD('Date_Dimension'[Date], -1, ,YEAR))
            )

VAR CompareTypeVar = SWITCH(TRUE(),
                SelectedCompare = "Previous Month", PreviousMonthScriptTypeVar,
                SelectedCompare = "Same Month Previous Year", PreviousYearScriptTypeVar
            )


VAR AmountScriptedVar = 
IF(AND(HASONEVALUE('Calendar'[Year]),HASONEVALUE('Calendar'[Month])),
                                SWITCH(TRUE(),
                                    SelectedMatch = "A", CALCULATE(CompareTypeVar,USERELATIONSHIP('Reporting_Products'[A], Product_Dimension[A])),
                                    SelectedMatch = "B", CALCULATE(CompareTypeVar,USERELATIONSHIP(Reporting_Products[B], Product_Dimension[B])),
                                    SelectedMatch = "C", CALCULATE(CompareTypeVar,USERELATIONSHIP('Reporting_Products'[C], Product_Dimension[C])),
                                    SelectedMatch = "D", CALCULATE(CompareTypeVar,USERELATIONSHIP('Reporting_Products'[D], Product_Dimension[D]))
                                    ),
                                [AmountScripted]
                            )
RETURN
AmountScriptedVar

Я попытался использовать переключатель «CompareTypeVar», чтобы вернуть ключевые слова MONTH или YEAR и упростить измерение следующим образом:

Previous Amount Scripted = 
VAR SelectedMatch = FIRSTNONBLANK(Match[Match],1)
VAR SelectedMarketShare = FIRSTNONBLANK('Market Share'[Market Share],1)
VAR SelectedCompare = FIRSTNONBLANK('Compare'[Compare],1)

VAR CompareTypeVar = SWITCH(TRUE(),
                SelectedCompare = "Previous Month", MONTH,
                SelectedCompare = "Same Month Previous Year", YEAR
            )

VAR ScriptTypeVar = SWITCH(TRUE(),
                SelectedMarketShare = "Quantity", CALCULATE(SUM(Scripts_Fact[Pack Quantity]),DATEADD('Date_Dimension'[Date], -1, ,CompareTypeVar)),
                SelectedMarketShare = "Quantity (Repeats)", CALCULATE(SUM(Scripts_Fact[Pack Quantity (Repeats)]),DATEADD('Date_Dimension'[Date], -1, ,CompareTypeVar)),
                SelectedMarketShare = "Value", CALCULATE(SUM(Scripts_Fact[Value]),DATEADD('Date_Dimension'[Date], -1, ,CompareTypeVar)),
                SelectedMarketShare = "Value (Repeats)", CALCULATE(SUM(Scripts_Fact[Value (Repeats)]),DATEADD('Date_Dimension'[Date], -1, ,CompareTypeVar))
            )               

VAR AmountScriptedVar = IF(AND(HASONEVALUE('Calendar'[Year]),HASONEVALUE('Calendar'[Month])),
                                SWITCH(TRUE(),
                                    SelectedMatch = "Generic Code", CALCULATE(ScriptTypeVar,USERELATIONSHIP('Reporting_Products'[Medprax Generic Code], Product_Dimension[Medprax Generic Code])),
                                    SelectedMatch = "ATC5 Code", CALCULATE(ScriptTypeVar,USERELATIONSHIP(Reporting_Products[ATC5 Code], Product_Dimension[ATC5 Code])),
                                    SelectedMatch = "ATC4 Code", CALCULATE(ScriptTypeVar,USERELATIONSHIP('Reporting_Products'[ATC4 Code], Product_Dimension[ATC4 Code])),
                                    SelectedMatch = "ATM Link", CALCULATE(ScriptTypeVar,USERELATIONSHIP('Reporting_Products'[ATM Link], Product_Dimension[ATM Link]))
                                    ),
                                [AmountScripted]
                            )
RETURN
AmountScriptedVar

... но я получаю следующую ошибку:

The last argument must be one of these keywords: DAY, MONTH, QUARTER, or YEAR.

Я искал, но не могу найти решение для динамического изменения ключевого слова интервала. Я также попытался использовать оператор if в функции DATEADD для прямого возврата ключевых слов без использования переменной, но это привело к той же ошибке. Любая помощь будет высоко ценится.

Несмотря на то, что первоначальная версия работает, будущие проекты могут предоставить пользователю больше возможностей выбора и потребуют больше фиктивных переменных для кодирования. Было бы идеально, если бы каждый выбор пользователя мог обрабатываться оператором switch и объединяться для создания окончательного расчета, как показано во второй версии.

1 Ответ

0 голосов
/ 17 января 2019

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

Previous Amount Scripted =
<...>
VAR CompareDatesTable =
    SWITCH (
        TRUE (),
        SelectedCompare = "Previous Month",
        DATEADD ( 'Date_Dimension'[Date], -1, MONTH ),
        SelectedCompare = "Same Month Previous Year",
        DATEADD ( 'Date_Dimension'[Date], -1, YEAR)
    )
VAR ScriptTypeVar =
    SWITCH (
        TRUE (),
        SelectedMarketShare = "Quantity",
        CALCULATE (
            SUM ( Scripts_Fact[Pack Quantity] ),
            CompareDatesTable
        ),
        <...>
    )
<...>

Выше я передаю всю таблицу CompareDatesTable в функцию CALCULATE.

...