从集合中排除(全部)

时间:2013-09-12 16:49:59

标签: ssas mdx

我正在使用以下内容,但我认为从结果中排除All成员的方法可能更为简单?

WITH 
    SET [Non_All_Distributors] AS
        {FILTER(
            [Distributor Name].members,
            (InStr(1, [Distributor Name].CurrentMember.NAME, "All") = 0) 
            )}
    SET [Non_All_Countries] AS
        {FILTER(
            [Geography Country].members,
            (InStr(1, [Geography Country].CurrentMember.NAME, "All") = 0) 
            )}
SELECT  
    NON EMPTY 
        [Dimension].[Hierarchy].DEFAULTMEMBER 
    ON COLUMNS, 

    NON EMPTY 
        [Non_All_Distributors]
        *
        [Non_All_Countries]
        *
        Tail([Date].[Date - Calendar Month].[Calendar Day].Members,60)  
        *  
        { 
        [Measures].[Revenue], 
        [Measures].[NumClients]
        } 
    ON ROWS 

FROM [OURCUBE]  

2 个答案:

答案 0 :(得分:3)

只需使用

SELECT  
    NON EMPTY 
        [Dimension].[Hierarchy].DEFAULTMEMBER 
    ON COLUMNS, 

    NON EMPTY 
        [dimension of Distributor Name].[Distributor Name].[Distributor Name].Members
        *
        [dimension of Geography Country].[Geography Country].[Geography Country].Members
        *
        Tail([Date].[Date - Calendar Month].[Calendar Day].Members,60)  
        *  
        { 
        [Measures].[Revenue], 
        [Measures].[NumClients]
        } 
    ON ROWS 

FROM [OURCUBE]  

此处无需定义集合。您可以直接在rows子句中声明分发者和国家/地区成员。

通过重复属性名称,您可以将[dim].[attrib name]引用的属性层次结构限制为All成员下面的级别,该成员恰好与该属性具有相同的名称。属性层次结构有两个级别:级别0包含“全部”成员,级别1包含属性的所有成员。 (只有当您没有执行特殊配置(例如将属性设置为不可聚合)时才会出现这种情况,但我认为是标准情况,因为您的层次结构中有All个成员。

除了更简单之外,这个语句运行得更快,因为在许多情况下Filter是一个真正的性能杀手。

答案 1 :(得分:1)

我会使用Descendants函数和AFTER选项如下;这样,您可以获得所有成员下面的层次结构的所有成员:

  select 
     [Measures].[Amount] on 0,  
     Descendants([Customers].[Geography].[All], 1, AFTER ) on 1

  from [Sales]

(编辑:请求使用MSAS Adv.Works:删除距离参数)

select
 Measures].[Order Count] on 0,
 Descendants( [Geography].[Geography].[All], , AFTER ) on 1

from [Adventure Works]