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

Get 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

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
November Carousel

Fabric Community Update - November 2024

Find out what's new and trending in the Fabric Community.

Live Sessions with Fabric DB

Be one of the first to start using Fabric Databases

Starting December 3, join live sessions with database experts and the Fabric product team to learn just how easy it is to get started.

Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Early Bird pricing ends December 9th.

Nov PBI Update Carousel

Power BI Monthly Update - November 2024

Check out the November 2024 Power BI update to learn about new features.

Top Solution Authors
Top Kudoed Authors