cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Advocate V
Advocate V

Empleados activos por período

Hola

luchando con lo que debería ser simple. Tengo dos tablas ('crm_employees' y 'DimDates'). Existe una relación entre ellos (ver imagen a continuación).

Table RelationshipRelación de tabla

Lo que estoy tratando de calcular es

  1. el total de personas que han comenzado en un período determinado, y
  2. el total de personas que siguen activas (es decir, "Fecha de finalización del contrato" vacías o en el futuro)

Esta es mi medida para los activos:

Empleados activos: 
CALCULATE(
	COUNTA(crm_employees[Empleado]);
	crm_employees[Código de estado] - "Activo"
)

Y esto para el total de carreras:

Empleados activos que se ejecutan en total en Fecha , 
CALCULATE(
	'Medidas clave'[Empleados activos];
	FILTER(
		ALLSELECTED('DimDates'[Date]);
		ISONORAFTER('DimDates'[Fecha]; MAX('DimDates'[Fecha]); DESC)
) )

Mis problemas:

  1. es que no cuenta los empleados donde la fecha de inicio del contrato está vacía. Supongo que es porque no puede relacionar el 'inicio de contrato' vacío con el campo 'DimDates' Date.
  2. el total sólo está aumentando, lo cual no es correcto. por ejemplo, tuvimos más empleados en agosto de 2016 que en junio de 2017, pero esto no se refleja como se puede ver a continuación. La medida aplica obviamente el filtro 'activo' independientemente de cuándo un empleado se volvió inactivo ('fecha de finalización del contrato'). Creo que necesito redefinir la medida para contar los empleados "activos" para considerar el período durante el cual estuvieron activos (desde la "fecha de inicio del contrato" hasta la "fecha de finalización del contrato"), pero no sé cómo hacerlo.

Total Employees per PeriodTotal de empleados por período

Best - Sascha
Please always mark accepted solutions. It helps others with similar questions or problems. Thank you.
1 ACCEPTED SOLUTION

Gracias por el consejo. Lo intenté y tampoco obtengo el resultado correcto. Lo que consigo es el número de empleados que se fueron en un período específico (por ejemplo, mes).

Como tengo que entregar el informe hoy, decidí adoptar un enfoque diferente, mostrando el número de uniones, abandonadores y la evolución general del personal activo como en la siguiente tabla.

Clipboard02.jpg

Best - Sascha
Please always mark accepted solutions. It helps others with similar questions or problems. Thank you.

View solution in original post

27 REPLIES 27
Helper II
Helper II

Hola

Estaba tratando de hacer algo similar, pero para las requisas de trabajo. Desea contar el número de solicitudes abiertas a lo largo del tiempo. Mi equivalente de "Fecha de inicio" es "Fecha aprobada" y mi equivalente de "Fecha de finalización" es "Fecha de última modificación".

La siguiente fórmula funcionó para mí:

Solicitudes abiertas - 
VAR MinDate
    ? MIN ( 'Tabla de fechas'[Fecha] )
VAR MaxDate ? MAX (
    'Tabla de fechas'[Fecha] )
RETURN CALCULATE (
        DISTINCTCOUNT (Requisitions[Job Req ID] ),
        Solicitudes[Fecha de aprobación] <- MinDate,
        Solicitudes[Last Modified] >- MaxDate
    )

Esta es mi salida:

Capture2.PNG

Tengo un modelo de datos simple:

Capture.PNG

Feliz de proporcionar más detalles si eso ayuda.

Gracias

mate

mtomlinson - La diferencia con su fórmula es que no incluirá las solicitudes que se abrieron antes de la fecha mínima y todavía están abiertas. Esto puede o no ser relevante en su solución. Al contar todos los empleados activos dentro de un intervalo de fechas especificado, es necesario incluir aquellos con una fecha contratada antes del intervalo de fechas (y siguen activos).

@rl_evans En realidad, no veo por qué eso importaría - si un empleado tuviera una fecha antes de minDate, todavía cumpliría con los criterios a contar...

¿Me estoy perdiendo algo?

@rl_evans también, como un aparte - ¿cómo ha definido su modelo de datos? ¿Está utilizando relaciones inactivas? Si es así, ¿puede mantener las inercciones funcionando para que pueda, por ejemplo, seleccionar un mes en particular y ver todos los empleados activos para ese mes en particular?

@mtomlinson - Tengo una relación activa entre la tabla de fechas y la tabla de empleados con una relación de uno a muchos entre la fecha[fecha] y el empleado[contratado].

Cada barra del gráfico de barras (con el ejemplo) representa un período determinado (es decir, un intervalo de fechas). Este intervalo de fechas establece el contexto de fecha para la instrucción DAX. El contexto de fecha filtra la tabla de empleados solo a los empleados contratados dentro del contexto de intervalo de fechas (debido a la relación con la tabla de fechas). Piense en ello como si la instrucción DAX se ejecuta por separado para cada período. Al buscar a todos los empleados activos al final del período, todos los empleados contratados antes del contexto del intervalo de fechas deben incluirse, ya que pueden seguir siendo empleados activos. La función ALL() permite a CalculateTable ignorar el contexto del intervalo de fechas del período.

Intenté usar su declaración DAX y encontré (en mi modelo) que no incluye a los empleados contratados antes del período. ¿Ha verificado que su fórmula incluye todas las solicitudes abiertas antes del período y sigue abierta?

@mtomlinson - Hice un poco más de excavación. Dado que no tiene una relación activa entre la fecha y la solicitud, no tiene un contexto de fecha que limite los registros en la instrucción de cálculo. Por lo tanto, si ha modificado la instrucción DAX para que se parezca a la siguiente, debe comportarse igual que la mía. Esto supone que la fecha de la última modificación está en blanco si la solicitud sigue abierta.

Solicitudes abiertas : 
VAR MaxDate
    ( 'Tabla de fechas'[Fecha] )
RETURN CALCULATE (
        DISTINCTCOUNT (Requisitions[Job Req ID] ),
        Requisitions[Fecha aprobada] <- MaxDate,
        OR(ISBLANK(Requisitions[Last Modified]),
Solicitudes[Last Modified] > MaxDate) )

@rl_evans Gracias por indagó en esto - es más complicado de resolve de lo que pensé.

He probado la fórmula que sugeriste, pero esto todavía no me permite filtrar usando el gráfico por desgracia.

También he intentado replicar lo que tiene eliminando mi relación con [Fecha de última modificación] y [Fecha] en mi tabla de fechas, y luego activando la relación entre [Fecha aprobada] y [Fecha]. Entonces he usado tu fórmula original. El gráfico se ve bien, pero cuando veo un mes en el gráfico para filtrar, todas mis filas aparecen en blanco (ver captura de pantalla a continuación).

¿Puede filtrar correctamente para los empleados relevantes activos en el período utilizando el gráfico?

Capture.PNG

@rl_evans Supongo que el filtrado que no funciona se debe al hecho de que si estoy seleccionando un mes determinado, y la relación entre [Fecha aprobada] y [Fecha] está activa, entonces solo estoy filtrando los datos para todas las [Fechas aprobadas] en ese mes. El filtro no tiene en cuenta la medida en absoluto.

@rl_evans He hecho un poco de pruebas y este parece ser el caso

@mtomlinson: se devuelve cualquier objeto visual que cuente las solicitudes activas debe basarse en un cálculo que pueda omitir el contexto de fecha (cuando hay una relación activa entre date y ApprovedDate.

@rl_evans es un buen punto. En mi caso, todas las solicitudes tienen una fecha aprobada y mi tabla de fechas se define dinámicamente utilizando la fecha mínima aprobada.

¿Una cláusula OR simple no resolvería esto? Eg...

Solicitudes abiertas - 
VAR MinDate
    ? MIN ( 'Tabla de fechas'[Fecha] )
VAR MaxDate ? MAX (
    'Tabla de fechas'[Fecha] )
RETURN CALCULATE (
        PREGUNTAS[ID de req de trabajo] ),
        OR(Requisitions[Fecha de aprobación] <-MinDate,ISBLANK(Requisitions[Fecha de aprobación])),
        Solicitudes[Last Modified] >- MaxDate
    )

Ignora lo anterior - acaba de darse cuenta de que dijo una fecha antes de la fecha mínima, no una fecha en blanco!

Microsoft
Microsoft

@skasper,

Utilice el DAX a continuación para calcular los empleados activos y comprobar si obtiene el resultado esperado.

Empleados activos: 
CALCULATE(
	COUNTA('crm_employees'[Empleado]);
	FILTER('crm_employees' , ('crm_employees'[Inicio del contrato] <'LASTDATE('DimDates'[Fecha]) 
&& 'crm_employees'[Fin del contrato]> ? FIRSTDATE('DimDates'[Fecha])))

)



saludos

Community Support Team _ Lydia Zhang
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

Gracias por el consejo. Lo intenté y tampoco obtengo el resultado correcto. Lo que consigo es el número de empleados que se fueron en un período específico (por ejemplo, mes).

Como tengo que entregar el informe hoy, decidí adoptar un enfoque diferente, mostrando el número de uniones, abandonadores y la evolución general del personal activo como en la siguiente tabla.

Clipboard02.jpg

Best - Sascha
Please always mark accepted solutions. It helps others with similar questions or problems. Thank you.

View solution in original post

Hola Sascha,

Me gusta tu apporach. Soy nuevo en Power BI y estoy buscando ordenar Joiners, Leavers y Active Running total por mes, trimestre e YTD. Nuestro año fiscal es julio-junio. Agradezco su ayuda aquí.

Gracias.

He encontrado este mismo requisito esta semana. Así es como lo resolví.

• Empleados al final del período ?
VAR MaxDate á MAX ( 'Fecha'[Fecha] )

Empcnt vara ( VAR EmpCnt)
CALCULAR (
COUNTROWS (
CALCULATETABLE ( 'Empleados', 'Empleados'[HireDate] <-MaxDate, ALL ( 'Fecha' )

),
(ISBLANK ( 'Empleados'[TerminationDate] ) 'Employees' [TerminationDate] > MaxDate)
)
devolución
IF ( ISBLANK ( EmpCnt ), 0, EmpCnt )

En mi conjunto de datos, los empleados que están activos actualmente tienen una fecha de terminación en blanco. La función Calcular devuelve Blank, en lugar de cero, cuando el recuento es cero para un período determinado; por eso el último IF se utiliza después de la DEVOLUCIÓN.

Hola @rl_evans

Así que terminé con este cálculo DAX con algo de ayuda,

Recuento de empleados activos : 

VAR EndOfPeriod ? MAX ('Calendar'[Date])
VAR StartOfPeriod ? MIN ('Calendar'[Date])

RETURN CALCULATE (
DISTINCTCOUNT(v_FSASHRBIDATA[EmpId]),
FILTER(
ALL('v_FSASHRBIDATA'), 
(v_FSASHRBIDATA[EmploymentDate] <- EndOfPeriod &&&
v_FSASHRBIDATA[TerminationDate] >- StartOfPeriod)
) ) +
CALCULATE(
DISTINCTCOUNT('v_FSASHRBIDATA'[EmpId]),
FILTER(
ALL(v_FSASHRBIDATA),
('v_FSASHRBIDATA'[EmploymentDate]<-EndOfPeriod
&& 'v_FSASHRBIDATA'[TerminationDate] á blank()
) )
) 
 
Pero si un empleado tiene 2 juegos de fecha de contratación en el mismo año, parece ser contado como dobbel.
ex.
Capture.JPG
El último empleado solo debe contarse como 1 si el año se filtra a 2015.
¿Puedo de alguna manera tener eso en cuenta?
Cualquier ayuda/asesoramiento sería apreciado.
Gracias.

@rado81 Supongo que depende de lo que intentes contar. Si la misma persona es contratada dos veces en el mismo año, ¿no es lo mismo que contratar a dos personas ese año? Sólo porque sea la misma persona no cambia el hecho de que hubo dos contrataciones. En otras palabras, si ignora el nombre del empleado, los eventos son 1) y se contrata al empleado, 2) se separa un empleado, 3) se contrata a un empleado. Son dos contrataciones y una separación que ocurrió en el año. Eso no cambia el número de empleados que estuvieron activos en un período determinado.

@rl_evans Estuve de acuerdo con usted, pero también no estoy tratando de mostrar cuántas personas donde se contrata en un período dado, pero ¿cuántas en su actividad, y si usted tiene la misma persona contratada dos veces en un año, en términos de empleados activos sólo debe ser contado como uno, ¿verdad? parece cambiar mucho el número de empleados activos en los años, cada mes se ve mejor.

@rado81 Mirando tu DAX más de cerca, una cosa que salta es que tu filtro es incorrecto:

(v_FSASHRBIDATA[EmploymentDate] <- EndOfPeriod &&
v_FSASHRBIDATA[TerminationDate] >- StartOfPeriod)

Debería tener este aspecto:

(v_FSASHRBIDATA[EmploymentDate] <- EndOfPeriod &&
v_FSASHRBIDATA[TerminationDate] > EndOfPeriod)

Para contar todos los empleados activos en un período determinado, desea incluir aquellos cuya fecha de terminación es posterior al final del período.

Btw - Un año también es un período, así que si la misma persona fue contratada dos veces en ese período es irrelevante. Si ese período sigue activo al final del año, solo debe haber un registro que muestre a ese individuo como activo. Por lo tanto, sólo se contarían una vez. Si su recuento está apagado, se debe a un problema diferente con su DAX.

Por último, en sus datos, hay una fecha de terminación que muestra el año 1753. Esto no funcionará con su declaración dax, ya que esto significa que la persona fue cancelada antes de ser contratada. Si esa fecha se utiliza para indicar que la persona sigue activa, debe modificar su DAX para buscar esa fecha específica (1/1/1753).

Helpful resources

Announcements
secondImage

Congratulations!

We are excited to announce the Power BI Super Users!

Wave Release 2

Check out the updates in Power BI.

Overview of Power BI 2020 release wave 2!

Microsoft Ignite

Microsoft Ignite

Join digitally, March 2–4, 2021 to explore new tech that's ready to implement. Experience the keynote in mixed reality through AltspaceVR!

secondImage

The largest Power BI virtual conference

100+ sessions, 100+ speakers, Product managers, MVPs, and experts. All about Power BI. Attend online or watch the recordings.