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

How to add multiple filters to query?

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

了解 MDX 中的 WHERE 子句的工作原理很重要。 WHERE 子句不过滤行轴,它过滤与 WHERE 子句中指定的成员相交的轴上的维度成员。

REFERENCE

话虽如此,您必须在 WHERE 子句中指定元组或成员集:

示例:

WHERE (STRTOMEMBER(@Year))

STRTOMEMBER() 将包含 [Date].[Year].&[2016] 值的 SSRS 文本参数 (@Year) 转换为有效的 MDX 成员。在这种情况下,WHERE 子句过滤与日期维度中的 2016 年相交的成员轴。

也可以使用STRTOSET传递多个成员进行过滤。

WHERE StrToSet (@Countries, CONSTRAINED)

@Countries 参数是一个文本 SSRS 参数,包含 {[Geography].[Geography].[Country].[Germany],[Geography].[Geography].[Country].[Canada]} 个成员。

在这种情况下,WHERE 子句将过滤 SELECT 子句中指定的与加拿大和德国交叉的成员。

更新:基于 OP 提要。

这应该有效。

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 函数来 select 某些成员在某些条件下。

正如我之前所说,WHERE 子句过滤轴中与给定成员相交的成员。 Filter 函数可用于过滤满足给定条件的成员。

FILTER

Returns the set that results from filtering a specified set based on a search condition.

示例:

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 不在结果中,因为这些月份的客户不符合筛选条件。

希望这对您有所帮助。

多亏 Alejandro 使用 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]

我希望这对面临类似问题的任何人有所帮助。