Я хотел бы дать своим пользователям возможность выбирать, сравнивать ли текущие данные с данными предыдущего месяца или года. Эта мера 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 и объединяться для создания окончательного расчета, как показано во второй версии.