Acumulado, año anterior y periodos paralelos en MDX
Posted by Miguel Egea | Posted in Analisys Services, MDX | Posted on 04-08-2010
1
En el SolidQuality Summit 2010, preparé una sesión de MDX que fué realmente una sesión a medida de los alumnos, o al menos lo fué en la medida de lo posible. En esa sesion, una de las preguntas iba en el hilo de calcular no solo el acumulado anual, sino también el acumulado anual de años anteriores.
En las siguientes lineas iremos viendo como hacer esto en MDX. La primera parte será crear el acumulado anual, para eso, nos valdremos de una dimensión tiempo bien definida, en este mismo portal tenéis ejemplos de como hacerlo y podéis ver que se entiende por bien definida, así que no me entretendré mucho en esa explicación. Es necesario que esté definida bien como tiempo nuestra dimensión, básicamente porque vamos a usar las funciones YTD() y paralellperiod, ambas necesitan esa definición de forma adecuada. YTD() devuelve un conjunto , que representan en el nivel actual todos los periodos desde el pricipio de año. Paralleperiod, recibe 2 o 3 parámetros, el nivel, el número de elementos y el miembro, en mis ejemplos vereis suministrados 2, el tercero, el miembro será el currentmember de la dimensión tiempo bien definida.
Comenzamos con el acumulado anual, aquí teneis el código para Adventure Works
with member acumuladoanual as sum(ytd(),Measures.[Internet Sales Amount]) select acumuladoanual on 0, [Date].[Calendar].[Month] on 1 from [Adventure Works] |
ytd() es un conjunto, de los meses en este caso, y el sum(ytd(), ventas), lo que hará será sumar todos los valores de la tupla mes,Venta, es decir, mostrará el acumulado del año que estemos visualizando, que es en resumen lo que queríamos conseguir.
De no usar YTD(), podríamos usar funciones equivalentes recorriendo jerarquías, ya sean tiempo o no, y usando rangos… dejamos eso para el lector o para futuras ocasiones.
Lo siguiente que necesitamos es el periodo anterior, es decir, el valor de las ventas para el mismo mes del año anterior. La función que vamos a usar es ParallelPeriod, de la que ya hemos comentado los parámetros. La fórmula quedaría como sigue:
with member anioanterior as
(parallelperiod([Date].[Calendar].[Calendar Year],1),
Measures.[Internet Sales Amount])
select {Measures.[Internet Sales Amount],anioanterior} on 0,
[Date].[Calendar].[Month] on 1
from [Adventure Works] |
El resultado, el esperado, obtendremos el valor de las ventas del mismo mes del año anterior. Esta función es curiosa cuando se trata de otros paralelismos, por ejemplo a nivel de día ¿que pasa con los 29s de febrero de los años bisiestos? La función esta implementada realmente como un Cousin, es decir como el primo al mismo nivel que yo por lo que puede ser que no exista y ponga nulo o que sea otro miembro (como pasa si comienzas tu dimensión tiempo en Julio al estilo de Adventure Works) obteniendo datos que pueden no tener sentido de negocio. Sed cuidadosos con esto y sobre todo comprobadlo .
Y ahora ¿lo usamos todo junto?
with member acumuladoanual as
sum(ytd(),Measures.[Internet Sales Amount])
member anioanterior as
(parallelperiod([Date].[Calendar].[Calendar Year],1),
Measures.[Internet Sales Amount])
member anioanterioracum as
(parallelperiod([Date].[Calendar].[Calendar Year],1),
Measures.[acumuladoanual])
select {Measures.[internet Sales Amount],anioanterior,acumuladoanual,anioanterioracum} on 0,
[Date].[Calendar].[Month] on 1
from [Adventure Works] |
En este caso estaremos obteniendo por un lado, el importe de ventas, las ventas del mismo periodo del año anterior, el acumulado de este año, y usando ambas combinadas el valor de la misma venta el año anterior

Espero que se entienda y os guste.
