MDX按维度属性计算成员过滤器

ili*_*ica 14 mdx member filter dimension

我想创建一个计算成员并按维度过滤它.这是工作示例:

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Tran Type].&[Renewal], 
    [Measures].[FK Policy Distinct Count]
)
Run Code Online (Sandbox Code Playgroud)

但是,如果我想像这样过滤它

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)
Run Code Online (Sandbox Code Playgroud)

比它不工作.它表示在元组中多次显示相同的层次结构.

另一件事是,如何排除行?这是个主意......

(
    ![Policy].[Policy Status].&[Void], 
    ![Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)
Run Code Online (Sandbox Code Playgroud)

Tul*_*x86 47

首先,理解MDX语法以及它如何与元组,成员和集合的概念相关是很重要的.

元组

使用括号表示元组:

(
  [Policy].[Policy Status].&[Void], 
  [Policy].[Tran Type].&[Renewal], 
  [Measures].[FK Policy Distinct Count]
)
Run Code Online (Sandbox Code Playgroud)

元组只能包含任何层次结构中的单个成员.

要从同一层次结构中的多个成员检索结果,您必须查询一个集合.MDX集由大括号表示:

{
  [Policy].[Policy Status].&[Void], 
  [Policy].[Policy Status].&[Policy]
}
Run Code Online (Sandbox Code Playgroud)

根据定义,一套是

零,一个或多个元组的有序集合.

因此,如果您希望[FK Policy Distinct Count]针对这两个成员查询度量,则集合的元组必须包含度量:

{
  ( [Policy].[Policy Status].&[Void],   [Measures].[FK Policy Distinct Count] ), 
  ( [Policy].[Policy Status].&[Policy], [Measures].[FK Policy Distinct Count] )
}
Run Code Online (Sandbox Code Playgroud)

为简化此表达式,可以交叉连接两组不同的维度:

{
  [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]
}
Run Code Online (Sandbox Code Playgroud)

排除行

现在我们可以定义集合了,是时候从一个成员中删除一些成员了.在你的榜样,这听起来像你想的水平(其中,在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]
  }
)
Run Code Online (Sandbox Code Playgroud)

这将返回该[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]
}
Run Code Online (Sandbox Code Playgroud)

使用集合作为单个成员

集合很好,但有时我们想要的就是将它们视为单个成员,就像计算出的成员要求一样.为此,我们需要使用聚合函数.聚合函数接受一个集合并返回表示整个集合的成员.

有许多的这些,并使用存储在您的立方体正确的取决于数据: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]
)
Run Code Online (Sandbox Code Playgroud)

在这里,我已经将要聚合的度量作为第二个参数传递给SUM.


MDX是一种复杂的语言,支持许多常见和不常见的设置操作.如果你还没有,我建议花时间阅读在线提供的文档,或者给自己拿一本好的MDX书.有很多要知道的:)

<3