Como hemos dicho en la la introducción a MDX la sintaxis es parecida a SQL. Aunque al añadir los conceptos de Dimensión y Jerarquía la cosa se complica un poco mas.
La primera gran diferencia son los filtros.
En MDX hay 2 formas de interpretar los filtros. Al igual que en SQL los datos se filtran a través de WHEREs. MDX contempla:
Subset de la información. Subset del cubo. Defines unos WHERE en función de algunas de las dimensiones y te quedas con un área del cubo.
select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
[tiempo.tiempo].[todo].Children ON ROWS
from [cubo_hipotecas]
where [tipo_finca.tipo_finca].[todo].[RUSTICAS].[RUSTICAS]
Puedes jugar con esta consulta aqui si queres comprobar su funcionamiento
Los filtros te permiten hacer una selección de los miembros a mostrar en función de una condición que tu estableces. Por ejemplo si quieres mostrar sólo los importes mayores que 1000.
A diferencia del SLICER (implementado mediante la clausula where) los filtros (implementados mediante la condición FILTER) no devuelven todo un area del cubo sinó los miembros que satisfacen la condición.
select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
Filter(
[tiempo.tiempo].[todo].Children,
([Measures].[cantidad] > 20000.0)
) ON ROWS
from [cubo_hipotecas]
Puedes jugar con esta consulta aqui si queres comprobar su funcionamiento
La sintaxis es:
Filter( Dimensión , condición )
Otra de las clausulas mas utilizadas y requeridas es la que nos permite ordenar los resultados. Los resultados, por defecto, son provistos tal y como están dispuestos o bien ordenados alfabéticamente por alguna de las dimensiones. Pero, la mayoría de las veces, ese no es el orden que queremos. Queremos poder ordenar según el valor de alguna de las medidas.
Para ordenar los resultados en función se una medida se utiliza la función ORDER. La función ORDER espera 3 parámetros. El set(dimensión/jerarquía) que va a ordenar, la expresión en función de la que va a ordenar (la medida,miembro calculado, etc) y el tipo de ordenación que deba hacer.
ORDER ( set, factor de ordenación, sentido de la ordenación)
select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
Order(
[tiempo.tiempo].[todo].Children,
[Measures].[cantidad]
, BDESC)
ON ROWS
from [cubo_hipotecas]
Puedes jugar con esta consulta aqui si queres comprobar su funcionamiento
Despues de ordenar los resultados, también podemos quedarnos directamente con los X primeros o últimos.
Esta función nos permite coger los X primeros o últimos miembros de un set y su sintaxis es:
TOPCOUNT( SET , LIMITE , MEDIDAD DE ORDENACIÓN )
Por ejemplo:
select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
TopCount([tiempo.tiempo].[todo].Children,
5.0,
[Measures].[cantidad]
) ON ROWS
from [cubo_hipotecas]
Lo mismo funciona con BOTTONCOUNT
Puedes jugar con esta consulta aqui si queres comprobar su funcionamiento.
La gracia de las vistas OLAP y de MDX es poder combinar mas de una dimensión por eje. Eso se hace mediante la función CROSSJOIN. No deja de ser una función similar al join del SQL.
La sintaxis es:
CROSSJOIN(
{SET},
{SET}
)
por ejemplo:
select
{[Measures].[cantidad], [Measures].[importe]}
ON COLUMNS,
Crossjoin(
{[tiempo.tiempo].[todo].Children},
{ [tipo_finca].Children}
) ON ROWS
from [cubo_hipotecas]