Slice on a Calculated Member that uses the Aggregate function

Applies to: SQL Server 2005 Analysis Services, SQL Server 2008 Analysis Services, SQL Server 2008 R2 Analysis Services, SQL Server 2012 Analysis Services Multidimensional Model

A user reported seeing two different behaviors by running two slightly different MDXs statement with a where clause on a calculated member that used the Aggregation function. In this post, we will try to look at the 2 queries in question and explain the difference in behavior with the Adventure works  Sample DB. 

Query 1

WITH

  MEMBER [Product].[Category].[x] AS

    Aggregate({[Product].[Category].[Bikes],[Product].[Category].[Accessories]})

SELECT

  (

    [Measures].[Internet Sales Amount]

   ,{

      [Date].[Calendar Year].[CY 2005] : [Date].[Calendar Year].[CY 2008]

    }

  ) ON 0

 ,{

    [Product].[Product Categories].[All Products]

   ,[Product].[Product Categories].[Category].ALLMEMBERS

  } ON 1

FROM [Adventure Works]

WHERE

  [Product].[Category].[x];

Result:

 

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

 

CY 2005

CY 2006

CY 2007

CY 2008

All Products

$3,266,373.66

$6,530,343.53

$9,791,060.30

$9,770,899.74

Accessories

(null)

(null)

$293,709.71

$407,050.25

Bikes

$3,266,373.66

$6,530,343.53

$9,359,102.62

$9,162,324.85

 

Query 1 produced a meaningful and expected results.

Query 2

WITH

  MEMBER [Product].[Category].[x] AS

    Aggregate(existing{[Product].[Category].[Bikes],[Product].[Category].[Accessories]})

SELECT

  (

    [Measures].[Internet Sales Amount]

   ,{

      [Date].[Calendar Year].[CY 2005] : [Date].[Calendar Year].[CY 2008]

    }

  ) ON 0

 ,{

    [Product].[Product Categories].[All Products]

   ,[Product].[Product Categories].[Category].ALLMEMBERS

  } ON 1

FROM [Adventure Works]

WHERE

  [Product].[Category].[x];

 

Result:

 

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

 

CY 2005

CY 2006

CY 2007

CY 2008

All Products

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Accessories

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Bikes

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Clothing

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Components

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

 

In query 2, the only thing the user added was the “existing” function (see the yellow highlight above).The behavior of the query 2 was dramatically different. The result values were repeated for each product category in any given year.

Explanation

If a calculated member expression was “aggregate (<static set>)”, it would act like replacing the where clause with that static set.

 

With member

[Product].[Category].[c1] as aggregate (A, B, C)

Select

X,

Y

From <cube>

Where [Product].[Category].[c1]

It acted like:

Select

X,

Y

From <cube>

Where ({A, B, C})

 

In Query 1, the set {[Product].[Category].[Bikes],[Product].[Category].[Accessories]} was static. The query behaved like this:

SELECT

  (

    [Measures].[Internet Sales Amount]

   ,{

      [Date].[Calendar Year].[CY 2005] : [Date].[Calendar Year].[CY 2008]

    }

  ) ON 0

 ,{

    [Product].[Product Categories].[All Products]

   ,[Product].[Product Categories].[Category].ALLMEMBERS

  } ON 1

FROM [Adventure Works]

WHERE

({[Product].[Category].[Bikes],[Product].[Category].[Accessories]})

 

And it produced the same result as we saw in Query 1.

 

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

 

CY 2005

CY 2006

CY 2007

CY 2008

All Products

$3,266,373.66

$6,530,343.53

$9,791,060.30

$9,770,899.74

Accessories

(null)

(null)

$293,709.71

$407,050.25

Bikes

$3,266,373.66

$6,530,343.53

$9,359,102.62

$9,162,324.85

 

What if the set was not static? The replacement did not take place if the set was not static and the set would get computed into numeric values as shown below.

WITH

  MEMBER [Product].[Category].[x] AS

    Aggregate(existing{[Product].[Category].[Bikes],[Product].[Category].[Accessories]})

SELECT

  (

  [Measures].[Internet Sales Amount]

   ,{

      [Date].[Calendar Year].[CY 2005] : [Date].[Calendar Year].[CY 2008]

    }

  ) ON 0

 ,[Product].[Category].[x] ON 1

FROM [Adventure Works];

 

 

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

 

CY 2005

CY 2006

CY 2007

CY 2008

x

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

 

The Query 2, adding “Existing” to the set made the set “NOT static”.  The calculated member got evaluated into numeric values just like above and then populated the entire result with these values.

 

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

Internet Sales Amount

 

CY 2005

CY 2006

CY 2007

CY 2008

All Products

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Accessories

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Bikes

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Clothing

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

Components

$3,266,373.66

$6,530,343.53

$9,652,812.33

$9,569,375.10

 

C S John Lam| SQL Business Intelligence | Premier Field Engineering