首先,了解 MDX 语法以及它与元组、成员和集合的概念之间的关系非常重要。
元组
使用括号表示一个元组:
(
[Policy].[Policy Status].&[Void],
[Policy].[Tran Type].&[Renewal],
[Measures].[FK Policy Distinct Count]
)
元组只能包含来自任何层次结构的单个成员。
套
要从同一层次结构中的多个成员检索结果,您必须查询一个集合。MDX 集用大括号表示:
{
[Policy].[Policy Status].&[Void],
[Policy].[Policy Status].&[Policy]
}
根据定义,集合是
零个、一个或多个元组的有序集合。
[FK Policy Distinct Count]
因此,如果您希望针对这两个成员查询度量,则集合的元组必须每个都包含度量:
{
( [Policy].[Policy Status].&[Void], [Measures].[FK Policy Distinct Count] ),
( [Policy].[Policy Status].&[Policy], [Measures].[FK Policy Distinct Count] )
}
为了简化这个表达式,可以交叉连接两组不同的维度:
{
[Policy].[Policy Status].&[Void],
[Policy].[Policy Status].&[Policy],
[Policy].[Policy Status].&[Something],
[Policy].[Policy Status].&[Something else],
[Policy].[Policy Status].&[Yet another member]
}
*
{
[Measures].[FK Policy Distinct Count]
}
排除行
现在我们可以定义集合,是时候从集合中删除一些成员了。在您的示例中,听起来您想从一个级别开始(对于 MDX 引擎,这只是多维数据集中的预定义集,其中包括层次结构中该级别的每个成员),并排除某些成员。MDX 有很多在集合上运行的函数,我们将使用EXCEPT
.
该EXCEPT
函数有两个参数,第一个是要从中删除的集合,第二个是应该从第一个中删除的集合。它返回一个集合。
在此示例中,我将假设[Policy].[Policy Status]
是一个属性层次结构,并且它的唯一级别具有唯一名称[Policy].[Policy Status].[Policy Status]
。
EXCEPT(
[Policy].[Policy Status].[Policy Status],
{
[Policy].[Policy Status].&[Void],
[Policy].[Policy Status].&[Policy]
}
)
这将返回[Policy].[Policy Status].[Policy Status]
关卡中的每个成员,除了[Policy].[Policy Status].&[Void]
和[Policy].[Policy Status].&[Policy]
。
为了获得有用的结果,我们可以通过度量来交叉连接结果:
EXCEPT(
[Policy].[Policy Status].[Policy Status],
{
[Policy].[Policy Status].&[Void],
[Policy].[Policy Status].&[Policy]
}
)
*
{
[Measures].[FK Policy Distinct Count]
}
使用集合作为单个成员
集合很好,但有时我们只想将它们视为单个成员,就像您计算的成员要求一样。为此,我们需要使用聚合函数。聚合函数接受一个集合并返回一个代表整个集合的成员。
其中有很多,使用正确的取决于存储在多维数据集中的数据:MIN
、MAX
、COUNT
和SUM
是其中的一些(有关更完整的列表,请参阅MDX 函数参考中的“数字函数”)。在此示例中,我将假设您的维度使用 SUM 进行聚合:
SUM(
EXCEPT(
[Policy].[Policy Status].[Policy Status],
{
[Policy].[Policy Status].&[Void],
[Policy].[Policy Status].&[Policy]
}
),
[Measures].[FK Policy Distinct Count]
)
在这里,我已将要聚合的度量作为第二个参数传递给 SUM。
MDX 是一种复杂的语言,它支持许多常见和不常见的集合操作。如果您还没有,我建议您花时间阅读在线可用的文档,或者自己找一本好的 MDX 书。有很多要知道的:)
<3