Hacer datos comparables con DAX (comparar periodos no paralelos y 2)

En un post previo vimos cómo comparar periodos no paralelos en Power BI (te sugiero que lo leas antes para poder seguir adecuadamente este post). A raíz del siguiente comentario  (gracias Alberta):

“Muy bueno el post pero para mejorarlo ¿Cómo podría homogenizar la comparación? Por ejemplo, si un periodo tiene 10 dias y el comparado 15, no son comparables ¿Cómo haría para convertirse a una media diaria?”

he decidido escribir este post que permitirá ampliar las capacidades de análisis dentro del mismo. De paso podremos ver en acción la función DAX ROWCOUNT.

Contar el número de dias

Recuerda que teníamos dos slicers, uno para la fecha del periodo actual y otro para el comparado, cada uno referido a una tabla de fechas diferente. Necesitamos contar el número de días que comprende cada periodo, por lo que  crearemos dos medidas DAX que utilizan la función ROWCOUNT que requiere pocas explicaciones: Cuenta el número de filas de una tabla, que es el único parámetro que se debe especificar, y en ese cómputo tendrá en cuenta los filtros que tengamos aplicado en el report (documentación oficial al respecto para más detalles).

Así, estas dos medidas cuentan el número de filas, en este caso días, que es la máxima granularidad de las tablas de fecha utilizadas, de cada una de ellas:

DiasPeriodoActual = countrows(Fechas)
DiasPeriodoComparado = countrows(FechasCopia)

Calcular la media diaria

A partir de la medida anterior podremos crear las medias diarias del periodo actual y del comparado (en el post anterior ya creamos el valor comparado), algo trivial. Para evitar la comprobación de división por cero, usaremos la función DIVIDE:

Media Diaria Per Actual = divide(sum([Importe]);VentaDiariaHoteles[DiasPeriodoActual])
Media Diaria Per Compara = divide([ImporteCompara];VentaDiariaHoteles[DiasPeriodoComparado])

Calcular el % de variación

Finalmente, otra medida que crearemos es la de porcentaje de variación, cuyo cálculo también carece de dificultad a partir de las medidas anteriores:

% Diferencia Media Diaria = divide([Media Diaria Per Actual]-[Media Diaria Per Compara];[Media Diaria Per Compara])

Si lo deseas puedes descargar el PBIX y el XLS correspondiente a este Post (incluye también el desarrollo correspondiente al anterior post):

Compara Diferentes Periodos-homogenizado (Pbix+XLS)

Espero que os haya sido de utilidad. Y gracias de nuevo, Alberta.

Te puede interesar...

9 comentarios en «Hacer datos comparables con DAX (comparar periodos no paralelos y 2)»

  1. Buenas Tardes
    Le agradecería me pudiera ayudar guiándome en como obtener lo siguiente
    Tengo una tabla de ventas con diferentes fecha, deseo mostrar un top digamos de 5 vendedores con mayores ventas en un solo día sin poner filtro, es decir si tuviéramos ventas hasta el 2020 pero el día 15/12/2019 el vendedor X logro vender digamos 20 productos, es decir, de toda la tabla ventas fue el día en que un vendedor logro mayor venta mostrarla
    No tengo una lógica como para lograrlo.
    Gracias y Saludos

  2. Buenas Tardes
    Les agradecería me pudieran ayudar con lo siguiente, tengo dos tablas, la transaccional donde tengo operaciones de un Vendor y en otra tabla la relación de Vendors con sus fechas de inicio y termino de ingreso a la empresa y puede estar varias veces.
    Mi consulta es la siguiente: En la tabla Vendors tengo por ejemplo al vendor 1 con dos registros de fechas de ingreso y egreso a la empresa y en la transaccional una fecha de operación, que si la fecha de operación no estuviera dentro de ninguno de los 2 rangos de fecha me deje marcado ese registro o me lo muestre en una tabla.
    Mas claro con el gráfico adjunto, el Vendor tiene un primer rango desde 02/01/2017 al 01/01/2019 y un segundo rango desde 01/04/2020 al 30/07/2020, si una operación estuviera en cualquiera de los rangos estaria ok (por ejemplo 15/10/2018) pero si no estuviera en ninguno (por ejemplo 15/02/2020) me lo mostrara o quedara marcado el registro para quizás posteriormente filtrarlo.
    Gracias por la ayuda

    1. Hola David,
      una aproximación a solucionarlo con Dax, limitada pero operativa, puede ser la siguiente.
      Entiendo que el modelo y resultado es algo similar a lo siguiente (las tablas de origen son las 2 superiores, que no están relacionadas y en la de abajo el resultado):

      Donde la medida DAX tiene el siguiente código:
      Op Existe En Rangos =
      var fecha=SELECTEDVALUE(Operaciones[Fecha Ooperacion])
      var prov=SELECTEDVALUE(Operaciones[VendorID])
      return
      calculate(COUNTROWS(Rangos);Rangos[VendorID]=prov; Rangos[Desde]<=fecha; Rangos[Hasta]>=fecha)=0

      Si se hiciese como Columna calculada sería mejor y daría más posibilidades, pero eso es más complicado.

      1. Muchas Gracias por la ayuda, en efecto una columna calculada seria mas util pero mas complicado hacerlos.
        Lo unico que faltaria seria poder filtrar los vendedores que no cumplen la fecha pero el resultado true o false sera el que guie.
        Gracias nuevamente

  3. Excelentes los dos post!
    A ver si me puedes ayudar….
    Necesito comparar dos periodos, semana contra semana del año pasado (esta comparación me sale bien)
    pero necesito hacer la comparación del día contra día del año pasado, por ejemplo el lunes de la semana 33 contra el lunes de la semana 33 del año anterior.
    Tengo lo siguiente:
    DsD% VariaciónCompra AñoAnt =
    VAR CurrentDay = SELECTEDVALUE( Calendario[Numero Día Semana] )
    VAR CurrentWeek = SELECTEDVALUE( Calendario[NumSemana] )
    VAR CurrentYear = SELECTEDVALUE( Calendario[Año] )
    VAR ComprasDiaAnioAnterior =
    CALCULATE (
    SUM ( SG2019[MontoOpCompra] ), FILTER(
    ALL( ‘Calendario’ ),
    ‘Calendario'[NumSemana] = CurrentWeek &&
    ‘Calendario'[Numero Día Semana] = CurrentDay &&
    ‘Calendario'[Año] = CurrentYear – 1
    )
    )
    RETURN
    DIVIDE ( SUM ( SG2019[MontoOpCompra] ) – ComprasDiaAnioAnterior, ComprasDiaAnioAnterior, 0 )

    No me trae nada, y no encuentro el problema
    Espero me puedas ayudar
    Saludos!

Responder a Pedro Contreras Cancelar la respuesta

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