MultiDimensional eXpressions. Es el lenguaje que se usa para hacer consultas a cubos OLAP
No existe ningún estandard todavía. Y ya que lo inventó Microsoft pues se toma como base el trabajo que hicieron ellos. Yo para estos primeros pasos voy a usar el cubo mondrian que tengo a mano.
Para poder trabajar con su contenido aquí tienes el esquema:
<Cube name="cubo_hipotecas" cache="true" enabled="true"> <Table name="h_hipotecas"></Table> <Dimension type="TimeDimension" foreignKey="tiempo" name="tiempo"> <Hierarchy name="tiempo" hasAll="true" allMemberName="todo" primaryKey="id_tiempo"> <Table name="d_tiempo"> </Table> <Level name="anyo" column="id_anyo" type="Numeric" uniqueMembers="true" levelType="TimeYears"></Level> <Level name="trimestre" column="id_trimestre" uniqueMembers="true" nameColumn="des_trimestre" levelType="TimeQuarters"></Level> <Level name="mes" table="d_tiempo" column="id_mes" nameColumn="des_tiempo" type="Numeric" uniqueMembers="true" levelType="TimeMonths" ></Level> </Hierarchy> </Dimension> <Dimension foreignKey="id_tipo_finca" name="tipo_finca"> <Hierarchy name="tipo_finca" hasAll="true" allMemberName="todo" primaryKey="id_tipo" primaryKeyTable="d_tipo_finca"> <Table name="d_tipo_finca"></Table> <Level name="super tipo" table="d_tipo_finca" column="id_super_tipo" nameColumn="des_super_tipo" type="Numeric" uniqueMembers="false" levelType="Regular" ></Level> <Level name="tipo" table="d_tipo_finca" column="id_tipo" nameColumn="des_tipo" type="Numeric" uniqueMembers="true" levelType="Regular"></Level> </Hierarchy> </Dimension> <Measure name="cantidad" column="numero" aggregator="sum" ></Measure> <Measure name="importe" column="importe" aggregator="sum" ></Measure> </Cube>
… si es una relación de fincas hipotecadas…. ¿y?….
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. Es un poco más complicacado ya que lo que en realidad defines son intersecciones:
La consulta básica de MDX es el select.
SELECT algo ON ROWS algo ON COLUMNS FROM cubo WHERE condicion
A continuación un poco de teoría basada en esta página
Una dimensión es una colección de atributos que se relacionan mediante una jerarquía y que se relacionan a su vez con los hechos de la dimensión de medidas.
Un atributo de dimensión está enlazado a una o más columnas de una tabla de dimensiones y contiene miembros. Un atributo de dimensión puede contener nombres de clientes, de meses o de productos.
Un miembro es un valor de un atributo de dimensión, incluida la dimensión de medidas. Un miembro de una jerarquía puede ser un nivel hoja, un miembro primario, un miembro de datos o un miembro (All).
Una medida es un valor de una tabla de hechos; también se denomina hecho. Por lo general, también se hace referencia a un valor de la dimensión de medidas como miembro. Las medidas suelen ser valores numéricos, pero también pueden ser valores de cadena.
Una dimensión de medidas es la dimensión que contiene todas las medidas de un cubo. Una dimensión de medidas en un tipo especial de dimensión en la que los miembros se suelen agregar (generalmente mediante la suma o el recuento) de acuerdo con el miembro actual de cada atributo de dimensión con el cual existe una medida especificada.
Un grupo de medida es una colección de medidas relacionadas de un cubo. Un cubo puede contener varios grupos de medida.
El miembro (All) es el valor calculado de todos los miembros de una jerarquía de atributo o una jerarquía definida por el usuario.
Un miembro calculado es un miembro de dimensión que se define y calcula en tiempo de consulta. Un miembro calculado puede definirse en una consulta de usuario o en el script de cálculo MDX; se almacena en el servidor. Un miembro calculado corresponde a las filas de la tabla de dimensiones de la dimensión en la que se definen.
Un miembro de datos es un miembro secundario asociado a un miembro primario en una jerarquía de elementos primarios y secundarios. Un miembro de datos contiene el valor de datos de su miembro primario, en lugar del valor agregado de los miembros secundarios del elemento primario.
Un miembro primario es un miembro de una jerarquía de elementos primarios y secundarios que contiene el valor agregado de sus elementos secundarios.
Un miembro hoja es un miembro de una jerarquía que no posee miembros secundarios.
Un miembro secundario es un miembro de una jerarquía situado por debajo del nivel superior.
El atributo clave de una dimensión de base de datos es el atributo al cual están vinculados (directa o indirectamente) todos los atributos que no son clave de la dimensión. El atributo clave también suele ser el atributo de granularidad.
El atributo de una dimensión de cubo que vincula una dimensión con los hechos de un grupo de medida de la dimensión de medidas. Si el atributo de granularidad y el atributo clave son atributos diferentes, los atributos que no son clave deben vincularse, directa o indirectamente, con el atributo de granularidad. Dentro de un cubo, el atributo de granularidad define la granularidad de una dimensión. El nivel mínimo.
Una jerarquía de atributo es una jerarquía de miembros de atributo que contiene los siguientes niveles:
Una tupla identifica de forma exclusiva a una celda según una combinación de miembros. Una tupla puede estar compuesta de uno o mas miembros de la dimensión medidas aunque solo uno de cada una de las demás dimensiones del cubo.
select [Measures].[cantidad] ON COLUMNS, [tiempo].[mes].members ON ROWS from [cubo_hipotecas]
Ejemplos:
| Especificacion | Regla | Sintaxis |
|---|---|---|
| Miembro Único / Dimensión Única | Listar única dimensión | [Dimension].[Member] |
| Miembros Múltiples / Dimensiónes Múltiples | Los miembros se envuelven con parentesis () | ([Dim1].[Miembro], [Dim2].[Miembro], [Dim3].[Miembro]) |
Un conjunto o Set es un conjunto ordenado de tuplas con la misma dimensionalidad. Se utilizan llaves {} para designar un conjunto de tuplas.
select
-- primer conjunto de medidas
{[Measures].[cantidad], [Measures].[importe]}
ON COLUMNS,
{
( -- tupla multi-dimensional
[tiempo.tiempo].[todo], [tipo_finca].[todo]
)
} ON ROWS
from [cubo_hipotecas]
Un eje (axis) es un grupo, o colección, de miembros de una o más dimensiones, organizado como tuplas.
select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
-- se puede tambien especificar un miembro concreto
{[tiempo.tiempo].[2006]} ON ROWS
from [cubo_hipotecas]
Los operadores básicos son las llaves {} , las comas , y los dos puntos :
Ls llaves sirven para distinguir conjuntos ( sets ) y son necesarias para envolver tuplas siempre que las listemos explícitamente.
MDX usa las llaves para empaquetar un conjunto de componentes como ya hemos visto anteriormente.
select
{ -- conjunto 1
[Measures].[cantidad], [Measures].[importe]
} ON COLUMNS,
-- tupla no necesario
[tiempo.tiempo].[2006]
ON ROWS
from [cubo_hipotecas]
fijate que si quitasemos las llaves del conjunto de las columnas la consulta fallaría ya que MDX no sabría reconocer el conjunto.
Las comas (,) sirve para listar, una tras otra, un conjunto de tuplas. Las comas han sido ampliamente usadas a lo largo de este tutorial.
Los dos puntos (:) indican a MDX un rango. El caso mas sencillo de ver es el del tiempo:
select {[Measures].[cantidad], [Measures].[importe]} ON COLUMNS,
-- esto recogerá desde el 2006 hasta el 2008 ambos incluidos
{[tiempo.tiempo].[todo].[2006] : [tiempo.tiempo].[todo].[2008]} ON ROWS
from [cubo_hipotecas]
Todas las consultas estan basadas en este cubo:
Todas las consultas se pueden porbar en esta url.
Si picas en el botón de MDX:
Obtendrás un cuadro de texto donde ejecutar todas las consultas de esta página:
Por último pedirte un poco de paciencia. Ya que trabajas con el Súper Ordenador : Apolonia