Sintaxis MDX

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.

Vamos a recordar la sintaxis básica:

Sintaxis

MDX se parece a SQL. El esquema de la consulta es parecido. Si mediante un select SQL obtienes una tabla unidimensional con datos que se extienden a lo largo. Mediante MDX obtenemos una tabla bidimensional con datos que se extienden a lo largo y ancho.

La consulta básica de MDX es el select.

SELECT
  algo ON ROWS
  algo ON COLUMNS
FROM
  cubo 
WHERE
  condicion

Un ejemplo de una consulta básica es el siguiente:

¡¡¡ Que puedes probar tu mismo aqui (apretando al botón de MDX)!!!!.

Recuerda que la estructura de nuestro cubo es:

  • Cubo: cubo_hipotecas
    • Dimensiones
      • Dimensión : tiempo
        • Jerarquía:
          • Nivel : anyo
          • Nivel : trimestre
          • Nivel : mes
      • Dimensión : tipo_finca
        • Jerarquía:
          • Nivel : super tipo
          • Nivel : tipo
    • Medida : cantidad
    • Medida : importe

La primera gran diferencia son los filtros.

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:

SLICER

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

FILTERS

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 )

ORDER

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.

  • ASC : Orden ascendente respetando las jerarquías.
  • DESC : Orden descendente respetando las jerarquías.
  • BASC : Orden ascendente absoluto rompiendo (Breaking) las jerarquías.
  • BDESC : Orden descendente absoluto rompiendo (Breaking) las jerarquías.

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

TOPCOUNT y BOTTOMPCOUNT

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.

CROSSJOIN

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]

Aunque es mas fácil usar el operador *

La sintaxis es:

{SET}
*
{SET}

por ejemplo:

select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
  {[tiempo.tiempo].[todo].Children}
    * 
  {[tipo_finca].Children} ON ROWS
from [cubo_hipotecas]

Una vez mas puedes probar la consulta aqui.

Funciones MDX de tiempo

Cuando tenemos una dimensión temporal podemos utilizar las utilísimas funciones de tiempo que nos ofrece MDX.

Estas pueden ser utilizadas de diversas formas, bien mediante un miembro calculado definido en el schema mondrian que nos permita tenerlas disponibles siempre o bien invocandolas directamente en nuestra sentencia MDX.

ParallelPeriod

Devuelve un miembro de un periodo anterior en la misma posición relativa. Es decir, podemos decir, “dame el mismo mes del año pasado”, “dame el mismo primer mes del trimestre pasado”, “o de hace 2 años, o de hace 2 trimestres”

Sintaxis:

<Member> ParallelPeriod()
<Member> ParallelPeriod(<Level>)
<Member> ParallelPeriod(<Level>, <Numeric Expression>)
<Member> ParallelPeriod(<Level>, <Numeric Expression>, <Member>)

Por ejemplo para tener el valor del año pasado pondríamos:

with member [Measures].[anyo pasado] as 'ParallelPeriod([tiempo].[anyo], 1.0) '
select {[Measures].[cantidad],[Measures].[anyo pasado] }ON COLUMNS,
  {[tiempo.tiempo].[todo].Children} ON ROWS
from [cubo_hipotecas]

Puedes jugar con esta consulta aqui si quieres comprobar su funcionamiento.

Si quisieramos tenerlo siempre disponible lo podríamos definir como un miembro calculado en el schema MDX y lo tendríamos disponible como una medida mas.

  <CalculatedMember name="Anyo Pasado" dimension="Measures" formula="ParallelPeriod([tiempo].[anyo], 1.0)">
  </CalculatedMember>

Esto te permite tenerlo como una medida mas:

Volver al índice de MDX

 
olap/sintaxismdx.txt · Última modificación: 2011/06/30 08:32 por juantxu
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki