Tutorial MDX
Tutorial MDX
Tutorial MDX
El objetivo de este breve tutorial es explicar los conceptos básicos del lenguaje MDX así
como servir de introducción
para que el lector puede dar sus primeros pasos con un motor que utilice MDX.
Se utilizará en concreto la especificación de MDX para el servidor OLAP open source de la
suite de BI Pentaho.
ÍNDICE
Pongamos que tenemos un supermercado con una tarjeta de fidelización que nos
permita saber quién compra que y cuando.
El hecho a contar aquí es el mismo ( cantidad de artículos) pero las dimensiones son
aquí las diferentes tiendas y la familia de productos
¿Que edad tienen los clientes que más gastan en mi supermercado ( de media)?
En este caso el hecho es el importe de las ventas y la dimensión son los clientes, o bien
la edad de los clientes, o bien su rango de edad. Lo veremos más adelante.
El MDX es en los sistemas OLAP el equivalente al SQL en los sistemas gestores de bases
de datos relacionales. Eso significa que es el lenguaje a través del cual podemos explotar
la información que reside en los motores OLAP y satisfacer las consultas analíticas de las
que hemos hablado en el capítulo introductorio.
Es un lenguaje de consulta más cercano al lenguaje natural que el sql sin embargo tiene
funciones y formulas que lo hacen muy potente para el análisis de datos.
La principal diferencia del mundo OLAP respecto al mundo relacional radica en que las
estructuras dimensionales están jerarquizadas y se representan en forma de árbol y por
lo tanto existen relaciones entre los diferentes miembros de las dimensiones.
Este hecho hace que el lenguaje MDX disponga de funciones y atributos especiales que
permiten referenciar los diferentes elementos de las dimensiones con expresiones como
MIEMBROS-HIJO , MIEMBROS-PRIMO, MIEMBROS-PADRE,etc... haciendo una analogía
con los árboles genealógicos.
Estas estructuras jerarquizadas son especialmente útiles para poder visualizar los datos
de forma comparada a nivel temporal pero de las dimensiones temporales y sus
particularidades ya hablaremos en otro capítulo.
PeriodsToDate
Funcionalidad: Devuelve un conjunto de miembros del mismo nivel que un miembro
determinado, empezando por el primer miembro del mismo nivel y acabando
con el miembro en cuestión, de acuerdo con la restricción del nivel
especificado en la dimensión de tiempo.
Sintaxis: <Conjunto> PeriodsToDate(<Nivel>, <Miembro>)
Ejemplo: PeriodsToDate([Tiempo].[Mensual].[Semestre],[Tiempo].[Mensual].[Mes].[Agosto
2009]
El siguiente ejemplo devolveria el conjunto de meses desde agosto de 2009
hasta el final del semestre es decir julio y agosto de 2009.
ParallelPeriod
Funcionalidad: Devuelve un miembro de un periodo anterior en la misma posición
relativa que el miembro especificado.
Hay más funciones de tiempo pero con estas sólo pretendo ilustrar el concepto y la
utilidad de estas funciones. Cada uno debera buscar la función que necesite para realizar
sus cálculos y funcionalidades en sus cubos.
Una de las funcionalidades más potentes que ofrece el lenguaje MDX es la posibilidad de
realizar cálculos complejos tanto dinámicos (en función de los datos que se estan
analizando en ese momento) como estáticos. Los cubos multidimensionales trabajan con
medidas (del inglés measures) y con miembros calculados ( calculated members). Las
medidas son las métricas de la tabla de hechos a las que se aplica una función de
agregación (count,distinct count,sum,max,avg,etc...), en otras palabras son las métricas
del negocio en estado puro. Los miembros calculados son tratados como métricas a la
hora de explotar los cubos,sin embargo son mucho más potentes que estas.
Un miembro calculado es una métrica que tiene como valor el resultado de la aplicación
de una fórmula que puede utilizar todos los elementos disponibles en un cubo, así como
otras funciones de MDX disponibles. Veamos un ejemplo sencillo.
Los miembros calculados son realmente muy potentes pues podemos utilizar expresiones
condicionales para mostrar diferente información en función del nivel o las dimensiones
que estamos visualizando. Un segundo ejemplo algo más complejo:
iif([Tiempo.mensual].CurrentMember.Level IS
[Tiempo.mensual].[Mes],[Measures].[promedio mensual],null)
En el ejemplo anterior utilizamos una función condicional de MDX llamada iif que nos
permite asignar valor a un miembro calculado sólo cuando estamos en un nivel
determinado de una dimension. Concretamente este miembro calculado sólo tiene valor
cuando estamos en el nivel Mes de la dimensión temporal, en cualquier otro caso el valor
es nulo.
Aquí podemos ver un ejemplo de como se define una formula más compleja y como se
da un formato especial en función del valor a esa formula.
La fórmula está utilizando una función de agregación para sumar la métrica [Importe
Ventas] haciendo el acumulado de los últimos 5 valores del nivel ( 5 años, 5 meses o 5
semanas) utilizando la función de tiempo ParallelPeriod con el intervalo de los últimos 5
miembros (con ayuda de la funcion Lag(5))
Espero que estos ejemplos os hayan hayan servido para entender la utilidad y la
potencia de los miembros calculados.
Un libro de referencia:
Libro:MDX solutions with Microsoft SQL Server Analysis Services 2005 and Hyperion
Essbase, George Spofford and others, Editorial Wiley