Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual de MDX
MDX
Meritxell 25 Septiembre, 2014 - 11:58
MDX ayuda a crear Reports con más facilidad que con SQL, ya que con SQL tenemos que
ir especificando todas las relaciones de las tablas para poder sacar un dato en concreto, en
cambio, en MDX ya esta todo relacionado a priori.
En las diferentes secciones y páginas que componen este manual de MDX aprenderás qué
es este lenguaje de consulta tan utilizado en entornos OLAP, en qué se diferencia con el
lenguaje SQL para consultas de bases de datos, y cómo se utiliza MDX.
Se enseña cómo son las Queries de MDX, y cuáles son sus principales funciones,
expresiones y operadores, cómo trabajar con miembros de las jerarquías de los cubos, con
miembros calculados, o cómo gestionar cubos con el lenguaje MDX modificando
miembres, creando nuevos miembros de cubos, trasladando miembros de una dimensión a
otra, o eliminando miembros.
MDX ayuda a crear Reports con más facilidad que con SQL, ya que con SQL tenemos que
ir especificando todas las relaciones de las tablas para poder sacar un dato en concreto. En
cambio, en MDX ya esta todo relacionado a priori.
Conceptos Básicos
Conceptos Básicos Meritxell 29 Septiembre, 2014 - 10:57
Las dimensiones son atributos estructurales del cubo y más especificamente, son jerarquías
organizadas en niveles que describen los datos en la tabla de hechos.
Las medidas al interno del MDX son tratadas como una dimensión no con jerarquías sino
plana.
En la figura siguiente se muestra como se representaría un cubo. Cada celda del cubo tiene
unas coordenadas multidimensionales.
Ejemplo:
([Mesures].[OrderCount], [Date]. [CalendarYear].&[2004])
El símbolo & se pone para referirnos a un miembro clave (Key Member) si no lo ponemos
nos referimos al nombre del miembro (MemberName).
Miembros
Miembros Meritxell 2 Octubre, 2014 - 12:14
Cada jerarquía de una dimensión contiene uno o más items que son denominados
Miembros. Cada miembro corresponde a un valor dentro de la tabla dimensión.
En esta imagen podemos ver unas cuantas dimensiones con sus correspondientes miembros
organizados por jerarquías.
➢ El nombre de la dimensión
➢ El nombre de la jerarquía
➢ El nombre del nivel
Por ejemplo, si se quiere acceder al miembro Q1 CY 2004 en de la jerarquía Calendar se
representa de la siguiente manera:
Como podemos ver los corchetes [] se usan para delimitar los nombres de las dimensiones,
las jerarquía, los niveles y los miembros. Los corchetes no son obligatorios, pero si el
nombre de la dimensión, jerarquía nivel o miembro tienen algún espacio si que serán
obligatorios.
Las siguientes tres represantaciones para acceder al miembro Q1 CY 2004, son válidas:
Dimension.Jerarquía.MemberName
En la segunda representación hace un recorrido por todos los miembros hasta llegar al que
se quiere.
La última representación hace un recorrido usando las llaves de los miembros.
Como hemos dicho antes el símbolo & nos indica que nos estamos refiriendo a la llave del
miembro.
Ejemplo:
Si nosotros queremos el miembro con nombre Ramon y con clave &1 me dará exactamente
ese miembro, si por el contrario solo ponemos el nombre del miembro, Ramon, me sacará
todos los miembros que se llaman Ramon, ya que Ramon no es una clave primaria.
Ejemplo con cubo Analysis DW: queremos coger de la dimension cliente, el cliente Ramon
Sanchez Perez.
[DimensionName].[HierarchyName].[LevelName].[MemberName]
2. Queries en MDX.
2. Queries en MDX. Meritxell 29 Septiembre, 2014 - 11:22
La sintaxis es la siguiente:
Puedes ver que las clausulas WITH y WHERE son opcionales, porque estan indicadas con
[].
SELECT
FROM [Adventure Works]
Para indicar los axis o ejes, se debe especificar el conjunto de datos que quieres sacar y si lo
quieres sacar en las columnas o en las filas.
Por tanto:
➢ La clausula FROM usada para especificar el nombre del cubo donde esta guardada la
información que se quiere sacar.
➢ La clausula WHERE usada para filtrar una pequeña sección de datos de los cuales
quieres sacar los resultados.
➢ La cláusula WITH sirve para crear calculos o conjuntos que se usaran en las queries
sucesivas a esta cláusula. Esta cláusula se usa normalmente para definir y crear miembros
calculados y conjuntos con nombre. Más adelante se explicará con más detalle.
Resultado:
Resultado:
Resultado:
select [Measures].[Importe Pedido] on columns,
[Dim Cliente].[Zonas Clientes].members on rows
from [Analysis DW]
where [Zona Pedido].[Nombre Zona].&[Barcelones]
Resultado:
Resultado:
Un conjunto se puede definir a priori asignándole un nombre y así cada vez que se quiera
hacer referencia a ese conjunto no se tendra que especificar cada celda sino el nombre de
ese conjunto previamente definido. A esto se le llama Conjunto con Nombre o Named Sets.
Cada conjunto se deberá delimitar entre {}. Si hay uno solo no es necesario, pero si por el
contrario hay más de uno se deberán poner.
Resultado:
La misma query usando un conjunto con nombre y por tanto usando la clausula with y así
una vez definido solo poniendo el nombre del conjunto ya lo reconoce
Resultado:
Creación de un conjunto con nombre con SSAS
El problema es que no se puede visualizar dentro del browser del SSAS, sino que se tiene
que visualizar haciendo una Query como esta:
Resultado:
Miembros Calculados
Miembros Calculados Dataprix 29 Septiembre, 2014 - 15:27
Los miembros Calculados son cálculos hechos con expresiones MDX. Un ejemplo típico
de miembro calculado es el calculo Year-To-Date (YTD) de las ventas de los productos.
Esto puede ser especificado por una expresión MDX usando la cláusula WITH. Por tanto,
se podrán devolver las ventas no sólo de cada mes sino también las ventas de los meses
desde inicio de año hasta el mes corriente.
El Solve_Order es un parámetro opcional el valor del cual debe ser un entero positivo. Este
parámetro determina el orden en que deben ser evaluados los miembros siempre y cuando
se hayan definido más de un miembro dentro de la clausula WITH.
Los miembros calculados pueden ser utilizados como medidas o como miembros. Por tanto,
si creamos un miembro tenemos que especificar dónde se quiere guardar su definición, si
en la dimensión Measures y por tanto será una medida, o por el contrario en cualquier otra
dimensión, que entonces será un miembro.
Para crear estos miembros MDX dispone de una gama de funciones que ofrecen una
extrema flexibilidad a la hora de manipular los datos multidimensionales.
Resultado:
Combinación de Miembros calculados y conjuntos con nombres dentro de
una misma clausula WITH
Resultado:
Vamos a añadir un miembro dentro de una dimensión y no como una medida. El miembro
lo añadiremos en el año de la dimensión dim_periodo y calculará el sumatorio de los
años 2005 y 2006.
Resultado:
Expresiones MDX
Expresiones MDX Meritxell 29 Septiembre, 2014 - 15:33
Las expresiones MDX sirven para evaluar un valor. Son usadas en cálculos o para
definir valores de objetos como default member o default measures o para definir
expresiones de seguridad que permitiran o denegaran el acceso a los datos.
Las expresiones MDX normalmente toman un miembro, una tupla o un conjunto como
parámetro y devuelven un valor. Si el resultado de evaluar la expresión MDX no tiene valor
devuelve NULL.
Este ejemplo devuelve el valor por defecto de la jerarquía Zonas Clientes de la Dimension:
[Dim Cliente].[Zonas Clientes].DEFAULTMEMBER
Resultado:
Este ejemplo devuelve para cada Zona de cliente la diferencia de importe que hay respecto
a la zona de Barcelona:
Navegación
Navegación Meritxell 29 Septiembre, 2014 - 15:53
CurrentMember
CurrentMember Meritxell 2 Octubre, 2014 - 12:18
Esta función incluye otra llamada name que nos informa del nombre del miembro corriente.
Resultado:
DefaultMember
DefaultMember Meritxell 2 Octubre, 2014 - 12:18
Para seguir con el ejemplo anterior, si queremos saber el miembro por defecto de la
dimension Cliente haremos lo siguiente:
Resultado:
Como podemos ver, es el mismo resultado ya que en este caso el miembro corriente y el
miembro de default es el mismo.
Children
Children Meritxell 2 Octubre, 2014 - 12:19
La función Children de MDX saca a partir de un miembro de una jerarquía todos sus hijos.
Ejemplo:
Resultado:
PrevMember
PrevMember Meritxell 2 Octubre, 2014 - 12:21
Ejemplo:
Queremos saber el importe de los pedidos del año 2006 y de su miembro anterior, es decir,
del 2005.
Resultado:
Ascendants
Ascendants Meritxell 2 Octubre, 2014 - 12:23
Ejemplo:
Query que devuelve el importe de pedidos por cada uno de los antecesores del mes de
marzo del 2006
Resultado:
Descendants
Descendants Meritxell 2 Octubre, 2014 - 12:24
Sintaxis:
Ejemplo:
Importe de los descendientes del año 2006 a nivel de mes, sabiendo que la jeraquia es año-
trimestre-mes-fecha
Resultado:
Resultado:
Operadores
Operadores Meritxell 2 Octubre, 2014 - 10:54
Si por ejemplo, tienes un conjunto {Barcelona, Girona} y otro {2003, 2004, 2005} y
quieres hacer el producto se representará de la siguiente manera:
Operador +
Se quiere unir la ciudad Barcelona con la ciudad Girona usando el operador + la expresión
MDX sería:
Operador *
Se quiere hacer una combinación entre dos conjuntos, por ejemplo, las zonas Barcelona y
Girona con las categorías de producto hardware y software:
Para poder ver cómo se usaría este operador en una Query usamos un conjunto con nombre
dentro de la clausula WITH:
Resultado:
En este resultado podemos observar cómo se han hecho todas las posibles combinaciones.
Si le ponemos la medida importe veremos cómo por cada combinación, en este caso zona-
pedido, se calcula el importe correspondiente.
Resultado:
Operadores de Comparación
Operadores de Comparación Meritxell 2 Octubre, 2014 - 11:16
Los operadores de comparación de MDX son los habituales: <, <=, >, >=, =, y <>.
Un ejemplo sería:
Esto nos diría si el numero de miembros de esta jerarquía es mayor que 3 o no.
Operadores lógicos
Operadores lógicos Meritxell 2 Octubre, 2014 - 11:19
Los operadores lógicos en MDX son: AND, OR, XOR, NOT, and IS.
Estos operadores usan dos expresiones MDX como argumentos y devuelven TRUE o
FALSE.
El operador {} permite encapsular una celda o un conjunto de celdas. Si es una única celda
el operador es opcional, porque MDX lo pone por defecto.
El operador ‘,’ se usa para separar los diferentes miembros dentro de un conjunto.
Por ejemplo:
El operador ':' se usa para definir rangos. Por tanto, cuando pongamos dos miembros no
consecutivos de un conjunto separados por este operador significa que cogera todos los
miembros desde el miembro antes del operador hasta el miembro de después del operador.
Ejemplo:
{[Dim Cliente].[Ciudad].&[Barcelona]:[Dim Cliente].[Ciudad].&[Vilafranca]}
Esto nos daria como resultado todas las ciudades que hay entre Barcelona y Vilafranca
(ambas incluídas) dentro del cubo.
Resultado:
IIF
IIF Meritxell 2 Octubre, 2014 - 11:34
Esta función equivale al clásico condicional 'IF' y te permite dependiendo del valor que
devuelve la expresión lógica hacer una cosa u otra.
Este ejemplo pondrá el color del texto en rojo si la cantidad pedida es iguala 1 y en verde si
es diferente de 1.
Otro ejemplo sería que si el miembro corriente de la dimensión Measures está vacío saldrá
‘YES’, si por el contrario está informado saldrá ‘NO’
SUM
SUM Meritxell 2 Octubre, 2014 - 11:37
Ejemplo:
En SSAS quedaría:
Count
Count Meritxell 2 Octubre, 2014 - 11:38
En esta función podemos especificar si se quiere excluir o incluir las celdas vacías en el
cálculo.
CROSSJOIN
CROSSJOIN Meritxell 2 Octubre, 2014 - 11:42
Esta expresión combina las zonas 'Barcelones' y 'Girones' con las categorías de producto
'hardware' y 'software'.
Para comprobarlo hacemos la siguiente query:
Resultado:
Filter
Filter Meritxell 2 Octubre, 2014 - 11:48
Esta función toma un conjunto y una expresión booleana como argumentos y devuelve un
subconjunto si la expresión booleana es TRUE.
Este ejemplo muestra del conjunto de los productos sólo los que tienen un importe de
pedido superior a 1000€.
Resultado:
Resultado:
Como se puede observar sólo hay dos productos que superan los 1000€ de importe de
pedido, y se corresponden con los productos resultantes de usar la funcion Filter anterior.
Order
Order Meritxell 2 Octubre, 2014 - 11:53
Resultado:
La query es:
y el resultado:
AVG
AVG Meritxell 2 Octubre, 2014 - 11:56
Esta función devuelve la media de los miembros de una jerarquía con respecto a su
padre. Hemos de especificar el nivel para que no de resultados alterados.
Funciones de Tiempo
Funciones de Tiempo Meritxell 2 Octubre, 2014 - 11:57
Parallel Period
Parallel Period Meritxell 2 Octubre, 2014 - 11:59
Esta funcion devuelve el periodo paralelo al corriente. Por tanto, dado un nivel de jerarquía,
un número y la medida que queremos analizar nos da el valor de la misma medida en el
periodo paralelo. Por tanto, si estás sobre el mes irá al mes anterior, si estamos sobre el año
te dará el año anterior,...
Queremos saber el el importe de pedidos para el periodo año, trimestre, mes, fecha del año
pasado de los productos.
Esto seria:
Configuración de esta función añadiéndola como un miembro calculado dentro del entorno
de SSAS
YTD( [«Member»] )
Esta función devuelve un miembro desde el inicio del año hasta ahora.
Si hacemos la YTD a fecha de hoy de los importes, devolverá la suma de los importes
desde inicio de año hasta hoy.
Ejemplo de YearToDate en MDX
Se ha configurado también a través del entorno SSAS que si la cantidad pedida es igual a 1
se pone en rojo el importe y si es mayor se pone en verde. La pantalla de SSAS queda de la
siguiente manera:
Otras funciones de MDX muy parecidas a YTD son: QTD (Quarter To Date), MTD (Month
To Date), WTD (Week To Date)
Periods To Date
Periods To Date Meritxell 2 Octubre, 2014 - 12:05
Esta función devuelve el conjunto de miembros del nivel especificado que van del primer
miembro hasta el especificado.
Si queremos sacar el conjunto de miembros del nivel año hasta el mes de Abril de 2006
En SSAS sería:
Las funciones que se pueden hacer para gestionar los cubos son:
Mover Miembros De una Dimensión a otra
Mover Miembros De una Dimensión a otra Meritxell 2 Octubre, 2014 - 12:10
Eliminar un Miembro
Eliminar un Miembro Meritxell 2 Octubre, 2014 - 12:11