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

2024-03-07

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

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Tran Type].&[Renewal], 
    [Measures].[FK Policy Distinct Count]
)

但如果我想像这样过滤它

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)

比它不起作用。它表示相同的层次结构在元组中显示多次。

另一件事是,如何排除行?这是这个想法...

(
    ![Policy].[Policy Status].&[Void], 
    ![Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)

首先,了解 MDX 语法以及它与以下概念的关系非常重要:元组、成员和集合 http://msdn.microsoft.com/en-us/library/aa216769%28v=sql.80%29.aspx.

Tuples

使用括号表示一个元组:

(
  [Policy].[Policy Status].&[Void], 
  [Policy].[Tran Type].&[Renewal], 
  [Measures].[FK Policy Distinct Count]
)

元组只能包含来自任何层次结构的单个成员。

Sets

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

{
  [Policy].[Policy Status].&[Void], 
  [Policy].[Policy Status].&[Policy]
}

一组是,根据定义 http://msdn.microsoft.com/en-us/library/aa216769%28v=sql.80%29.aspx,

零个、一个或多个元组的有序集合。

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

{
  ( [Policy].[Policy Status].&[Void],   [Measures].[FK Policy Distinct Count] ), 
  ( [Policy].[Policy Status].&[Policy], [Measures].[FK Policy Distinct Count] )
}

为了简化这个表达式,可以交叉连接 http://msdn.microsoft.com/en-us/library/ms144816.aspx两组不同维度:

{
  [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.

The EXCEPT功能有两个参数 http://technet.microsoft.com/en-us/library/ms144900.aspx,第一个是要从中删除的集合,第二个是应该从第一个集合中删除的集合。它返回一个集合。

在这个例子中,我假设[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] and [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, and SUM其中一些(参见“数字函数”MDX 函数参考 http://msdn.microsoft.com/en-us/library/ms145970.aspx以获得更完整的列表)。在此示例中,我假设您的维度使用 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MDX 按维度属性计算的成员过滤器 的相关文章

随机推荐