在DAX查询中(在SSRS数据集中)有条件地分配表变量

时间:2018-11-21 17:43:37

标签: reporting-services ssas dax

我正在处理SSRS数据集,尝试编写DAX查询,该查询可以根据用户输入过滤表格模型中的表。具体的挑战是我试图根据用户的输入有条件地创建DAX表变量。

简化的示例:假设我在表格模型中有一个名为“ Groups”的表,其中有两列“ GroupID”和“ GroupLabel”。基于用户的输入,我需要创建一个表变量(类似于SQL临时表),该表变量包含“ Groups”表中与用户输入“ GroupLabel”相对应的GroupID。我已经通过以下方式成功完成了此任务:

DEFINE
VAR GroupIDs_Selected = 
SUMMARIZE(
CALCULATETABLE(
'Groups', 
'Groups'[GroupLabel] = userInput
),
'Group'[GroupID]
)

但是,我们还有一个选项,用户可以为“所有”组选择。因此,要完成此操作,表变量将需要看起来像这样:

DEFINE
VAR GroupIDs_Selected =
SUMMARIZE('Groups', 'Groups'[GroupID])

以上两个变量定义似乎可以单独很好地工作,但是我的问题是我还没有找到有条件地组合这两个变量定义的方法。例如,以下尝试将上述两个定义组合到IF函数中的定义对我不起作用:

DEFINE
VAR GroupIDs_Selected = 
IF( userInput = "All", 
SUMMARIZE('Groups', 'Groups'[GroupID]),
SUMMARIZE(
CALCULATETABLE(
'Groups', 
'Groups'[GroupLabel] = userInput
),
'Group'[GroupID]
)

^更具体地说,当我尝试将此条件变量作为表引用时(例如,在EVALUATE语句中),我收到以下错误消息:“查询中指定的表达式不是有效的表表达式”。

我的问题.. IF语句中是否缺少某些内容?也许我必须包含一个函数,以某种方式将有条件返回的值转换为表?还是在DAX表变量赋值语句中无法做到这一点?还是在表格模型中还有另一种完全不同的方式来处理这种情况?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这取决于您要使用哪种参数。如果它是一个简单的值文本参数,则在SUMMARIZE中使用一个简单的过滤器,像这样

SSRS:

par1 available values (A|B|C|D); users choice A

DAX:

EVALUATE(
SUMMARIZECOLUMS(
'Item'[Category]
FILTER('Item', 'Item'[Group] = @ssrsParam)
"sales" [value of items]
)

如果参数为多值,则可以执行以下操作

SSRS:

par1 available values (A|B|C|D); users choice A and B

在数据集中使用par1作为公式,并使用Join连接值

=Join(Parameters!ReportParameter1.Value, "|")

DAX:

EVALUATE(
SUMMARIZECOLUMS(
'Item'[Category]
FILTER(VALUES('Item'[Group]), PATHCONTAINS(@ssrsParam, 'Item'[Group]))
"sales" [value of items]
)