Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
J'ai un fichier Excel avec (pour faire simple) le nom des salariés, la date d'entrée et la date de sortie pour chaque salarié.
Je souhaite dans qlikview calculer:
- L'ancienneté: si pas de date de Sortie alors date du jour-Date entrée sinon Date Sortie-Date entrée
- Le nombre de salarié (en fonction de l'année sélectionné)
Mais je bloque et je ne sais pas comment créer ces deux indicateurs (set analysis, if statement)...
Merci de votre aide.
Loic MASSON
Bonjour Loïc,
Il faut que tu aies, au minimum, la situation de chaque salarié le dernier jour du mois.
Il faudra donc que tu utilises ton calendrier et, via la fonction IntervalMatch, tu "dupliques" les contrats de chaque salarié.
Ainsi une expression du type =count([MATRICULE DU SALARIE]) te donnera le nombre de salarié.
Pour le calcul de l'ancienneté, tu peux le faire dans ton chargement de données en faisant la différence avec la date de sortie ou celle du jour et la date d'entrée dans la société.
Bonjour Laurent,
Merci pour ta réponse, pour le moment, j'ai le script suivant et je ne vois comment je peux arriver à mes fins...
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 €;-# ##0,00 €';
SET TimeFormat='h:mm:ss TT';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY h:mm:ss[.fff] TT';
//SET MonthNames='Jan;Fev;Mar;Avr;Mai;Juin;Juil;Aout;Sep;Oct;Nov;Dec';
SET MonthNames='07-Jan;08-Fev;09-Mar;10-Avr;11-Mai;12-Juin;01-Juil;02-Aout;03-Sep;04-Oct;05-Nov;06-Dec';
SET DayNames='Lun;Mar;Mer;Jeu;Ven;Sam;Dim';
PERIODE_FISCALE:
LOAD * INLINE [
MIN, MAX, PERIODE
01/01/2011, 31/12/2011, 2011
01/01/2012, 31/12/2012, 2012
01/01/2013, 31/12/2013, 2013
01/01/2014, 31/12/2014, 2014
01/01/2015, 31/12/2015, 2015
01/01/2016, 31/12/2016, 2016
01/01/2017, 31/12/2017, 2017];
CALENDRIER:
LOAD
Date($(vDateMin)+RecNo()) as Date,
//Year($(vDateMin)+RecNo()) as [Fiscal Year],
month($(vDateMin)+RecNo()) as [Mois_fiscal],
num(Month($(vDateMin)+RecNo()))-3 as FiscalMonthNum,
Day($(vDateMin)+RecNo()) as [Jour],
'T'&ceil(month($(vDateMin)+RecNo())/3) as [Trimestre], // ceil = arrondi à l'entier supérieur. Pour calculer le trimestre, on divise le numéro de mois par 3 puis on arrondi à l'entier supérieur. T entre guillemets simple pour rajouter le T devant le n° de trimestre.
Week(Date($(vDateMin)+RecNo()))-1 as Semaine,
WeekDay($(vDateMin)+RecNo()) as [Jour semaine],
Date($(vDateMin)+RecNo()) as Period1
AUTOGENERATE($(vNbJours));
LEFT Join
IntervalMatch(Date)
LOAD
MIN,
MAX
Resident PERIODE_FISCALE;
JOIN
LOAD *
Resident PERIODE_FISCALE;
DROP TABLE PERIODE_FISCALE;
FAITS:
LOAD
SITE,
NOM,
//PRENOM,
SEXE,
"Date de naissance",
Nationalité,
"Type contrat",
"Date d'entrée",
"Date de sortie",
today() as "Date",
if("Date de sortie"='',Age(Today(),"Date d'entrée"),Age("Date de sortie","Date d'entrée")) as Ancienneté,
"Salaire base 2017",
"Salaire base 2016",
Coefficient,
"Temps travail",
Syndicat,
Encadrement,
'DEMOGRAPHIE' as TYPE_FAITS,
ID_RH
FROM [lib://BDD/Tableau de données salariés.xlsx]
(ooxml, embedded labels, table is [Données salariés]);
exit script;
Tu as besoin de connaître uniquement le nombre de salariés en fin d'année ? pas à chaque fin de mois ?
Tu n'as pas d'erreur à l’exécution de ton script ? je pense notamment au calcul de l'Ancienneté.
Peux-tu partager ton fichier Tableau de données salariés.xlsx en enlevant les données des champs NOM, PRENOM et Date de naissance pour la confidentialité ?
Non je n'ai pas d'erreur mais ci je prends en compte ma table calendrier mon résultat déconne. J'aimerai si possible l'avoir en fin de mois et fin d'année...
Je te conseille la lecture de ce tuto pour créer ton calendrier :
Désolé impossible de t'envoyer mon fichier en pj (juste une image ou une video). C'est un wetransfer du coup!
Loïc,
Il ne te reste plus qu'à faire ton graphique en prenant l'Année en dimension et count(distinct ID_RH) en expression.
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 €;-# ##0,00 €';
SET TimeFormat='h:mm:ss TT';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY h:mm:ss[.fff] TT';
//SET MonthNames='Jan;Fev;Mar;Avr;Mai;Juin;Juil;Aout;Sep;Oct;Nov;Dec';
SET MonthNames='07-Jan;08-Fev;09-Mar;10-Avr;11-Mai;12-Juin;01-Juil;02-Aout;03-Sep;04-Oct;05-Nov;06-Dec';
SET DayNames='Lun;Mar;Mer;Jeu;Ven;Sam;Dim';
/*
PERIODE_FISCALE:
LOAD * INLINE [
MIN, MAX, PERIODE
01/01/2011, 31/12/2011, 2011
01/01/2012, 31/12/2012, 2012
01/01/2013, 31/12/2013, 2013
01/01/2014, 31/12/2014, 2014
01/01/2015, 31/12/2015, 2015
01/01/2016, 31/12/2016, 2016
01/01/2017, 31/12/2017, 2017];
CALENDRIER:
LOAD
Date($(vDateMin)+RecNo()) as Date,
//Year($(vDateMin)+RecNo()) as [Fiscal Year],
month($(vDateMin)+RecNo()) as [Mois_fiscal],
num(Month($(vDateMin)+RecNo()))-3 as FiscalMonthNum,
Day($(vDateMin)+RecNo()) as [Jour],
'T'&ceil(month($(vDateMin)+RecNo())/3) as [Trimestre], // ceil = arrondi à l'entier supérieur. Pour calculer le trimestre, on divise le numéro de mois par 3 puis on arrondi à l'entier supérieur. T entre guillemets simple pour rajouter le T devant le n° de trimestre.
Week(Date($(vDateMin)+RecNo()))-1 as Semaine,
WeekDay($(vDateMin)+RecNo()) as [Jour semaine],
Date($(vDateMin)+RecNo()) as Period1
AUTOGENERATE($(vNbJours));
LEFT Join
IntervalMatch(Date)
LOAD
MIN,
MAX
Resident PERIODE_FISCALE;
JOIN
LOAD *
Resident PERIODE_FISCALE;
DROP TABLE PERIODE_FISCALE;
*/
LET vMinDate = Num(Makedate(2011,1,1));
LET vMaxDate = Num(Makedate(Year(Now()),Month(Now()),Day(Now())));
ChampDate:
LOAD date($(vMinDate)+IterNo()-1) as MaDate
AUTOGENERATE (1)
WHILE $(vMinDate)+IterNo()-1 <= $(vMaxDate);
Calendrier:
LOAD
MaDate as Date,
Year(MaDate) as Année,
'T ' & Num(Ceil(Month(MaDate)/3),'(ROM)0') as Trimestre,
Month(MaDate) as Mois,
MonthEnd(MaDate)as DateFinMois,
Week(MaDate) as Semaine,
Weekday(MaDate) as JourSemaine,
Day(MaDate) as Jour,
if(MaDate=floor(MonthEnd(MaDate)),1,0) as FDM // FDM = Fin De Mois
RESIDENT ChampDate;
DROP TABLE ChampDate;
SET vMinDate = ;
SET vMaxDate = ;
FAITS_TEMP:
NoConcatenate
LOAD
SITE,
NOM,
//PRENOM,
SEXE,
"Date de naissance",
Nationalité,
"Type contrat",
"Date d'entrée" as DATE_ENTREE,
"Date de sortie",
If(IsNull("Date de sortie"),MakeDate(Year(Today()), 12, 31),"Date de sortie") as DATE_FIN ,
if("Date de sortie"='',Age(Today(),"Date d'entrée"),Age("Date de sortie","Date d'entrée")) as Ancienneté,
"Salaire base 2017",
"Salaire base 2016",
Coefficient,
"Temps travail",
Syndicat,
Encadrement,
'DEMOGRAPHIE' as TYPE_FAITS,
ID_RH
FROM
[Tableau de données salariés.xlsx]
(ooxml, embedded labels, table is [Données salariés])
Where Len("Date d'entrée") >0;
PERIODE:
NoConcatenate
LOAD Date
Resident Calendrier
Where FDM = 1;
// Ajout des dates comprises entre chaque intervalle.
joined:
INNER JOIN(PERIODE) INTERVALMATCH(Date) LOAD distinct DATE_ENTREE,DATE_FIN RESIDENT FAITS_TEMP;
FAITS:
NoConcatenate
LOAD *
Resident FAITS_TEMP;
Left Join
LOAD *
Resident PERIODE;
DROP Table PERIODE;
DROP Table FAITS_TEMP;
Loïc,
As-tu essayé ma solution ?
Si ça te convient, merci de clôturer le post, mettre "Correcte" pour la bonne réponse et "UTILE" pour le ou les réponses utiles.