Starting December 3, join live sessions with database experts and the Microsoft product team to learn just how easy it is to get started
Learn moreGet certified in Microsoft Fabric—for free! For a limited time, get a free DP-600 exam voucher to use by the end of 2024. Register now
Hola a todos
Estoy tratando de crear una forma de comparar los pedidos realizados en una semana seleccionada con el promedio de las 5 semanas anteriores por cliente. Esto funciona exactamente como se espera cuando un cliente ha realizado pedidos en una semana seleccionada, pero si un cliente ha realizado cero pedidos, cualquier medida que intente obtener datos de otra semana o fecha se convierte en cero. La siguiente imagen intenta mostrar el problema en un gráfico.
A continuación se muestra la medida que utilizo para obtener la semana anterior que se convierte en cero si la semana seleccionada tiene cero pedidos.
CALCULATE(
COUNTROWS('orders'),
FILTER(
ALL('orders'),
'orders'[week]=MAX('orders'[week])-1
),
FILTER(
ALL('orders'),
'orders'[year]=MAX('orders'[year])
),
FILTER(
ALL('clients'),
'clients'[client_lvl0]=MAX('clients'[client_lvl0])
/* This filter is needed to make Power BI able to separate orders by clients when fetching data from another week. Without the filter each client gets the previous week total. */
)
)
Cualquier tipo de ayuda será muy apreciada.
Solved! Go to Solution.
Gracias @rajendraongole1 y @v-cgao-msft por tratar de ayudarme y guiarme en la dirección de la solución con la que terminé.
Ya tengo una tabla de fechas separada, pero por alguna razón hubo problemas con los números de semana. El problema quizás provenga de que los datos utilizados son importados desde una base de datos MySQL que almacena la hora como el tipo de datos Int en lugar de DateTime.
La solución para mí fue agregar una columna adicional en el comando SELECT para la importación de MySQL que agregó la fecha del último día de una semana. Entonces pude obtener los datos correctos en el gráfico con el siguiente filtro:
FILTER(
ALL('Orders'),
'Orders'[lastDayOfAWeek]<MAX('Date'[Date]) &&
'Orders'[lastDayOfAWeek]>MAX('Date'[Date])-42
)
Si alguien se encuentra en la misma situación, la forma de obtener la fecha del último día de una semana en MySQL es algo así:
STR_TO_DATE(concat(year(from_unixtime(dateAsInt)), weekofyear(from_unixtime(dateAsInt)),' sunday'), '%X%V %W') as lastDayOfAWeek
Gracias @rajendraongole1 y @v-cgao-msft por tratar de ayudarme y guiarme en la dirección de la solución con la que terminé.
Ya tengo una tabla de fechas separada, pero por alguna razón hubo problemas con los números de semana. El problema quizás provenga de que los datos utilizados son importados desde una base de datos MySQL que almacena la hora como el tipo de datos Int en lugar de DateTime.
La solución para mí fue agregar una columna adicional en el comando SELECT para la importación de MySQL que agregó la fecha del último día de una semana. Entonces pude obtener los datos correctos en el gráfico con el siguiente filtro:
FILTER(
ALL('Orders'),
'Orders'[lastDayOfAWeek]<MAX('Date'[Date]) &&
'Orders'[lastDayOfAWeek]>MAX('Date'[Date])-42
)
Si alguien se encuentra en la misma situación, la forma de obtener la fecha del último día de una semana en MySQL es algo así:
STR_TO_DATE(concat(year(from_unixtime(dateAsInt)), weekofyear(from_unixtime(dateAsInt)),' sunday'), '%X%V %W') as lastDayOfAWeek
Hola @sosVikar ,
También estoy de acuerdo en que se necesita una tabla de calendario en el modelo para manejar semanas que abarcan años.
De esta manera, puede averiguar el rango de fechas utilizando la fecha máxima de la semana: 41 días, así:
Measure =
VAR __cur_orders = [Total orders]
VAR __week_end_date = MAX('Date'[WeekEndDate])
VAR __min_date = __week_end_date - 41
VAR __max_date = __week_end_date - 7
VAR __average = AVERAGEX( FILTER( ALL('Date'), 'Date'[Date]>=__min_date && 'Date'[Date]<=__max_date), CALCULATE([Total orders],ALLEXCEPT('Date','Date'[Week])) )
VAR __result = IF( NOT ISBLANK( [Total orders] ), [Total orders], __average)
RETURN
__result
Cálculos relacionados con la semana: patrones DAX
Saludos
Gao
Equipo de apoyo a la comunidad
Si hay alguna publicación que ayude, considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.
Si no entiendo sus necesidades o aún tiene problemas al respecto, no dude en hacérnoslo saber. ¡Muchas gracias!
Cómo obtener respuestas rápidas a sus preguntas -- Cómo proporcionar datos de ejemplo en el foro de Power BI -- Grupo de usuarios de Power BI de China
Hola @sosVikar - Cree una tabla de fechas separada y márquela como tabla de fechas en su modelo.
A continuación, cree para calcular la medida Total de pedidos para la semana seleccionada:
TotalOrdersSelectedWeek =
CALCULAR(
COUNTROWS('órdenes'),
FILTRO(
«órdenes»,
'orders'[semana] = MAX('DateTable'[Semana]) &&
'orders'[año] = MAX('DateTable'[Año])
)
)
Calcule el promedio de pedidos de las 5 semanas anteriores: Estoy usando la tabla de fechas aquí, agregue su tabla de fechas y columnas según su conveniencia
AverageOrdersPrevious5Weeks =
CALCULAR(
PROMEDIOX(
VALUES(DateTable[Week]),
CALCULAR(
COUNTROWS('órdenes'),
FILTRO(
«órdenes»,
'pedidos'[semana] EN
SELECTCOLUMNS(
FILTRO(
ADDCOLUMNS(
VALUES(DateTable[Week]),
"WeekOffset",
RANKX(ALL(DateTable[Week]), DateTable[Week],, ASC, DENSE)
),
[WeekOffset] <= RANKX(ALL(DateTable[Week]), MAX(DateTable[Week]),, ASC, DENSE) - 1 &&
[WeekOffset] > RANKX(ALL(DateTable[Week]), MAX(DateTable[Week]),, ASC, DENSE) - 6
),
"WeekOffset", DateTable[Week]
)
),
FILTRO(
«órdenes»,
'orders'[año] = MAX('DateTable'[Año])
),
FILTRO(
«clientes»,
'clientes'[client_lvl0] = MAX('clientes'[client_lvl0])
)
)
)
)
Use ambas medidas en el objeto visual para comparar los pedidos de la semana seleccionada con el promedio de las 5 semanas anteriores y controlar los casos en los que los clientes tienen cero pedidos en la semana seleccionada
¿He respondido a tu pregunta? ¡Marca mi publicación como una solución! ¡Esto ayudará a otros en el foro!
¡Agradezco sus felicitaciones!
Starting December 3, join live sessions with database experts and the Fabric product team to learn just how easy it is to get started.
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Early Bird pricing ends December 9th.