Vamos a ver cómo comparar periodos NO paralelos en Power BI sin necesidad de duplicar y relacionar tablas de fechas que luego requieren USERELATIONSHIP para gestionarlas. La solución ofrecida permite evitar la creación de múltiples medidas cuando se desea tener la posibilidad de comparar con diferentes periodos, el dia anterior, 7, 15, 30… días atrás.

Y es muy simple.

Este artículo se plantea como continuación de la serie iniciada con el artículo “compara periodos no paralelos en Power BI“. Usaremos el mismo set de datos.

La idea: Elegir un periodo y decir cuántos días queremos irnos atrás en la comparación

Ni más ni menos. Es una idea alternativa para comparar periodos no paralelos. La siguiente imagen ilustra el proceso:

Elige el periodo y cuántos días atrás quieres ir atrás en la comparación

Crear una tabla para los días “atrás” con GENERATESERIES

Necesitaremos una tabla para el slider de días atrás. Ésta sólo contendrá una secuencia de días o enumeración, del 1 al 365, por ejemplo.

Añadiremos una tabla que llamaremos “Dias” y que sólo tendrá una sentencia DAX, GENERATESERIES que espera como parámetros el límite inferior y el superior:

Dias = GENERATESERIES(1;365)

El resultado final una tabla con una columna con valores del 1 al 365.

No vamos a relacionarla en el modelo.

Ahora agregamos un slicer con los valores de esta tabla. Como sólo nos interesa el límite superior de este slicer, pulsando el desplegable de opciones del slicer elegimos la opción de Menor o igual:

Esto deshabilita el límite inferior del slicer y sólo permite cambiar el superior.

La medida comparativa es dinámica: DATEADD y MAX

Vamos a agregar una medida DAX con los valores a comparar. Estos serán los mismos que la medida elegida y que tomará valores del mismo periodo, pero tantos dias atrás como hayamos elegido en el slicer “Dias”.

Para ello vamos a recurrir a la función DATEADD. Te recomiendo leer este post “No, DATEADD no es lo mismo que PARALLELPERIOD“, que detalla y compara distintas funciones para time intelligence, entre ellas, DATEADD.

Esta función permite sumar-restar periodos a una fecha. En este caso queremos la suma del importe de X días atrás: DATEADD coge la fecha actual y le resta (ojo que hay un signo menos delante de MAX) el valor máximo de Dias (parámetro DAY):

Periodo Resta Dias = CALCULATE(SUM(VentaDiariaHoteles[Importe]);DATEADD(Fechas[Date];-MAX(Dias[Value]);DAY)) 

Por último podríamos añadir otra medida que calculase el % de variación entre ambas medidas:

% Variación Periodo = divide(sum(VentaDiariaHoteles[Importe])-[Periodo Resta Dias];[Periodo Resta Dias])

Y ya está. De este modo has proporcionado al usuario una funcionalidad sencilla para hacer comparaciones y probablemente has evitado la creación de múltiples medidas y nuevas relaciones que complican la gestión del modelo si hay que gestionarlas con USERELATIONSHIP.

Está, además, es operativa para cualquier tipo de agrupación de fecha: Dias, meses…

Espero que te haya sido útil.

  1. Saludos
    Tengo esta funcion
    sumagrupos = CALCULATE(SUM(pago[valor]);CROSSFILTER(pago[cod_rubro];rubro[cod_rubro];OneWay);CROSSFILTER(rubro[cod_rubro];grupos[cod_rubro];Both))

    Mi consulta es si se puede utlizar una funcion alternantiva que pueda simular el comportamiento del crossfilter con relacion Both debido a que mi Analyisis Services no soporta esta funcion

    Gracias

    • Hola Marcelo, quizá viendo el modelo se me ocurriese alguna alternativa, pero como tal, he de reconocer que si la hay, la desconozco. Siento no ser de más ayuda.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *