我正在创建一个包含texbox的SSRS报告,您可以在其中输入某人的ID或名称。我想将此作为过滤器应用于MDX查询。将过滤器应用于数据集是有效的,但报告运行时间太长。
这是查询设计器为我生成的MDX:
SELECT NON EMPTY { [Measures].[Employee Count] } ON COLUMNS
, NON EMPTY { ([Person].[Emplid].[Emplid].ALLMEMBERS
* [Person].[First Name].[First Name].ALLMEMBERS
* [Person].[Last Name].[Last Name].ALLMEMBERS ) }
DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS
FROM [Model]
预期过滤器的逻辑如下:
WHERE SearchParameter = [Emplid] OR [First Name] + [Last Name] like SearchParameter
我可以弄清楚它是如何微调的,我只是在寻找过滤器的正确MDX语法示例。
答案 0 :(得分:1)
了解MDX中的WHERE
子句如何工作非常重要。 WHERE
子句不过滤Rows轴,它过滤与WHERE
子句中指定的成员相交的轴上的维度成员。
话虽如此,您必须在WHERE
子句中指定元组或成员集:
示例:
WHERE (STRTOMEMBER(@Year))
STRTOMEMBER()
将包含@Year
值的SSRS文本参数([Date].[Year].&[2016]
)转换为有效的MDX成员。在这种情况下,WHERE
子句过滤与日期维度中的2016年相交的成员轴。
此外,您可以使用STRTOSET
传递多个成员进行过滤。
WHERE StrToSet (@Countries, CONSTRAINED)
@Countries
参数是一个Text SSRS参数,其中包含{[Geography].[Geography].[Country].[Germany],[Geography].[Geography].[Country].[Canada]}
个成员。
在这种情况下,WHERE
子句将过滤SELECT子句中与加拿大和德国相交的成员。
更新:基于OP Feed。
这应该有用。
SELECT NON EMPTY { [Measures].[Employee Count] } ON COLUMNS,
NON EMPTY
{
( StrToMember ( '[Person].[Emplid].&[123]' ) * [Person].[First Name].[First Name].AllMembers * [Person].[Last Name].[Last Name].AllMembers )
} Dimension Properties MEMBER_CAPTION,
MEMBER_UNIQUE_NAME ON ROWS
FROM [Model]
注意我没有使用WHERE
子句,而是在Axis行中指定成员。
更新:我认为WHERE
子句不适合您的请求,似乎您需要使用FILTER函数根据某些条件选择某些成员。
正如我之前所说,WHERE
子句过滤轴中与给定成员相交的成员。 Filter
函数可用于过滤符合给定条件的成员。
返回基于a过滤指定集合而得到的集合 搜索条件。
实施例
SELECT NON EMPTY
{
[Measures].[Score %]
,[Measures].[Month Key]
} ON COLUMNS,
NON EMPTY
{
([Date].[YMD].[Month Name].&[201301] : [Date].[YMD].[Month Name].&[201307])
*
FILTER
(
[Customer].[Customer Full Name].[Customer Full Name].members,
[Measures].[Score %] <> null
AND
[Measures].[Score %] <> 0
)
} ON ROWS
FROM [Cube]
请注意,在上面的MDX查询中,月份201301
到201307
之间存在交叉连接,并且某些成员符合过滤器函数中指定的条件。这种情况下的标准是Score %
成员不能为空AND
不能为零。
它应该产生这样的东西:
MonthName Customer Full Name Score % Month Key
201301 Customer1 5% 1000
201301 Customer2 3% 1000
201304 Customer1 8% 3500
201306 Customer1 11% 2200
201307 Customer2 13% 3400
注意结果中不存在201302,201303和201305个月,因为这些月份的客户不符合过滤条件。
希望这会对你有帮助。
答案 1 :(得分:0)
感谢亚历杭德罗用FILTER
功能指引我正确的方向,我能够提出一个解决方案。我还必须学习如何使用INSTR
函数将值与参数进行比较。
select {[Measures].[Passed] , [Measures].[Did not pass]} on 0
, filter(
{[Person].[Emplid].Children * [Person].[First Name].Children * [Person].[Last Name].Children * [Training List].[Training Display Name].Children},
instr([Person].[Emplid].currentmember.member_caption, @SearchParameter) > 0
or instr([Person].[First Name].currentmember.member_caption + ' ' + [Person].[Last Name].currentmember.member_caption, @SearchParameter) > 0) on 1
from [Model]
我希望这可以帮助任何面临类似问题的人。