Search code examples
mdxmdx-query

MDX: Distinct Count of members summarized by another dimension


From my cube, I am trying to get a distinct count of all non-empty [ID].[FullID]s but summarized by [Underlying].

I know that, for example, there are two IDs for [Underlying].[Underlying1] at this particular WHERE slice and I can see this by running the below MDX query, which clearly gives me a row for each (but a zero count?):

Results:

Underlying  | FullID | CountOf
------------------------------
Underlying1 | ID1    | 0
Underlying1 | ID2    | 0
...

Code:

WITH 
    MEMBER CountOf AS
    DistinctCount([ID].[FullID].Children)
SELECT
    NON EMPTY {[Underlying].Children * [ID].[FullID].Children
    } ON ROWS,
    NON EMPTY {CountOf
    } ON COLUMNS
FROM [MyCube]
WHERE ([Time].&[2018-11-27T00:00:00],
       [Factor].[FactorName].[FACTOR1],
       [Factor].[FactorType].[FACTORTYPE1]
       [Location].[Location1]
       )

However when I remove the * [ID].[FullID].Children I don't get what would like:

What I want:

Underlying  | CountOf
---------------------
Underlying1 | 2
...

What I get:

Underlying  | CountOf
---------------------
Underlying1 | 24
...

There is clearly something else going on here to give me a 24 count, but I cannot figure it out...


Solution

  • You are getting 24 because you measure is counting the members in [ID].[FullID].Children. What i understand is that you want to count the number of [ID].[FullID] who have a fact value availabe against them for [Underlying].Children. So your code should be like this

    WITH 
    MEMBER CountOf AS
    Count(
    nonempty(([Underlying].currentmember,[ID].[FullID].Children),
    [Measures].[ConnectingMeasure])
    )
    SELECT NON EMPTY {[Underlying].Children } ON ROWS,
    NON EMPTY {CountOf} ON COLUMNS
    FROM [MyCube]
    WHERE ([Time].&[2018-11-27T00:00:00],[Factor].[FactorName].[FACTOR1],
    [Factor].[FactorType].[FACTORTYPE1],[Location].[Location1]
    )
    

    Here is a sample of what you want to do in adventureworks. I am trying to count all Promotion, that are present for a product based on the internet sales data.

    WITH 
    MEMBER CountOf AS
    count(nonempty( ([Product].[Product].currentmember, [Promotion].[Promotion].children) ,[Measures].[Internet Sales Amount]))
    SELECT
    NON EMPTY {CountOf} ON COLUMNS,
    NON EMPTY {
    ([Product].[Product].Children )
    } ON ROWS
    FROM [Adventure Works]
    

    //Base query to understand what is counted

    WITH 
    MEMBER CountOf AS
    Count(nonempty( ([Product].[Product].currentmember, [Promotion].[Promotion].children) ,[Measures].[Internet Sales Amount]))
    SELECT
    NON EMPTY [Measures].[Internet Sales Amount] ON COLUMNS,
    NON EMPTY {
    ([Product].[Product].Children,[Promotion].[Promotion].children )
    } ON ROWS
    FROM [Adventure Works]