Upload
yzywolfyzy
View
59
Download
1
Embed Size (px)
Citation preview
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íala 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 datosque 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 [http://juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian] (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 delcubo.
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 [http://www.juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian] si queres comprobar sufuncionamiento
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 siquieres 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) nodevuelven 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 [http://www.juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian] si queres comprobar sufuncionamiento
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, sonprovistos 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. Elset(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 tipode 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 [http://www.juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian] si queres comprobar sufuncionamiento
TOPCOUNT y BOTTOMCOUNT
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 [http://www.juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian] 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 [http://www.juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian].
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ñopasado”, “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 [http://en.juantxu.net:8080/jjmondrian/testpage.jsp?query=mondrian] si quieres comprobar sufuncionamiento.
Si quisieramos tenerlo siempre disponible lo podríamos definir como un miembro calculado en el schema MDX y lo tendríamos disponiblecomo 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/s intaxismdx.txt · Ú ltima modificac ión: 2014/01/18 14:03 (editor externo)
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 [http://creativecommons.org/licenses/by-nc-sa/3.0/]