Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
dbombengeraurar
Contributor II
Contributor II

Transformer une table dans le script : Above() / Peek() ?

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 :

NumSalarieDateHistMotif
6801/09/2004Entrée
30002/07/2012Entrée
30031/12/2012Sortie
30006/02/2013Entrée
30004/03/2013Sortie

2. Pour exploiter ces données avec QlikView, je souhaiterai arriver au résultat suivant :

NumSalarieDateEntréeDateSortie
6801/09/2004
30002/07/201231/12/2012
30006/02/201304/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

1 Solution

Accepted Solutions
hic
Former Employee
Former Employee

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;

View solution in original post

10 Replies
nicolas66
Contributor III
Contributor III

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,

dbombengeraurar
Contributor II
Contributor II
Author

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,

hic
Former Employee
Former Employee

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;

nicolas66
Contributor III
Contributor III

... 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 !

dbombengeraurar
Contributor II
Contributor II
Author

Oui j'ai vu !

Merci pour votre aide !

dbombengeraurar
Contributor II
Contributor II
Author

Merci Henric ! C'est parfait !

Have a nice day !

sfatoux72
Partner - Specialist
Partner - Specialist

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;

nicolas66
Contributor III
Contributor III

Bonsoir,

l'ID 68 est donc "absent" entre le 1/02 et le 1/09/2004 ?

merci de vos éclairages 🙂

sfatoux72
Partner - Specialist
Partner - Specialist

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.