如何添加多个过滤器进行查询?

时间:2016-06-02 21:04:45

标签: reporting-services mdx ssms-2012

我正在创建一个包含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语法示例。

2 个答案:

答案 0 :(得分:1)

了解MDX中的WHERE子句如何工作非常重要。 WHERE子句不过滤Rows轴,它过滤与WHERE子句中指定的成员相交的轴上的维度成员。

REFERENCE

话虽如此,您必须在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函数可用于过滤符合给定条件的成员。

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查询中,月份201301201307之间存在交叉连接,并且某些成员符合过滤器函数中指定的条件。这种情况下的标准是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]

我希望这可以帮助任何面临类似问题的人。