Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

We've captured the moments from FabCon & SQLCon that everyone is talking about, and we are bringing them to the community, live and on-demand. Starts on April 14th. Register now

Reply
Syndicate_Admin
Administrator
Administrator

¿Alguna forma de obtener una medida que calcule el promedio de las semanas anteriores a partir de 0 si la semana seleccionada es 0?

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.

graph.png

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.

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

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

View solution in original post

3 REPLIES 3
Syndicate_Admin
Administrator
Administrator

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

Syndicate_Admin
Administrator
Administrator

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.

vcgaomsft_0-1718001620641.png

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

vcgaomsft_1-1718002549271.png


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

Syndicate_Admin
Administrator
Administrator

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!

Helpful resources

Announcements
New to Fabric survey Carousel

New to Fabric Survey

If you have recently started exploring Fabric, we'd love to hear how it's going. Your feedback can help with product improvements.

Power BI DataViz World Championships carousel

Power BI DataViz World Championships - June 2026

A new Power BI DataViz World Championship is coming this June! Don't miss out on submitting your entry.

Join our Fabric User Panel

Join our Fabric User Panel

Share feedback directly with Fabric product managers, participate in targeted research studies and influence the Fabric roadmap.

March Power BI Update Carousel

Power BI Community Update - March 2026

Check out the March 2026 Power BI update to learn about new features.

Top Kudoed Authors