rohitkalane
Hola,
Soy bastante nuevo en las funciones de DAX y estoy tratando de calcular una medida que me dé la cantidad de días hábiles restantes para un mes en particular o hasta una fecha en particular. Todos los días excepto los fines de semana son laborables.
Tengo 2 tablas: una tabla de pedidos donde tengo clientes, la cantidad de ejes a enviar y la fecha programada del envío. Tengo una tabla de fecha oscura que me he unido a mi tabla de pedidos en la fecha programada.
Mi objetivo principal es calcular una medida que dé el promedio de ejes a realizar por día hábil, por lo que solo estoy tratando de dividir la suma de la cantidad por el número de días hábiles distintos que caen dentro de un marco de tiempo seleccionado.
El problema al que me enfrento es cuando un cliente en particular tiene una fecha de envío programada atrasada en su contra.
por ejemplo, si se selecciona septiembre de 2018 como filtro y el Cliente A tiene alguna cantidad (digamos 50 ejes) que se suponía que se enviarían el 05/09/2018 y aún no se han enviado, lo que hace que se refleje en mi tabla de pedidos como vencidos, entonces mi medida WorkingDays muestra que está en blanco o cero y esto hace que mi medida average_axles_per_day sea infinita. Supongo que esto sucede porque cuando selecciono septiembre de 2018 y el Cliente A como filtros, mi tabla de pedidos se filtra para mostrar solo los datos que coinciden con la condición y solo tiene 1 fecha de envío programada que está vencida.
Entonces, ¿cómo puedo mostrar la medida WorkingDays para mostrar siempre solo la cantidad de días hábiles que quedan en ese período de tiempo en particular (a partir de hoy, 17/09/2018, mi número de días hábiles que quedan en septiembre de 2018 debería ser 10). y mi suma de cantidad vencida debe dividirse por este número de días hábiles (en este caso, 50 dividido por 10).
Agradezco cualquier ayuda brindada.
Gracias.
Greg_Deckler
En respuesta a rohitkalane
Oh, eso se debe al TODO en esa fórmula. Puede intentar cambiar eso a ALLSELECTED y eso podría resolverlo.
Measure 6 = VAR __today = TODAY() VAR __max = MAX('Table14'[Schedule Date]) VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty]) VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay]) RETURN DIVIDE(__total,__workdays,0)
O puede que tenga que utilizar ALLEXCEPT. O puede usar SUMX (Table14, Table14[New Qty]) dependerá exactamente de lo que esté intentando hacer.
Greg_Deckler
Leí esto varias veces y no estoy seguro de lo que está pasando. Los datos de muestra y las fórmulas siempre son muy útiles.
Consulte esta publicación sobre cómo obtener una respuesta rápida a su pregunta: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490
Dicho todo esto, he escrito una serie de medidas rápidas de duración del trabajo como:
https://community.powerbi.com/t5/Quick-Measures-Gallery/Net-Work-Duration/mp/481543
https://community.powerbi.com/t5/Quick-Measures-Gallery/Net-Work-Days/mp/367362
rohitkalane
En respuesta a Greg_Deckler
Hola @Greg_Deckler
Entonces, aquí estoy tratando de calcular una medida que me dará el número de días laborales que quedan en un período de tiempo seleccionado. Esta medida se utilizará luego para calcular Average_axles_per day = (Suma de nueva cantidad) / (Número de días laborables restantes).
Los días laborables se consideran días laborables (se ignoran los días festivos)
Mis datos tienen 2 tablas:
Gestión de pedidos | Dim Date |
Cliente | Valor de fecha |
Fecha de programacion | Año fiscal |
Nueva cantidad | Trimestre fiscal |
Mes fiscal | |
Semana fiscal |
Me he unido a estas mesas en Fecha de programación *: 1 Fecha Valor los campos.
A continuación se muestran datos de muestra para el mes de septiembre de 2018:
Nombre del cliente | Fecha de programacion | Nueva Cant. |
Cliente 3 | 3/9/2018 | 1 |
Cliente 1 | 3/9/2018 | 6 |
Cliente 7 | 4/9/2018 | 3 |
Cliente 4 | 5/9/2018 | 4 |
Cliente 7 | 5/9/2018 | 49 |
Cliente 7 | 6/9/2018 | 1 |
Cliente 9 | 10/09/2018 | 1 |
Cliente 4 | 10/09/2018 | 26 |
Cliente 7 | 10/09/2018 | 11 |
Cliente 3 | 11/09/2018 | 4 |
Cliente 10 | 11/09/2018 | 5 |
Cliente 7 | 11/09/2018 | 2 |
Cliente 3 | 12/9/2018 | 4 |
Cliente 5 | 12/9/2018 | 2 |
Cliente 7 | 12/9/2018 | 55 |
Cliente 3 | 13/09/2018 | 43 |
Cliente 5 | 13/09/2018 | 7 |
Cliente 2 | 13/09/2018 | 4 |
Cliente 7 | 13/09/2018 | 44 |
Cliente 9 | 14/9/2018 | 1 |
Cliente 3 | 14/9/2018 | 137 |
Cliente 8 | 14/9/2018 | 6 |
Cliente 5 | 14/9/2018 | 13 |
Cliente 11 | 14/9/2018 | 2 |
Cliente 1 | 14/9/2018 | 7 |
Cliente 2 | 14/9/2018 | 118 |
Cliente 7 | 14/9/2018 | 43 |
Cliente 3 | 15/9/2018 | 12 |
Cliente 9 | 17/09/2018 | 12 |
Cliente 4 | 17/09/2018 | 67 |
Cliente 3 | 17/09/2018 | 366 |
Cliente 8 | 17/09/2018 | 44 |
Cliente 5 | 17/09/2018 | 57 |
Cliente 11 | 17/09/2018 | 2 |
Cliente 1 | 17/09/2018 | 166 |
Cliente 2 | 17/09/2018 | 489 |
Cliente 7 | 17/09/2018 | 44 |
Cliente 6 | 17/09/2018 | 84 |
Cliente 3 | 18/9/2018 | 462 |
Cliente 8 | 18/9/2018 | 62 |
Cliente 5 | 18/9/2018 | 142 |
Cliente 1 | 18/9/2018 | 285 |
Cliente 2 | 18/9/2018 | 470 |
Cliente 7 | 18/9/2018 | 29 |
Cliente 6 | 18/9/2018 | 281 |
Cliente 9 | 19/9/2018 | 12 |
Cliente 3 | 19/9/2018 | 574 |
Cliente 8 | 19/09/2018 | 60 |
Cliente 5 | 19/09/2018 | 121 |
Cliente 1 | 19/9/2018 | 460 |
Cliente 2 | 19/09/2018 | 527 |
Cliente 7 | 19/09/2018 | 106 |
Cliente 6 | 19/09/2018 | 273 |
Cliente 3 | 20/9/2018 | 794 |
Cliente 8 | 20/9/2018 | 49 |
Cliente 5 | 20/9/2018 | 122 |
Cliente 1 | 20/9/2018 | 391 |
Cliente 2 | 20/9/2018 | 515 |
Cliente 7 | 20/9/2018 | 39 |
Cliente 6 | 20/9/2018 | 283 |
Cliente 9 | 21/09/2018 | 10 |
Cliente 3 | 21/09/2018 | 663 |
Cliente 8 | 21/09/2018 | 49 |
Cliente 5 | 21/09/2018 | 131 |
Cliente 11 | 21/09/2018 | 12 |
Cliente 1 | 21/09/2018 | 452 |
Cliente 2 | 21/09/2018 | 556 |
Cliente 7 | 21/09/2018 | 24 |
Cliente 6 | 21/09/2018 | 273 |
Cliente 3 | 22/09/2018 | 377 |
Cliente 1 | 22/09/2018 | 342 |
Cliente 9 | 24/9/2018 | 48 |
Cliente 4 | 24/9/2018 | 49 |
Cliente 3 | 24/9/2018 | 892 |
Cliente 8 | 24/9/2018 | 52 |
Cliente 5 | 24/9/2018 | 128 |
Cliente 1 | 24/9/2018 | 458 |
Cliente 2 | 24/9/2018 | 655 |
Cliente 7 | 24/9/2018 | 80 |
Cliente 6 | 24/9/2018 | 277 |
Cliente 9 | 25/9/2018 | 10 |
Cliente 3 | 25/9/2018 | 792 |
Cliente 8 | 25/9/2018 | 49 |
Cliente 5 | 25/9/2018 | 135 |
Cliente 1 | 25/9/2018 | 415 |
Cliente 2 | 25/9/2018 | 626 |
Cliente 7 | 25/9/2018 | 24 |
Cliente 6 | 25/9/2018 | 270 |
Cliente 9 | 26/9/2018 | 2 |
Cliente 3 | 26/9/2018 | 735 |
Cliente 8 | 26/9/2018 | 99 |
Cliente 5 | 26/9/2018 | 106 |
Cliente 10 | 26/9/2018 | 1 |
Cliente 1 | 26/9/2018 | 376 |
Cliente 2 | 26/9/2018 | 570 |
Cliente 7 | 26/9/2018 | 30 |
Cliente 6 | 26/9/2018 | 275 |
Cliente 9 | 27/9/2018 | 40 |
Cliente 3 | 27/9/2018 | 665 |
Cliente 8 | 27/9/2018 | 53 |
Cliente 5 | 27/9/2018 | 126 |
Cliente 11 | 27/9/2018 | 2 |
Cliente 1 | 27/9/2018 | 350 |
Cliente 2 | 27/9/2018 | 623 |
Cliente 7 | 27/9/2018 | 21 |
Cliente 6 | 27/9/2018 | 275 |
Cliente 9 | 28/9/2018 | 58 |
Cliente 3 | 28/9/2018 | 688 |
Cliente 8 | 28/9/2018 | 97 |
Cliente 5 | 28/9/2018 | 99 |
Cliente 1 | 28/9/2018 | 416 |
Cliente 2 | 28/9/2018 | 595 |
Cliente 7 | 28/9/2018 | 3 |
Cliente 6 | 28/9/2018 | 277 |
Cliente 3 | 29/9/2018 | 421 |
Cliente 1 | 29/9/2018 | 345 |
En este caso, considerando hoy () = 18/09/2018, podemos ver que hay algunos pedidos que están vencidos. Me gustaría calcular una medida que me dé la cantidad de días laborables que se encuentran entre hoy y la fecha de Programación máxima en la lista de pedidos, y luego dividir la suma total de la cantidad nueva (incluida la cantidad vencida) por esa cantidad de trabajo dias.
En otro caso en el que colocamos un filtro en un Cliente, digamos Cliente 10 sin ningún filtro de mes fiscal, a continuación se muestran los datos de muestra:
Nombre del cliente | Fecha de programacion | Nueva Cant. |
Cliente 10 | 11/09/2018 | 5 |
Cliente 10 | 26/9/2018 | 1 |
Cliente 10 | 17/10/2018 | 8 |
Cliente 10 | 31/10/2018 | 4 |
En este caso, 1 de las fechas está vencida, por lo que me gustaría calcular los días hábiles entre hoy y el 31/10/2018 (fecha máxima de programación en la lista).
En un caso especial cuando un cliente tiene solo 1 pedido y ya está vencido, esa cantidad vencida se dividirá por los días hábiles restantes del mes actual.
Espero que esta información ayude a comprender el escenario. Por favor, avíseme si necesita información adicional.
Aprecio tu ayuda.
Gracias.
Greg_Deckler
En respuesta a rohitkalane
Lo siento, ¿cómo sabemos que un pedido está vencido o hay algo en esta tabla con una fecha de programación anterior al vencimiento de hoy? ¿Ya tiene una columna en su tabla de calendario que identifica los días como días laborables o no?
rohitkalane
En respuesta a Greg_Deckler
@Greg_Deckler Disculpas, debería haber mencionado eso. Sí, cualquier pedido que tenga una fecha de programación anterior a hoy está vencido.
En lo que respecta al día de trabajo, creé una columna calculada que asignará 0 a los fines de semana y 1 a los días de la semana y luego la usé como una bandera para identificar un día de trabajo.
IsWorkDay = SWITCH(WEEKDAY([Schedule Date]),1,0,7,0,1)
Greg_Deckler
En respuesta a rohitkalane
Entonces, ¿algo como esto?
Measure 6 = VAR __today = TODAY() VAR __max = MAX('Table14'[Schedule Date]) VAR __total = SUMX(ALL(Table14),Table14[New Qty]) VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay]) RETURN DIVIDE(__total,__workdays,0)
rohitkalane
En respuesta a Greg_Deckler
@Greg_Deckler
la parte donde calcula el Número de días laborables restantes funciona perfectamente, sin embargo, el promedio de ejes por día no se calcula con precisión.
Supongo que el problema es que el Cantidad total La variable no cambia de valor incluso si selecciono un cliente en particular. el total en esta medida siempre sigue siendo la Suma de Cant. para todos los clientes.
Gracias.
Greg_Deckler
En respuesta a rohitkalane
Oh, eso se debe al TODO en esa fórmula. Puede intentar cambiar eso a ALLSELECTED y eso podría resolverlo.
Measure 6 = VAR __today = TODAY() VAR __max = MAX('Table14'[Schedule Date]) VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty]) VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay]) RETURN DIVIDE(__total,__workdays,0)
O puede que tenga que utilizar ALLEXCEPT. O puede usar SUMX (Table14, Table14[New Qty]) dependerá exactamente de lo que esté intentando hacer.
rohitkalane
En respuesta a Greg_Deckler
@Greg_Deckler
Estaba probando un escenario como se menciona en mi declaración de problema, donde para un cliente en particular, si solo tengo registros vencidos, entonces, en tal caso, mi cantidad total vencida debe dividirse por la cantidad de días hábiles restantes en el mes actual. .
La medida que proporcionó no me proporcionó días hábiles en tal caso. Simplemente apareció en blanco.
Ejemplo:
Región | Nombre del cliente | Fecha de programacion | Nueva Cant. |
México | Cliente A | 5/9/2018 0:00 | 4 |
México | Cliente A | 10/09/2018 0:00 | 24 |
México | Cliente A | 17/09/2018 0:00 | 67 |
En este caso, todos mis pedidos para el cliente A están vencidos, y dado que estamos en el mes de septiembre, la cantidad total vencida debe dividirse por los días hábiles restantes en septiembre, es decir, debe ser como (4 + 24 + 67) / 6.
En este caso, los días laborables que quedan parte del cálculo vuelven en blanco.
¿Podrías ayudarme por favor?
Gracias.
Greg_Deckler
En respuesta a rohitkalane
Bien, ¿estamos trabajando con esta versión de la fórmula?
Measure 6 = VAR __today = TODAY() VAR __max = MAX('Table14'[Schedule Date]) VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty]) VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay]) RETURN DIVIDE(__total,__workdays,0)
Lo que estoy pensando que está sucediendo aquí es que el problema es la variable __max. Creo que lo que estaba pensando era que el [Schedule Date] tabla tendría el último día del mes, pero supongo que eso es un poco tonto ahora que lo pienso, así que tal vez algo como:
Measure 6 = VAR __today = TODAY() VAR __maxSchedule = MAX('Table14'[Schedule Date]) VAR __maxMonth = MAX('Table14'[Schedule Date]) VAR __maxYear = MAX('Table14'[Schedule Date]) VAR __max = MAXX(FILTER('Calendar',YEAR([Date])=__maxYear && MONTH([Date])=__maxMonth),[Date]) VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty]) VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay]) RETURN DIVIDE(__total,__workdays,0)
Entonces, básicamente, obtenga el MÁXIMO de la fecha programada. Calcula el año y el mes para esa fecha. Utilice esos valores para calcular el último día del mes en la tabla Calendario.
rohitkalane
En respuesta a Greg_Deckler
@Greg_Deckler
hola, probé la última fórmula que proporcionaste, pero no funciona. Simplemente da todos mis promedios como cero, así que supongo que algo no está funcionando bien en esa fórmula.
La idea básica es ver primero la fecha de Programación máxima, si esa fecha es mayor que la de hoy, entonces calcule los días entre esa fecha de Programación máxima y hoy.
O si
La fecha de programación máxima es anterior a hoy, averigüe cuál es el mes actual y luego calcule los días laborables que quedan en el mes actual.
rohitkalane
En respuesta a Greg_Deckler
Sí, acabo de eliminar la función de filtro Todo. Todo funciona perfectamente ahora. Muchas gracias por tu ayuda.
rohitkalane
En respuesta a Greg_Deckler
@Greg_Deckler Lamento que la publicación sea confusa. Yo mismo estaba confundido acerca de cómo publicar esto de una mejor manera. Intentaré poner algunos datos de muestra y una fórmula que le ayudará a comprender mejor el problema.
Gracias por las referencias y disculpas por la publicación no tan bien formateada.