Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
walter_hardy
Contributor III
Contributor III

Cantidad de empleados por año

Buenas a todos! Estoy armando algo que me tiene trabado.

Tengo una sola tabla empleados.

LOAD INLINE [
ID, NOMBRE, INGRESO, BAJA
1, empleadoA, 01/01/2010, 0
2, empleadoB, 03/05/2010, 0
3, empleadoC, 19/03/2010, 16/12/2011
4, empleadoD, 05/11/2011, 06/11/2013
5, empleadoE, 03/05/2011, 0
6, empleadoF, 10/12/2013, 0
7, empleadoG, 10/12/2013, 03/03/2014
8, empleadoH, 04/03/2014, 10/10/2017
9, empleadoI, 05/03/2014, 0
10, empleadoj, 06/03/2014, 10/12/2018
];

Lo que quiero saber es la cantidad de empleados que había a una determinada fecha, mes, año

 

Siguiendo el ejemplo del Inline:

año          #empleados

2010: 3

2011: 4

2012: 4

2013: 5

2014: 7

2015: 7

2016: 7

2017:  6

2018: 5

 

Labels (4)
6 Replies
JustinDallas
Specialist III
Specialist III

Hola, mi espanol es basura, pero trataré.  Tu puedes hacer algo como el bajo,

 

Empleados:
LOAD *,
ID AS '%tenure_calendar_id_key',
Date(Date#(INGRESO,'DD/MM/YYYY')) AS 'LLEGAR',
If([BAJA] = 0, Today(), Date(Date#(BAJA,'DD/MM/YYYY'))) AS 'SALIERON'
;
LOAD * INLINE [
ID, NOMBRE, INGRESO, BAJA
1, empleadoA, 01/01/2010, 0
2, empleadoB, 03/05/2010, 0
3, empleadoC, 19/03/2010, 16/12/2011
4, empleadoD, 05/11/2011, 06/11/2013
5, empleadoE, 03/05/2011, 0
6, empleadoF, 10/12/2013, 0
7, empleadoG, 10/12/2013, 03/03/2014
8, empleadoH, 04/03/2014, 10/10/2017
9, empleadoI, 05/03/2014, 0
10, empleadoj, 06/03/2014, 10/12/2018
];

DROP FIELD [BAJA], INGRESO
;

EmployeeTenureDates:
LOAD
    "ID" AS '%tenure_calendar_id_key',
    Date(StartDate + IterNo() - 1) AS '%master_calendar_key',    
    Date(StartDate + IterNo() - 1) As 'Employee Tenure Date'
While StartDate + IterNo() - 1 <= EndDate
;
LOAD "ID",
  DayStart((Floor("LLEGAR"))) As StartDate,
  DayStart((Floor("SALIERON"))) As EndDate
  Resident Empleados
;

MasterCalendar:
LOAD 
 TempDate AS %master_calendar_key, 
 Date(DayStart(TempDate)) AS CalDate, 
 WEEK(TempDate) As Week, 
 YEAR(TempDate) As Year, 
 MONTH(TempDate) As Month, 
;

//=== Generate a temp table of dates === 
LOAD 
 DATE(mindate + IterNo()) AS TempDate
 ,maxdate // Used in InYearToDate() above, but not kept 
WHILE mindate + IterNo() <= maxdate;

//=== Get min/max dates from Field ===/
LOAD
 MIN(FieldValue('%master_calendar_key', recno()))-1 as mindate,
 MAX(FieldValue('%master_calendar_key', recno())) as maxdate
AUTOGENERATE FieldValueCount('%master_calendar_key');

EXIT Script
;

 

 

Entonces en el chart(?), la measura sería "COUNT(DISTINCT ID)" y la dimensión sería "Year".  Espero que esto ayudara.

albert_guito
Creator II
Creator II

Hola,

Puedes usar la funcion Intervalmatch pero necesitas definir un campo auxiliar BAJA2 para que entienda el rango de intervalo.

Seria algo asi:

Empleados:
LOAD *, Date(If(BAJA=0, Today(),BAJA)) as BAJA2 INLINE [
ID, NOMBRE, INGRESO, BAJA
1, empleadoA, 01/01/2010, 0
2, empleadoB, 03/05/2010, 0
3, empleadoC, 19/03/2010, 16/12/2011
4, empleadoD, 05/11/2011, 06/11/2013
5, empleadoE, 03/05/2011, 0
6, empleadoF, 10/12/2013, 0
7, empleadoG, 10/12/2013, 03/03/2014
8, empleadoH, 04/03/2014, 10/10/2017
9, empleadoI, 05/03/2014, 0
10,empleadoj, 06/03/2014, 10/12/2018
];

//Creamos un calendario con el rango de fechas descrito en la tabla de empleados
Temp_Calendar: Load min(INGRESO) as minDate Resident Empleados;
Let varMinDate = Num(Peek('minDate', 0, 'Temp_Calendar'));
Let varMaxDate = Num(Today());
DROP Table Temp_Calendar;
Calendar: LOAD Date($(varMinDate) + IterNo() - 1) as TempDate AutoGenerate 1 While $(varMinDate) + IterNo() -1 <= $(varMaxDate);

IntervalMatch (TempDate)
Load Distinct INGRESO, BAJA2 Resident Empleados;

DROP Table Calendar;

A partir de aquí puedes crear una tabla que reproduzca lo que comentas.

En la dimension muestras el año: Year(TempDate)

Y en la Expresion simplemente cuentas los empleados sin repetir: Count(Distinct ID)

Ag+

Ag+
walter_hardy
Contributor III
Contributor III
Author

Hola gracias por la respuesta. Debe faltar algún drop field porque me crea una sys table con INGRESO y  BAJA2  y luego crea también una tabla Empleados-1 con INGRESO, BAJA2 y TempDate.

walter_hardy
Contributor III
Contributor III
Author

Hola muchas gracias por tu ayuda. He intentado hacer lo que propones pero tengo una pequeña diferencia que no puedo encontrar cual es el error. Ya con los datos reales fui comprobando los ingresos y las bajas. En los primeros 10 años no hubieron bajas y el Count devuelve el resultado correcto, pero en el primer año que tiene bajas solo devuelve los ingresos acumulados (no resta las bajas) y luego de allí ya no devuelve el resultado correcto, ni siquiera suma los ingresos, da un numero equivocado.

A la primera parte del script donde usas Date(Date#()) tuve que quitar el # porque devuelve todos los valores null tanto en LLEGAR como en SALIERON, en éste ultimo devuelve el valor de Today() correctamente cuando corresponde.

No se cual es el error.
walter_hardy
Contributor III
Contributor III
Author

Albert me podrías ayudar un poco más?
albert_guito
Creator II
Creator II

Si claro,

El problema de la llave sintética se resuelve con un left join sobre la tabla de empleados en el interval martch

Left Join (Empleados)
IntervalMatch (TempDate)
Load Distinct INGRESO, BAJA2 Resident Empleados;

Te refieres a esto?

Es que no entiendo muy bien el problema de comentas con los ingresos y las bajas que no cuadra.

Ag+

Ag+