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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
AltusTellus
Helper III
Helper III

Calcular el valor entre dos días como los empleados de los tostadores

Hola a todos

Desde hace un par de días, estoy pensando en calcular el número de horas por empleado desde el pasado hasta hoy.

Tengo una mesa con Employments. En esta tabla tengo una fecha de inicio, una fecha de finalización (también puede estar en blanco) y un EmployeeHID que hace referencia a otra tabla con el FullName del empleado. Para obtener las horas de tostador (basado en el promedio de horas por semana) tengo el siguiente DAX:

TotalHours ?
CALCULATE(SUM(tb_Schedules[AverageHours]);
FILTRO(tb_Schedules;
tb_Schedules[StartDate] >-MAX(tb_Schedules[StartDate]) &&
tb_Schedules[EndDate] <-MIN(tb_Schedules[EndDate])))

Se ve así:

Sample table Employments.png

PLease tomar esta información: las tres primeras filas son para el mismo empleado. Ahora quiero obtener esta información en una matriz para que pueda hacer una visión general de las horas de avarage por semana / mes etc. Pero eso se ve así:

Sample overview roaster per employee.png

Como ven, todavía tengo que hacer una fórmula adicional para el promedio de horas por mes, pero la respuesta más buscada está en mi pregunta: ¿Cómo puedo extender el último valor de los tostadores en períodos de "en blanco". El empleado todavía está empleado, ¿cómo puedo rellenar el último valor en los campos en blanco de los períodos? Y, por supuesto, hay más empleados y me gustaría calcular toda la capacidad en horas para toda la organización.

¿Alguien sabe cómo? ¡Muchas gracias!

1 ACCEPTED SOLUTION

Hola Paul,

Thnx otra vez para su respuesta. Me da otra idea sobre el cálculo de los días (u horas etc.) entre la fecha de inicio de un empleo, incluida la fecha de finalización. En mi tabla de dimdate he calculado columna que me da los días laborables por semana (de lunes a viernes:

Primero:

NombreDe Día : FORMAT(dimdate[Date]; "ddd")
Entonces:

WeekdayYN - IF(OR(dimdate[DayName] - "za" ; (dimdate[NombreDeDía] - "zo")); "0" ; "1")

Después de estos dos colums calculados agregué unacolumna calcuada en mi tabla Empleos:

DaysDurationEmployment á CALCULATE(SUM(dimdate[WeekdayYN]);
VAR EndDateEmployment á IF(ISBLANK(tb_Schedules[EndDate]); HOY(); tb_Schedules[EndDate])
devolución
DATESBETWEEN (dimdate[Date]; tb_Schedules[StartDate]; EndDateEmployment))
Lo que da como resultado: (con la tabla relacionada con el nombre del empleado)
EmpleadoStartDateEnddateDaysDurationEmpleo
Annemiek25-9-2019 00:0030-9-2019 00:004
Annemiek1-10-2019 00:0031-12-2019 00:0066
Annemiek1-1-2020 00:00 98
Anouk2-9-2019 00:00 185

Con la columna [DaysDurationEmployment] puedo calcular cualquier cosa que necesite.

¡Resuelto! 🙂

View solution in original post

14 REPLIES 14
V-pazhen-msft
Community Support
Community Support

@AltusTellus

Gracias por la muestra, esto está claro ahora. Pero lamentablemente su solución esperada no se puede alcanzar con su tabla de datos. Porque en la tabla no hay ningún valor registrado para cada empleado en otras fechas de inicio y finalización. Suena un poco confuso, en otra palabra si desea llenar los espacios en blanco, al menos debe tener una fila para grabar esos espacios en blanco bajo las otras fechas, incluso hay 0 o valores en blanco.

matrix11.JPG

Saludos
Paul Zheng

Hola Paul,

Thnx otra vez para su respuesta. Me da otra idea sobre el cálculo de los días (u horas etc.) entre la fecha de inicio de un empleo, incluida la fecha de finalización. En mi tabla de dimdate he calculado columna que me da los días laborables por semana (de lunes a viernes:

Primero:

NombreDe Día : FORMAT(dimdate[Date]; "ddd")
Entonces:

WeekdayYN - IF(OR(dimdate[DayName] - "za" ; (dimdate[NombreDeDía] - "zo")); "0" ; "1")

Después de estos dos colums calculados agregué unacolumna calcuada en mi tabla Empleos:

DaysDurationEmployment á CALCULATE(SUM(dimdate[WeekdayYN]);
VAR EndDateEmployment á IF(ISBLANK(tb_Schedules[EndDate]); HOY(); tb_Schedules[EndDate])
devolución
DATESBETWEEN (dimdate[Date]; tb_Schedules[StartDate]; EndDateEmployment))
Lo que da como resultado: (con la tabla relacionada con el nombre del empleado)
EmpleadoStartDateEnddateDaysDurationEmpleo
Annemiek25-9-2019 00:0030-9-2019 00:004
Annemiek1-10-2019 00:0031-12-2019 00:0066
Annemiek1-1-2020 00:00 98
Anouk2-9-2019 00:00 185

Con la columna [DaysDurationEmployment] puedo calcular cualquier cosa que necesite.

¡Resuelto! 🙂

V-pazhen-msft
Community Support
Community Support

@AltusTellus

Lo siento, debido a la política no podemos utilizar el mensaje personal. Puede crear una muestra corta con valor aleatorio en las columnas. Para poder probarlo. Gracias

Paul

Hola

La tabla 'Programaciones' tiene el siguiente aspecto:

PromedioHorasIdentificación de empleoEnddateStartDate
40Campo guíaNull1-1-2016 00:00
36Campo guíaNull1-1-2019 00:00
36Campo guía31-12-2018 00:001-7-2018 00:00
24Campo guíaNull1-5-2020 00:00

y la otra tabla es 'Empleo' (que utilizo para el [EmployeeFullName]:

EmployeeFullNameIdentificación de empleo
AnnemiekCampo guía
AnoukCampo guía
AntoonCampo guía
CarlaCampo guía


¿Es esto lo que necesitas / te gusta tener que llegar a una solución? Muchos thnx.

V-pazhen-msft
Community Support
Community Support

@AltusTellus
¿El dax tiene ahora una medida o una columna? Le recomiendo que cree TotalHours con una columna calculada y, a continuación, cree la siguiente columna como resultado para rellenar los espacios en blanco:

Result = 
var latestdate = CALCULATE(MAX('Table'[Date]),FILTER('Table','Table'[Totalhours]<>BLANK()&& [Date]<=EARLIER('Table'[Date])))
Return IF([Totalhours]=BLANK(),CALCULATE(MAX([Totalhours]),FILTER('Table',[Date]=latestdate)),'Table'[Totalhours])

Equipo de Apoyo Comunitario Paul Zheng _
Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Querido Pablo,

Basado en su entrada (thnx!) Hice la siguiente columna calculada:

TotalHours ?
var latestdate á CALCULATE(MAX('tb_Schedules'[EndDate]);
FILTRO('tb_Schedules';' tb_Schedules'[AverageHours]<>BLANK()&& 'tb_Schedules'[EndDate]<-EARLIER('tb_Schedules'[EndDate])))
Devolver IF([AverageHours]-BLANK(); CALCULATE(MAX([AverageHours]); FILTRO('tb_Schedules';[ EndDate]-latestdate)); [AverageHours])
Esto no tiene sentido por desgracia, todavía tengo la misma matriz con campos en blanco. ¿Qué he hecho mal?

@AltusTellus

Necesita 2 columnas en total, la 1a columna es TotalHours que tiene campos en blanco. Yalo tienes en una medida, pero necesitas cambiarlo a una columna.

La 2a columna es la columna de resultados que desea, la lógica es SI la 1a columna [TotalHours] está en blanco, devuelve las ventas de la última fecha. Debe cambiar el [AverageHours] a [TotalHours] (1a columna tiene espacios en blanco) que ha creado.

2a columna ?
var latestdate á CALCULATE(MAX('tb_Schedules'[EndDate]);
FILTRO('tb_Schedules';' tb_Schedules'[AverageHours]<>BLANK()&& 'tb_Schedules'[EndDate]<-EARLIER('tb_Schedules'[EndDate])))
Devolver IF([AverageHours]-BLANK(); CALCULATE(MAX([AverageHours]); FILTRO('tb_Schedules';[ EndDate]-latestdate)); [PromedioHoras])

Equipo de Apoyo Comunitario Paul Zheng _
Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Hola Paul,

Creo que ya casi llegamos, pero no entiendo completamente tu DAX. Información adicional: la tabla 'tb_Schedules' tiene varias columnas como [AverageHours], [EmployeeHID], [StartDate] y [EndDate]. No hay espacios en blanco en las columnas.

En la tabla 'dimdate' (que contiene todos los datos de referencia desde 2013 hasta 2099) el campo [Fecha] está conectado con [StartDate] de la tabla 'tb_Schedules'. En una matriz pongo [Empleado] como filas y [Fecha] como columnas. Con su DAX el resultado es:

Employee and average hours per startdate.png

Usted ve que este empleado tiene un horario que comenzó el 25 de septiembre de 2019 y tiene un nuevo horario para el 1 de octubre. Después de eso tengo espacios en blanco hasta un nuevo horario para este empleado por el 1 de enero de 2020.

Lo que me gustaría ver (y usar para cálculos adicionales) es que no hay espacios en blanco, sino el último valor de la programación actual hasta la programación secuenciada. Tenga en cuenta que esta captura de pantalla es con los días como columnas, voy a ir a números de semana.

¿Puedes ayudarme más, por favor? ¡Muchas gracias!

@AltusTellus

Podrías compartir tu muestra si no pudieras obtener mi siguiente explicación. Explico la lógica del dax en dos partes.


1. La situación actual es que ya ha creado la siguiente columna [TotalHours],pero tiene espacios en blanco y desea llenar los espacios en blanco con el último valor no en blanco de la programación actual.

TotalHours = 
CALCULATE(SUM(tb_Schedules[AverageHours]);
    FILTER(tb_Schedules;
tb_Schedules[StartDate] >= MAX(tb_Schedules[StartDate]) &&
tb_Schedules[EndDate] <= MIN(tb_Schedules[EndDate])))

2. Para llenar el espacio en blanco con el último valor no en blanco, primero encontrará la última fecha de la programación actual que tiene un valor con "VAR lastesdate", luego regrese con un fucntion IF, si [TotalHours] está en blanco devolver el valor de lasted non blank value at then, Si no en blanco simplemente devuelve [TotalHours]. Esta es la columna que debe poner en la matriz:

TotalHours Fill Blanks = 
VAR latestdate = CALCULATE(MAX('tb_Schedules'[EndDate]);
FILTER('tb_Schedules';'tb_Schedules'[TotalHours]<>BLANK()&& 'tb_Schedules'[EndDate]<=EARLIER('tb_Schedules'[EndDate])))
 
Return IF([TotalHours]=BLANK();CALCULATE(MAX([TotalHours]);FILTER('tb_Schedules';[EndDate]=latestdate));[TotalHours])

Equipo de Apoyo Comunitario Paul Zheng _
Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Y así es como se ve en una tabla:

Employee and average hours per startdate (table)_v2.png

Tu explicación es clara, thnx para eso. Por lo tanto, tengo dos columnas extra: [TotalHours] y [TotalHours Fill Blanks]. El resultado es:

Employee and average hours per startdate_v2.png

¿Es porque hemos olvidado filtrar también en la columna [Empleado]? ¿O algo más?

Si es necesario: la información es confidencial, ¿puedo compartir mi archivo enviándole DM?

AltusTellus
Helper III
Helper III

Información adicional: esta pestaña con Horarios está conectada a mi tabla de dimdate. Creo que tiene algo que ver con ADDCOLUMNS pero no sé cómo hacerlo.

Greg_Deckler
Super User
Super User

Necesitarás algo a lo largo de las líneas de Open Tickets. https://community.powerbi.com/t5/Quick-Measures-Gallery/Open-Tickets/m-p/409364#M147

Los datos de muestra como texto serían geniales. Por favor, consulte este post sobre cómo obtener su pregunta respondida rápidamente: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

Muchas gracias por su respuesta! En el artículo al que hace referencia me falta información adicional sobre las tablas del ejemplo DAX. Desgraciadamente, no lo entiendo.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

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

April Fabric Community Update

Fabric Community Update - April 2024

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