Obscure MDX Month: Current and CurrentOrdinal
Reposted from Chris Webb's blog with the author's permission.
When you are writing an MDX expression, everywhere you use a set you can give that set a name and then reference the name later on. This is known as creating an inline named set, something I have blogged about a few times (see here and here) over the years. When you are iterating over a set using a function like Generate() or Filter(), if you give that set a name you can then use the Current and CurrentOrdinal functions to find out more about the item in the set returned at the current iteration.
Consider the following MDX query on the Adventure Works cube:
SELECT {[Measures].[Internet Sales Amount]} ON 0, {[Customer].[Gender].[Gender].MEMBERS * [Customer].[Marital Status].[Marital Status].MEMBERS} ON 1 FROM [Adventure Works]
It returns a set of four tuples on rows: every combination of Gender and Marital Status:
If you pass the set on rows to the Filter() function and give it a name (for example MySet) you can then use the CurrentOrdinal function to find the 1-based ordinal of the current iteration. This query uses the CurrentOrdinal function to filter the set shown above so only the first and third items in the set are returned:
SELECT {[Measures].[Internet Sales Amount]} ON 0, FILTER( {[Customer].[Gender].[Gender].MEMBERS * [Customer].[Marital Status].[Marital Status].MEMBERS} AS MYSET, MYSET.CURRENTORDINAL=1 OR MYSET.CURRENTORDINAL=3) ON 1 FROM [Adventure Works]
With an inline named set you can also use the Current function to return the tuple at the current iteration. Here’s another query that uses the Current function to remove the tuple (Female, Single) from the set:
SELECT {[Measures].[Internet Sales Amount]} ON 0, FILTER( {[Customer].[Gender].[Gender].MEMBERS * [Customer].[Marital Status].[Marital Status].MEMBERS} AS MYSET, NOT( MYSET.CURRENT IS ([Customer].[Gender].&[F],[Customer].[Marital Status].&[S]) ) ) ON 1 FROM [Adventure Works]
I won’t pretend that these functions are massively useful, but fans of super-complex MDX will enjoy this vintage post where I used them.
Chris has been working with Microsoft BI tools since he started using beta 3 of OLAP Services back in the late 90s. Since then he has worked with Analysis Services in a number of roles (including three years spent with Microsoft Consulting Services) and he is now an independent consultant specialising in complex MDX, Analysis Services cube design and Analysis Services query performance problems. His company website can be found at http://www.crossjoin.co.uk and his blog can be found at http://cwebbbi.wordpress.com/ . |
Tags: mdx