Qlik Community

New to Qlik Sense

Discussion board where members can get started with Qlik Sense.

Announcements
Attend QlikWorld 2020 and hear keynote speaker, Malcolm Gladwell. Register by February 29th to save $200. Learn More
Highlighted
walter_hardy
New 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
Highlighted
JustinDallas
Valued Contributor II

Re: Cantidad de empleados por año

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.

Highlighted
albert_guito
Contributor II

Re: Cantidad de empleados por año

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+
Highlighted
walter_hardy
New Contributor III

Re: Cantidad de empleados por año

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.

Highlighted
walter_hardy
New Contributor III

Re: Cantidad de empleados por año

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.
Highlighted
walter_hardy
New Contributor III

Re: Cantidad de empleados por año

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

Re: Cantidad de empleados por año

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+