Power BI: Ventas semana actual vs. semana anterior. ¿Qué pasa cuando se cambia de año?
¡Hola a tod@s! ¿Como estáis? He estado desaparecida de aquí unos días porque estuve concentrada en preparar mi sesión del “PowerBI Days Virtual Conf”, un eventazo que tuvo lugar los días 17, 18, y 19 de enero. ¡Qué maravilla de evento, qué maravilla de ponentes y charlas, y qué privilegio el mío que me hayan dado la oportunidad de nuevo de participar en él! Solo puedo dar las gracias 🙂.
Una vez pasados estos días vuelvo aquí con nuevas tips de Power BI. Y como suelo hacer, quiero contar aquí mi experiencia sobre situaciones reales que me han pasado trabajando en proyectos. Es posible que haya desarrolladores/as que ya conozcan estas tips, o incluso que tengan soluciones más óptimas, y habrá otras personas que no se hayan topado aún con situaciones así y mis tips puedan ser una pequeña ayudita.
Así que os voy a contar la situación en la que me encontré hace unos días:
Me pedían que calculase las ventas semanales hasta la fecha (WTD) y las comparase con las de la semana anterior (WTD LW), independientemente si entre una semana y otra había cambio de año.
Así que, en un visual de tabla coloqué los campos “Week_id” de mi tabla de Calendario, y la medida de “Sales Qty” (Cantidad de ventas) que ya tenía calculada.
“Week_id” es la concatenación del año + el número de la semana.
A modo de ejemplo, filtré las tres últimas semanas (completas) de 2022 y las dos primeras de 2023.
Pues bien, teniendo en cuenta de que no existe una función DAX “WTD” y que el cálculo tenía que realizarlo para la semana anterior de la fecha seleccionada, en un principio preparé este cálculo DAX con 4 variables:
Estoy declarando variables para indicarle a DAX cuál debe ser la fecha que debe considerar como actual en el rango de fechas que selecciono, la semana actual, la semana anterior y el año actual. Siempre dentro del rango de fechas que voy a analizar.
Finalmente le pido que me devuelva (Return) la cantidad de ventas totales de la semana anterior (de calendario) a la que estoy analizando. Y así podré compararlas con las de la semana actual.
Coloqué la medida en la tabla. La fórmula funcionaba correctamente, hasta que llegué a la semana 1 del año 2023 (202301) que, los datos, además de no cuadrar, salían raros.
En la imagen observamos que las cantidades de la medida que acabamos de calcular coinciden con las de la semana anterior de la columna de “Sales Qty”, de la actual. Excepto en la primera semana de 2023 (202301). Que en la columna de “QTY wtd LW 1” tendría que poner “1.864”, y en lugar de eso pone “228”. Con lo cual, la medida no se está calculando correctamente cuando cambiamos de año.
Si volvemos a estudiar la medida, en ningún momento estamos dándole a DAX una condición en el caso de cambiar de año entre una semana y otra. Así que cuando llega a la semana 1 DAX intenta compararla con la semana anterior, pero como no hay semana anterior a la 1 y no le hemos indicado qué debe hacer en esta situación, salen datos raros, ya que considera que «Año nuevo ventas nuevas 😄». ¿Como podemos solucionar esto?
Si no dispones de una columna «Week_num» créala ahora con la siguiente fórmula DAX:
El segundo argumento de la función es un 2 y un 1:
Ponemos un 2 para indicar a DAX que queremos que las semanas empiecen en lunes y un 1 detrás para indicarle que queremos semanas ISO (la semana 1 del año será la que tenga el primer jueves del año).
Si no dispones de una columna «Week_id» en tu tabla de calendario, créala ahora también, como comenté antes, concatenando las columnas de año y la de “WeekNum”, que acabas de crear.
Vamos ahora a crear una nueva medida, en la que vamos a indicarle qué hacer para calcular las ventas de la semana anterior cuando la semana es la primera del año.
Debo indicar que no he encontrado la forma dinámica, he utilizado diferentes funciones como “CONVERT”, “RIGHT”, “LEFT”, para indicar la condición para la primera semana del año, pero finalmente no la he encontrado y he dejado la condición de forma manual. Lo cual es correcto, pero no es mantenible en el tiempo. Por supuesto si conoces la forma de hacerla dinámica, te agradezco que me la expliques!
Vamos con ella. En mi dataset, actualmente tengo datos desde el 1 de enero de 2020 hasta 6 meses después del día de hoy, y se va actualizando día a día.
La medida sería la siguiente:
Dejamos de usar las fechas del calendario y extraer las semanas y el año, para trabajar directamente con las semanas. De esta forma, DAX ya no va a saber diferenciar si la semana a la que nos estamos refiriendo pertenece a un año u otro o si entre una semana y otra hay cambio de año o no, porque vamos a trabajar con los “ID” de las semanas, que son valores numéricos, y no de tiempo.
Así que declaramos la variable “_WEEKID” indicando la semana más reciente del rango de fechas que seleccionemos.
Declaramos, a continuación, la variable que haga referencia a la semana anterior. Aquí le indicamos la condición de que si el “Week_id” termina en “01” debe coger la última semana del año anterior. Esta condición es la que comentaba que no he podido lograr hacerla de forma dinámica, y por eso la he indicado de forma manual para varios años (hasta 2026).
Finalmente pedimos que nos devuelva la cantidad acumulada de ventas de la semana anterior, cumpliendo con la condición indicada.
Colocamos la medida en la tabla:
El cálculo lo ha hecho correctamente ahora 😊. Asi que nos quedamos con esta última medida, y ya podemos calcular el % de crecimiento/decrecimiento entre una semana y otra:
También podemos ir moviéndonos en diferentes rangos de fechas para comprobar que el cálculo es correcto.
Recomendación: Cuando no estás segur@ si las variables que estás declarando en una medida son correctas, puedes crear las variables como medidas aparte e ir añadiéndolas en una tabla. Yo por ejemplo, para saber si la condición que estaba poniendo en la variable “_PrevWeekSP”, creé una medida aparte con esta fórmula y la añadí a la tabla para saber si estaba tomando correctamente la semana anterior a cada semana.
Espero que te haya gustado y pueda servirte de ayuda para tus informes y tus cálculos DAX. Y como dije antes, si conoces la manera de hacer esta medida dinámica, te agradezco de verdad que me escribas y me la cuentes! Yo seguiré investigando, porque siempre se pueden mejorar y optimizar los cálculos DAX.
Nos vemos en el próximo post.
Muchas gracias por leerme! 🙂