Ssas 获取具有MDX中具有成员属性的任何子体的所有成员的集合

Ssas 获取具有MDX中具有成员属性的任何子体的所有成员的集合,ssas,mdx,Ssas,Mdx,我试图根据仅在叶级别设置的成员属性,在层次结构中的各个级别筛选成员 我在较低级别上设置了一个成员属性,并试图通过它筛选较高级别的成员。是否可以获取一组具有该属性的任何后代的成员? 其目的是过滤层次结构中的可见成员,为此,我需要一个度量值,该度量值为属性Synlig=1的每个成员返回1,否则为null。问题是可见成员的父级也应该在度量值中获得1,否则它们将被隐藏 create member currentcube.[Measures].[Filter] as iif(count( filte

我试图根据仅在叶级别设置的成员属性,在层次结构中的各个级别筛选成员

我在较低级别上设置了一个成员属性,并试图通过它筛选较高级别的成员。是否可以获取一组具有该属性的任何后代的成员? 其目的是过滤层次结构中的可见成员,为此,我需要一个度量值,该度量值为属性Synlig=1的每个成员返回1,否则为null。问题是可见成员的父级也应该在度量值中获得1,否则它们将被隐藏

create member currentcube.[Measures].[Filter] as
iif(count(
   filter([Konto].[Konto]
    ,[Konto].[Konto].Properties( "Synlig" ) = '1'
    )
) > 0, 1, null)

这将给出属性Synlig=1的所有叶子。叶级别是层次结构中存在属性Synlig的第四个级别。 我还想显示设置为可见的任何成员的所有标题,所以我也需要所有这些标题。对于所有成员上具有Synlig=1的任何后代的度量值,为1

我唯一的解决方案是在3个计算列中复制属性,层次结构中每个级别一个 并且做:


由于我没有您的多维数据集可供尝试,因此我将仅给出基于Adventure Works多维数据集的解决方案,但原则是相同的:

因此,基本上,您希望标记层次结构中的任何成员,该成员在叶级别上有一个将特定属性设置为特定值的子体(在您的示例中,Synlig属性设置为1)

在AdventureWorks中,我将创建MyFilter度量值,如果Date.Calendar层次结构的任何成员在叶子级别上有一个名属性设置为“2005年1月1日”的后代,则该度量值将标记为1。代码如下所示:

with member Measures.MyFilter as count(FILTER( Descendants([Date].[Calendar].CURRENTMEMBER, ,leaves) 
,[Date].[Calendar].CURRENTMEMBER.PROPERTIES("Name") =  'January 1, 2005' ))

  select MyFilter on 0,
 [Date].[Calendar].members on 1
  from [Adventure Works]
with member Measures.MyFilter as count(FILTER( Descendants([Date].[Calendar].CURRENTMEMBER, ,leaves) 
,[Date].[Calendar].CURRENTMEMBER.PROPERTIES("Name") =  'January 1, 2005' ))

  select MyFilter on 0,
  FILTER([Date].[Calendar].members, Measures.MyFilter>0) on 1
  from [Adventure Works]

因此,您将使用子体([Date].[Calendar].CURRENTMEMBER,leaves),对层次结构中的所有叶子进行筛选,然后使用以下条件筛选这组叶子
[Date].[Calendar].CURRENTMEMBER.PROPERTIES(“Name”)=“2005年1月1日”
,最后您将只计算该组中剩余的成员数。因此,
“2005年1月1日”
及其层次结构上的所有父级都将MyFilter设置为1,如图所示

如果希望结果集仅由MyFilter值设置为1的成员组成,则只需添加如下筛选器:

with member Measures.MyFilter as count(FILTER( Descendants([Date].[Calendar].CURRENTMEMBER, ,leaves) 
,[Date].[Calendar].CURRENTMEMBER.PROPERTIES("Name") =  'January 1, 2005' ))

  select MyFilter on 0,
 [Date].[Calendar].members on 1
  from [Adventure Works]
with member Measures.MyFilter as count(FILTER( Descendants([Date].[Calendar].CURRENTMEMBER, ,leaves) 
,[Date].[Calendar].CURRENTMEMBER.PROPERTIES("Name") =  'January 1, 2005' ))

  select MyFilter on 0,
  FILTER([Date].[Calendar].members, Measures.MyFilter>0) on 1
  from [Adventure Works]

我通过添加“Synlig”列来解决这个问题,该列不是作为属性,而是创建了一个带有事实关系(维度和度量在同一个表中)的度量形式

实际上是一个计算列,Synlig是int而不是bit。然后它将聚合起来,在上面的示例中,我想要的所有成员都将是0,并且下面至少有一个Synlig=1的所有成员都将大于0