Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
Je dois calculer les mois de présence des collaborateurs de mon entreprise. Mais le format d'origine de la table que j'interroge ne me convient pas.
1. Ma table d'origine est construite de la façon suivante :
NumSalarie | DateHist | Motif |
68 | 01/09/2004 | Entrée |
300 | 02/07/2012 | Entrée |
300 | 31/12/2012 | Sortie |
300 | 06/02/2013 | Entrée |
300 | 04/03/2013 | Sortie |
2. Pour exploiter ces données avec QlikView, je souhaiterai arriver au résultat suivant :
NumSalarie | DateEntrée | DateSortie |
68 | 01/09/2004 | |
300 | 02/07/2012 | 31/12/2012 |
300 | 06/02/2013 | 04/03/2013 |
J'ai fait un tri des données par NumSalarié, dateEntrée Motif et j'essaye d'utiliser les fonctions peek() et above() mais après plusieurs tentatives, je ne trouve pas la solution.
Quelqu'un a une idée ?
Merci
Essayez la suivante:
tmp:
LOAD NumSalarie,
Date#(DateHist, 'DD/MM/YYYY') as DateHist,
Motif
FROM [EntreesEtSorties.txt] (txt, codepage is 1252, embedded labels, delimiter is '\t', msq);
Entrées:
LOAD NumSalarie,
DateHist as [Entrée],
If(NumSalarie=Peek(NumSalarie),Peek(EntréeNo)+1,1) as EntréeNo
Resident tmp
Where Motif='Entrée'
Order By NumSalarie, DateHist;
Join
LOAD NumSalarie,
DateHist as [Sortie],
If(NumSalarie=Peek(NumSalarie),Peek(EntréeNo)+1,1) as EntréeNo
Resident tmp
Where Motif='Sortie'
Order By NumSalarie, DateHist;
Drop Table tmp;
Bonjour,
il y a un exemple de votre problème dans le document (p 10 et 11)
IntervallMatch and Slowly changing dimensions.pdf
que vous trouverez sur le blog de hic
c'est en anglais.
cdt,
Bonjour,
Merci pour votre réponse, mais je ne peux pas utiliser la fonction intervall match avec le modèle de table du point 1.
Il faudrait d'abord transformer la table 1. et c'est ce point précis qui me pose problème.
Cdt,
Essayez la suivante:
tmp:
LOAD NumSalarie,
Date#(DateHist, 'DD/MM/YYYY') as DateHist,
Motif
FROM [EntreesEtSorties.txt] (txt, codepage is 1252, embedded labels, delimiter is '\t', msq);
Entrées:
LOAD NumSalarie,
DateHist as [Entrée],
If(NumSalarie=Peek(NumSalarie),Peek(EntréeNo)+1,1) as EntréeNo
Resident tmp
Where Motif='Entrée'
Order By NumSalarie, DateHist;
Join
LOAD NumSalarie,
DateHist as [Sortie],
If(NumSalarie=Peek(NumSalarie),Peek(EntréeNo)+1,1) as EntréeNo
Resident tmp
Where Motif='Sortie'
Order By NumSalarie, DateHist;
Drop Table tmp;
... l'exemple cité p 10 et 11 n'utilise pas la fonction Intervallmatch.
mais, vous avez la chance d'avoir la réponse de l'auteur du document en personne !
Oui j'ai vu !
Merci pour votre aide !
Merci Henric ! C'est parfait !
Have a nice day !
Hi Henric,
You assume that each group of NumSalarie start with the motif "Entrée".
If it is not the case, because some NumSalaries are already in when we start to collect the data, we could manage it like that :
SET DateFormat='DD.MM.YYYY';
tmp:
LOAD * INLINE [
NumSalarie, DateHist, Motif
68, 01.02.2004, Sortie
68, 01.09.2004, Entrée
300, 02.07.2012, Entrée
300, 31.12.2012, Sortie
300, 06.02.2013, Entrée
300, 04.03.2013, Sortie
];
Left Join (tmp)
Load NumSalarie,
min(DateHist) as DateHist,
1 as FirstActivity
Resident tmp
group by NumSalarie;
Entrées:
LOAD NumSalarie,
DateHist as [Entrée],
If(NumSalarie=Peek(NumSalarie),Peek(EntréeNo)+1,1) as EntréeNo
Resident tmp
Where Motif='Entrée'
Order By NumSalarie, DateHist;
Join
LOAD NumSalarie,
DateHist as [Sortie],
If(NumSalarie=Peek(NumSalarie),Peek(EntréeNo)+1,if( Len(FirstActivity) = 0,1,0)) as EntréeNo
Resident tmp
Where Motif='Sortie'
Order By NumSalarie, DateHist;
Drop Table tmp;
Bonsoir,
l'ID 68 est donc "absent" entre le 1/02 et le 1/09/2004 ?
merci de vos éclairages 🙂
Oui, c'est exactement ça.
Je voulais juste démontrer que de temps en temps on récupère des mouvements de ce type (entrée - sortie) depuis une certaine date (01/01/2014 dans mon exemple), il ne faut pas oublier de tenir compte de l'état initial. Certain ID était entré avant le 01/01/2014, exactement dans la même idée que tous les ID ne seront pas sorti à la fin du jeu de données.
Il faut donc distinguer l'état initial de chaque ID, afin d'effectuer le traitement correcte pour mettre en relation la date d'entrée et de sortie par ID.