Obtención del último mes de un calendario

En este escenario partimos de un calendario que, en nuestro ejemplo, va a incluir -además del campo de fecha- un campo con el año, el mes, el día... y un campo de texto en el que se ha concatenado el mes y el año (con formato de texto), asegurándonos de que el resultado tiene 6 caracteres de longitud (o, dicho con otras palabras, asegurándonos de que el mes aparece representado con dos cifras). Esto lo hacemos en el editor de consultas, creando una columna personalizada con el siguiente código M:

Text.End("0" & Number.ToText([Mes]) & Number.ToText([Año]), 6)

Creación de una columna personalizada con el mes y el año

De vuelta al editor de informes, comprobamos que nuestro último mes es -en el dataset con el que estamos trabajando- el correspondiente a diciembre de 2019, lo que podemos ver de múltiples maneras, por ejemplo, creando una matriz que incluya el campo Date de nuestro calendario:

Calendario

Nuestro objetivo es obtener ese último mes (el valor del campo 'Calendar'[Month & Year]) mediante una medida.

Tratándose (el campo 'Calendar'[Month & Year]) de un campo de texto y estando formado por el mes y el año -en ese orden-, podemos recurrir a la función MAX para obtener el valor máximo que queremos:

Last Month = MAX('Calendar'[Month & Year])

Valor máximo del campo

El problema es que nuestra medida Last Month, tal y como está definida, se va a contextualizar, lo que supone que, en cuanto filtremos algo en alguna parte, el resultado devuelto no sea el esperado. Por ejemplo, si llevamos el campo Año al lienzo con forma de segmentación y seleccionamos un año, nuestra medida va a devolver el último mes de dicho año:

Valor máximo del campo tras filtrar por año

Necesitamos asegurar que nuestro cálculo (el valor máximo del campo que nos interesa) se realiza en un contexto modificado: aquel que asegura que la columna 'Calendar'[Month & Year] incluye todos los valores. Para esto podemos recurrir a la función CALCULATE añadiendo como argumento la función ALL:

Un error que podemos cometer es aplicar como filtro la expresión ALL('Calendar'[Month & Year]):

Last Month = 
    CALCULATE(
        MAX('Calendar'[Month & Year]);
        ALL('Calendar'[Month & Year])
    )

Valor máximo del campo considerando todos los valores del campo 'Calendar'[Month & Year]

Como vemos en la imagen anterior, la medida Last Month sigue devolviendo el último mes del año por el que estamos filtrando. Y esto es así porque cuando se considera el filtro ALL('Calendar'[Month & Year]), la tabla Calendar ya está siendo filtrada. Lo que necesitamos es asegurarnos de que toda la tabla Calendar se incluye en nuestro cálculo, para lo que basta con añadir como argumento de la función ALL el nombre de esta tabla:

Last Month = 
    CALCULATE(
        MAX('Calendar'[Month & Year]);
        ALL('Calendar')
    )

Valor máximo del campo considerando todos los valores de la tabla Calendar

Tal y como vemos, ahora nuestra medida Last Month sí está devolviendo el valor que queremos.

Funciones DAX involucradas
Enviado por admin el Mar, 19/05/2020 - 09:26