powerbi - 如何动态更改 PowerBI 中 DATEADD 函数的间隔类型?
问题描述
我想让我的用户能够选择是否将当前数据与上个月或上一年的数据进行比较。此 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.
我已经搜索但找不到动态更改间隔关键字的解决方案。我还尝试在 DATEADD 函数中使用 if 语句直接返回关键字而不使用变量,但返回了相同的错误。任何帮助将不胜感激。
尽管初始版本有效,但未来的项目可能会为用户提供更多选择,并且需要对更多虚拟变量进行编码。如果每个用户选择都可以由 switch 语句处理并组合以创建最终计算,如第二个版本所示,那将是理想的。
解决方案
我不确定是否可以将最后一个参数设为变量。我建议改用以下方法。
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
函数。
推荐阅读
- reactjs - 将两个不同的 React 应用程序合并为单个应用程序
- algorithm - 安排算法,为我孩子的日托提供最少的接触时间和小组规模
- python - 使用 bot api 和请求库(python 3.6)将大文件发送到电报聊天中
- python - 如何从字符串中除以0返回0?
- sapui5 - SAPUI5 Smartable 不显示初始字段
- wso2 - ClaimMetadataClientException:Invalid Claim URI : http://wso2.org/claims/local for Claim 同时更新 wso2 身份服务器数据库
- angular - 如何把数字文件限制primeng v9
- twilio - 我可以避免 Twilio 验证 10 分钟代码有效性限制吗?
- python - AttributeError:模块“芹菜”没有属性“路由器”
- perl - 如何在 Perl 中使多个变量只读?