Search code examples
ssasmdxolap

MDX: Create a set excluding entries from a different hierarcy


I am trying to create a custom set which excludes entries from another hierarchy, and I can't use the except function because of this. I have tried this, but I get an error message saying that the hierarchy is shown more than once in the query. Could someone please advise me on how to do this in the best way?

WITH 
SET [Market1] AS {
    [Market].[Market].[Market].&[103],
    -([Agency].[Nationality - Consortium - Agency].[Nationality].&[111], 
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[116], 
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[242], 
    [Agency].[Nationality - Consortium - Agency].[Nationality].&[134])
}

EDIT: Here is my query (most of it is built from a query builder)

WITH 
SET [Market1] AS SUM((
    [Market].[Market].[Market].&[103],
    EXCEPT({[Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS}, 
        {[Agency].[Nationality - Consortium - Agency].[Nationality].&[111], 
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[116], 
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[242], 
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[134]}
    )), [Measures].[Price])
SELECT NON EMPTY [Market1] ON ROWS
FROM ( SELECT ( { StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718)) + "]") } ) ON COLUMNS
FROM ( SELECT ( { [Travel Type].[Travel Type].&[101],
                  [Travel Type].[Travel Type].&[102],
                  [Travel Type].[Travel Type].&[103] } ) ON COLUMNS
FROM ( SELECT ( { [Departure Date].[Year].&[2017] } ) ON COLUMNS
FROM [Booking]))) 
WHERE ( [Departure Date].[Year].&[2017], 
        [Travel Type].[Travel Type].CurrentMember,
        StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718)) + "]") )

EDIT2: Managed to hack it together

WITH 
SET [Market1] AS (
    [Market].[Market].[Market].&[103],
    EXCEPT({[Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS}, 
        {[Agency].[Nationality - Consortium - Agency].[Nationality].&[111], 
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[116], 
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[242], 
        [Agency].[Nationality - Consortium - Agency].[Nationality].&[134]}
    ))
MEMBER Agg AS SUM  
   ( [Market1], [Measures].[Price]  
    )  
SELECT NON EMPTY Agg ON COLUMNS
FROM ( SELECT ( { StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718)) + "]") } ) ON COLUMNS
FROM ( SELECT ( { [Travel Type].[Travel Type].&[101],
                  [Travel Type].[Travel Type].&[102],
                  [Travel Type].[Travel Type].&[103] } ) ON COLUMNS
FROM ( SELECT ( { [Departure Date].[Year].&[2017] } ) ON COLUMNS
FROM [Booking]))) 
WHERE ( [Departure Date].[Year].&[2017], 
        [Travel Type].[Travel Type].CurrentMember,
        StrToMember("[Report Date].[Report Date].&[" + Str(Int(CDbl(Now()) - 38718)) + "]") )

Solution

  • You cannot do it this way. You want to limit data from different dimensions, so you have to use tuple:

    WITH 
    SET [Market1] AS (
        [Market].[Market].[Market].&[103],
        EXCEPT([Agency].[Nationality - Consortium - Agency].[Nationality].ALLMEMBERS, 
            {([Agency].[Nationality - Consortium - Agency].[Nationality].&[111], 
            [Agency].[Nationality - Consortium - Agency].[Nationality].&[116], 
            [Agency].[Nationality - Consortium - Agency].[Nationality].&[242], 
            [Agency].[Nationality - Consortium - Agency].[Nationality].&[134]}
        )