Filter MDX按维度属性计算的成员筛选器

Filter MDX按维度属性计算的成员筛选器,filter,mdx,member,dimension,Filter,Mdx,Member,Dimension,我想创建一个计算成员并按维度对其进行筛选。这是一个工作示例: ( [Policy].[Policy Status].&[Void], [Policy].[Tran Type].&[Renewal], [Measures].[FK Policy Distinct Count] ) 但如果我想像这样过滤它 ( [Policy].[Policy Status].&[Void], [Policy].[Policy Status].&

我想创建一个计算成员并按维度对其进行筛选。这是一个工作示例:

(
    [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语法以及它如何与的概念相关很重要

多元组 使用括号表示元组:

(
  [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
功能,第一个是要从中删除的集合,第二个是应该从第一个集合中删除的集合。它返回一个集合

在本例中,我将假定
[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
(有关更完整的列表,请参阅中的“数值函数”)。在本例中,我将使用SUM:

SUM(
  EXCEPT(
    [Policy].[Policy Status].[Policy Status],
    {
      [Policy].[Policy Status].&[Void],
      [Policy].[Policy Status].&[Policy]
    }
  ),
  [Measures].[FK Policy Distinct Count]
)
在这里,我将要聚合的度量值作为第二个要求和的参数传递


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

请尝试以下语法:

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

谢谢你这么详细的解释。我在计算成员(表单视图)字段中尝试了这些查询,但没有一个有效。它抛出以下错误:“函数要求参数使用字符串或数值表达式。元组集表达式用于在单个成员中使用从集合收集的结果,该集合需要使用聚合函数进行转换。其中最容易使用的是聚合,因为它会自动为集合选择正确的聚合类型(总和、最小值、最大值等)。将计算成员定义为
AGGREGATE(SetExpression)
将允许您将结果用作单个成员。我会在答案中加上这个。我尝试了聚合,但仍然返回错误:“聚合函数不能用于度量维度中的计算成员”。我从答案中复制/粘贴了你的例子,但这不够公平。若要使
AGGREGATE
工作,多维数据集必须已经定义了一个聚合函数——因此,它只能在最简单的查询中工作。