如何添加多个过滤器进行查询?
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
子句中指定的成员相交的轴上的维度成员。
话虽如此,您必须在 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
函数可用于过滤满足给定条件的成员。
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 查询中,月份 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 不在结果中,因为这些月份的客户不符合筛选条件。
希望这对您有所帮助。
多亏 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]
我希望这对面临类似问题的任何人有所帮助。
我正在创建一个 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
子句中指定的成员相交的轴上的维度成员。
话虽如此,您必须在 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
函数可用于过滤满足给定条件的成员。
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 查询中,月份 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 不在结果中,因为这些月份的客户不符合筛选条件。
希望这对您有所帮助。
多亏 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]
我希望这对面临类似问题的任何人有所帮助。