Mostrar dinámicamente meses completados en Power BI

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp

Contenidos

Un requisito común con el que me he encontrado varias veces es limitar un objeto visual de Power BI para mostrar solo los meses completados y excluir el mes activo actual. Esto es común si carga datos a diario, pero algunos de sus informes se realizan mensualmente. El siguiente cuadro es un buen ejemplo.

081019_0301_dynamically1-2875667

Este gráfico muestra las ventas mensuales de libros de mi tienda en línea durante los últimos 10 meses. Parece que las ventas se han desplomado en agosto de 2019, pero ese no es el caso. Este gráfico se generó a principios del mes de agosto y, por lo tanto, muestra un mes parcialmente completado. Probablemente, la mejor manera de hacer que este gráfico refleje la realidad es simplemente filtrar el mes actual (no completado): agosto de 2019 en este caso. Pero el truco consiste en hacer esto de forma dinámica para que el gráfico se actualice automáticamente una vez que se complete el mes completo.

Como es habitual en Power BI, hay varias formas de solucionar este problema. La forma en que me gusta hacerlo es crear una columna calculada en la tabla del calendario (también puede usar Power Query). Hay varias formas de crear una columna calculada, pero aquí está mi solución.

¿Es este un mes completo?

Resuelvo este problema creando una columna llamada IsCompletedMonth. Mi columna devuelve VERDADERO () para los meses completados y FALSO () para los meses actuales y futuros. En general, desaconsejo el uso de columnas calculadas y sugiero que use medidas en su lugar. Las excepciones a esa regla incluyen:

  • Cuando quiera cortar, cortar en dados y filtrar el resultado (no puede hacer esto con medidas).
  • Cuando agrega la columna a una tabla de búsqueda (dimensión) (las tablas de búsqueda son generalmente más pequeñas y, por lo tanto, una columna adicional tiene menos impacto).
  • Cuando la columna tiene un número bajo de valores únicos (las columnas de cardinalidad baja se comprimen muy bien, incluso en tablas grandes).

En este caso, cumplo con todas las reglas de excepción enumeradas anteriormente, por lo que estamos listos para comenzar.

Prepare la tabla del calendario primero

Creo que una buena práctica en una tabla de calendario es tener una columna de índice mensual. El índice del mes es una columna entera que identifica de forma única cada mes en tu mesa de calendario. La columna de números enteros debe comenzar en 1 para el primer mes cargado, 2 para el segundo mes, 12 para el último mes al final del primer año y luego continuar en 13, 14 … 24 al final del segundo año y así sucesivamente. . El beneficio de hacer esto es que puede hacer cálculos matemáticos para encontrar meses relativos, como – 1 para encontrar el mes anterior, – 12 para encontrar el mismo mes del año anterior y así sucesivamente.

Una vez que cargue su tabla de calendario con una columna de índice de mes, podrá usar una combinación de la función TODAY () y también LOOKUPVALUE () para saber qué índice de mes es el mes activo actual.

Completed Month = 
      VAR ThisMonthID = 
              LOOKUPVALUE('Calendar'[Month Index], 'Calendar'[Date], TODAY())
      RETURN ThisMonthID

LOOKUPVALUE () es muy parecido a VLOOKUP () en Excel, pero la sintaxis es inversa.

Excel VLOOKUP(<Find This Value>,
              <In This Column In Another Table>,
              <And Return The Value From This Column>
      )

DAX LOOKUPVALUE(<Return This Value From This Column in Another Table>,
                <By Searching This Column In Another Table>,
                <And This Is The Value To Search For>
      )

El beneficio de LOOKUPVALUE () sobre decir RELATED () en DAX es que no necesita una relación. Todas las relaciones tienen un costo en Power BI. Solo debe crear relaciones en Power BI cuando desee propagar filtros de una tabla a otra. Si solo desea obtener valores de otra tabla en una segunda tabla, utilice LOOKUPVALUE () en su lugar y omita la relación.

En este momento, la fecha actual es 10th Agosto de 2019, y como puede ver a continuación en mi tabla de calendario, el Índice de Mes para el 19 de agosto es el valor 50.

081019_0301_dynamically2-4949135

Y mi nueva columna calculada (parcialmente escrita) [Completed Month] devuelve 50 por cada fila de la tabla de calendario. Tenga en cuenta que solo escribí parcialmente esta fórmula y devolví el valor de la variable para «ver» que esta parte funciona como se desea.

081019_0301_dynamically3-7825166

Ahora que he usado LOOKUPVALUE () para encontrar el índice del mes para la fecha de hoy, puedo comparar esto con la columna del índice del mes para cada fecha en la tabla del calendario para determinar si cada fecha está en un mes completo o no. Aquí está la fórmula modificada.

Completed Month = 
      VAR ThisMonthID = 
              LOOKUPVALUE('Calendar'[Month Index], 'Calendar'[Date], TODAY())
      RETURN 'Calendar'[Month Index] < ThisMonthID 
          //returns TRUE() if the month is in the past and complete

Y aquí está la columna resultante en mi tabla de calendario (abajo). Tenga en cuenta que todas las fechas del mes actual (19 de agosto) son FALSAS y que todas las fechas del 19 de julio en adelante son VERDADERAS.
081019_0301_dynamically4-4749470

Ahora que tengo esta columna, puedo usarla como una página o un filtro de nivel visual en mi workbook. El gráfico ya no me muestra engañosamente que mis ventas se han desplomado en agosto.

081019_0301_dynamically5-7904231

Cuando actualice mi informe en septiembre, la columna calculada se actualizará y las ventas de agosto serán visibles automáticamente.

¿Cómo filtra los meses completados?

¿Utiliza un enfoque diferente? Hágame saber cómo filtra los meses completados en sus informes de Power BI en los comentarios a continuación.

!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window,document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘639916389503636’);
fbq(‘track’, ‘PageView’);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.