Combinación de varias dimensiones en ejes (anidamiento de dimensiones)
Supongamos que se desea visualizar las unidades vendidas de bicicletas Mountain Bikes profesionales y de recreación en Brasil y España en los años 2001 y 2002.
Esta consulta involucra 3 dimensiones: productos, ubicaciones y fechas. La visualización usando 3 ejes es algo complejo y lo que en general se quiere es presentar esta información siguiendo el formato bi-dimensional y encapsular las 3 dimensiones. La siguiente consulta MDX presenta la información requerida combinando 2 de las dimensiones en un eje.
SELECT {Date.[2001], Date.[2002]} ON COLUMNS, { (Location.[Brazil], Products.[Mountain Bikes].[Professional]), (Location.[Brazil], Products.[Mountain Bikes].[Recreational]), (Location.[Spain], Products.[Mountain Bikes].[Professional]), (Location.[Spain], Products.[Mountain Bikes].[Recreational]) } ON ROWS FROM Demo WHERE (Measures.[Units Sold])
En esta consulta, se plantea por enumeración las combinaciones que nos interesan. El eje de las filas contiene 2 dimensiones, ubicación (Location) y productos (Products). Se puede decir que la dimensión producto está anidada en la dimensión ubicación y se tienen todas las combinaciones de los 2 elementos de interes de cada una de las 2 dimensiones, lo que hace que se tengan 4 tuplas en el eje de las filas. Una tupla en MDX es una combinación de miembros de dimensiones originados de dimensiones diferentes.
Con seguridad que la pregunta que surge aqui es, ¿qué pasa si lo que se quiere visualizar es algo análogo pero considerando todas las líneas de bicicletas Mountain Bikes contra todos los países?. Es decir, ¿qué brinda MDX, nuevamente, como alternativa a la enumeración?.
MDX brinda la función CrossJoin(). Esta función produce todas las combinaciones de 2 conjuntos (es decir, un "producto cartesiano"). Su uso común es para situaciones como la presentada arriba combinando 2 o mas dimensiones en un único eje a los efectos de visualizar los datos bajo la forma de una matriz bi-dimensional (valga la redundancia).
La siguiente consulta permite visualizar la información que surge de la pregunta anterior.
SELECT {Date.[2001], Date.[2002]} ON COLUMNS, CrossJoin( {Location.children}, {Products.[Mountain Bikes].children}) ON ROWS FROM Demo WHERE (Measures.[Units Sold])
CrossJoin() espera como parámetros 2 conjuntos, de manera que si se necesita realizar un anidamiento de más de dos conjuntos, se debe anidar la invocación a dicha función. Por otro lado, hay que tener en cuenta que los 2 conjuntos sobre los cuales se quiere hacer el producto cartesiano deben originarse a partir de dimensiones diferentes.
select {Measures.[Importe neto], Measures.[Unidades (neto)]} on columns, crossjoin ( { [Articulos].[linea].members}, crossjoin ( { [Regional].[regional].members}, { [Clientes].[canal].members} ) ) on rows from [Ventas (modificado)] where ([Fecha].[Mes actual])
Esta función ofrece una combinación interesante de conjuntos obtenibles a partir de las diferentes dimensiones pero su uso debe tener en cuenta que se trata de una función que tiene un impacto potencial importante en la performance de la consulta MDX.