Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
mxcommunaute
Contributor II
Contributor II

Croiser les données de deux tables

Bonjour,

Je galère depuis des jours sur mon script, alors je lance cet appel à l'aide.

Dans une table, j'ai les colonnes

matricule, sexe, age, fonction, date_changement

Et des données qui peuvent ressembler à cela :

123456,M,24,Dev,21/01/2019

123456,M,24,DSI, 22/02/2019

124561,F,46,Secrétaire,01/01/2001

124561,F,46,Directrice,01/04/2018

124878,F,56,Vaguemestre,01/01/2019

...

Comme vous le voyez, je peux avoir plusieurs enregistrements avec un seul matricule. Les colonnes sexe, age sont toujours les mêmes pour chaque matricule. Seules les dates de changement et les fonctions changent.

Mon objectif est de créer une table qui contiendrait uniquement les dernières données par matricule.

C'est à dire, un table qui contiendrait :

matricule, sexe, age, fonction, date_changement

123456,M,24,DSI, 22/02/2019

124561,F,46,Directrice,01/04/2018

124878,F,56,Vaguemestre,01/01/2019

J'arrive juste à créer de nouvelles valeurs ainsi :

Final:
Load

Matricule,
max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement

Resident Temp
Group By Matricule;

Drop Table Temp;

Mais je ne vois pas comment conserver (ou ajouter) les autres champs : sexe, age et fonction sans que cela n'annule le regroupement par matricule.

Auriez vous une idée ?

Je vous remercie

9 Replies
christophebrault
Specialist
Specialist

Bonjour,

 

Tu n'es pas loin d'une des solutions possibles que je te proposes :

Effectif: // chargement des données de base

Load * 

From Source ; // A modifier pour charger le fichier source

 

right join (Effectif)

Load

Matricule,

sexe,

age,

fonction,

max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement

Resident Temp
Group By Matricule,sexe,age,fonction;

 

Le right join se fait sur tous les champs des deux tables, mais en se basant sur les  enregistrements de la deuxième qui ne comporte qu'une seule ligne par MAtricule.

 

Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin
mxcommunaute
Contributor II
Contributor II
Author

Bonjour,

Merci pour ta réponse, elle m'aide beaucoup.

Il me reste tout de même un point à éclaircir.

Avec ton aide, mon script ressemble maintenant à ceci :

Temp:
Load * Inline
[
Matricule, sexe, age, fonction, date_changement
123456,M,24,Dev,'21/01/2019'
123456,M,24,DSI, '22/02/2019'
124561,F,46,Secrétaire,'01/01/2001'
124561,F,46,Directrice,'01/04/2018'
124878,F,56,Vaguemestre,'01/01/2019'
424878,F,16,fonction,'01/01/2019'
424878,F,16,fonction2,'01/01/2017'
];
Effectif: // chargement des données de base NOCONCATENATE Load Matricule, sexe, age, fonction, date_changement Inline [ Matricule, sexe, age, fonction, date_changement 123456,M,24,Dev,'21/01/2019' 123456,M,24,DSI, '22/02/2019' 124561,F,46,Secrétaire,'01/01/2001' 124561,F,46,Directrice,'01/04/2018' 124878,F,56,Vaguemestre,'01/01/2019' 424878,F,16,fonction,'01/01/2019' 424878,F,16,fonction2,'01/01/2017' ]; right join (Effectif) Load Matricule, sexe, age, fonction, max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement
Resident Temp Group By Matricule,sexe,age,fonction; Drop Table Temp;

Quand je créé ensuite un tableau graphique avec les données : matricule, sexe et age, il s'affiche correctement, les informations sont regroupées par matricule.

Matricule	sexe	age
123456	M	24
124561	F	46
124878	F	56
424878	F	16

Par contre, si j'ajoute une colonne "fonction", pour visualiser la dernière fonction occupée, le tableau graphique me présente tous les enregistrement, en ne tenant donc plus compte du group by initial. C'est la même chose quand j'insère la colonne date_changement.

Matricule	sexe	age	fonction
123456	M	24	Dev
123456	M	24	DSI
124561	F	46	Directrice
124561	F	46	Secrétaire
124878	F	56	Vaguemestre
424878	F	16	fonction
424878	F	16	fonction2

De la même façon, quand je génère un KPI avg(age), je me rends compte qu'il calcule la moyenne sur l'ensemble des enregistrements et non sur la table groupée.

Une idée ?

Merci encore !

christophebrault
Specialist
Specialist

Bonjour,

Il ne faut plus charger ta table Temp, car en l'état tes données sont doublées.

Charge juste :

 

Effectif: // chargement des données de base
NOCONCATENATE Load * Inline
[
Matricule, sexe, age, fonction, date_changement

123456,M,24,Dev,'21/01/2019'
123456,M,24,DSI, '22/02/2019'
124561,F,46,Secrétaire,'01/01/2001'
124561,F,46,Directrice,'01/04/2018'
124878,F,56,Vaguemestre,'01/01/2019'
424878,F,16,fonction,'01/01/2019'
424878,F,16,fonction2,'01/01/2017'
];
 
right join (Effectif)
  Load
Matricule,
sexe,
age,
fonction,
max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement

Resident Effectif Group By Matricule,sexe,age,fonction;
Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin
mxcommunaute
Contributor II
Contributor II
Author

Bonjour,

Je dois rater quelque chose, car en supprimant Temp j'ai toujours exactement le même résultat : il regroupe tant qu'on ne demande pas à afficher un champ qui varie d'une entrée à l'autre.

Le rendu avec Matricule, sexe, age :

Matricule	sexe	age
123456	M	24
124561	F	46
124878	F	56
424878	F	16

Le rendu avec Matricule, sexe, age, date_changement :

Matricule	sexe	age	date_changement
123456	M	24	43486
123456	M	24	43518
124561	F	46	01/01/2001
124561	F	46	43191
124878	F	56	01/01/2019
424878	F	16	01/01/2017
424878	F	16	01/01/2019

Au passage on peut constater que les dates qui ne devraient pas être affichées ne sont pas correctement formatées.

Le rendu avec Matricule, sexe, age, fonction :

Matricule	sexe	age	fonction
123456	M	24	Dev
123456	M	24	DSI
124561	F	46	Directrice
124561	F	46	Secrétaire
124878	F	56	Vaguemestre
424878	F	16	fonction
424878	F	16	fonction2

Merci !

christophebrault
Specialist
Specialist

Pardon, c'est de ma faute, il faut enlever Fonction du group by :

 

Resident Effectif
Group By Matricule,sexe,age;
Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin
mxcommunaute
Contributor II
Contributor II
Author

Le problème reste le même, dès que des entrées diffèrent, le regroupement par matricule ne se fait plus.

Par contre le formatage de la date qui ne doit pas s'afficher est bon maintenant ! 😉

Matricule	sexe	age	date_changement
123456	M	24	21/01/2019
123456	M	24	22/02/2019
124561	F	46	01/01/2001
124561	F	46	01/04/2018
124878	F	56	01/01/2019
424878	F	16	01/01/2017
424878	F	16	01/01/2019

Merci encore, ca ne doit pas tenir à grand chose je pense, même si personnellement je sèche un peu :).

mxcommunaute
Contributor II
Contributor II
Author

Bon... J'ai trouvé une solution, en trichant un peu, mais qui fonctionne étant donné que les dernières fonctions et date de changements sont les dernières inscrites dans le fichier.

Effectif: // chargement des données de base
Load *
Inline
[
Matricule, sexe, age, fonction, date_changement

123456,M,24,Dev,'21/01/2019'
123456,M,24,DSI, '22/02/2019'
124561,F,46,Secrétaire,'01/01/2001'
124561,F,46,Directrice,'01/04/2018'
424878,F,16,fonction2,'01/01/2017'
424878,F,16,fonction,'01/01/2019'
124878,F,56,Vaguemestre,'01/01/2019'
];
NoConcatenate
derniereFonction: load Matricule, sexe, age, lastvalue(fonction) as fonction, lastvalue(date_changement) as date_changement Resident Effectif group by Matricule, sexe, age;
drop table Effectif;

Ca fonctionne, mais c'est fragile, j'aurai préféré réussir à faire le tri proprement afin d'éviter tout risque d'erreur. Donc je reste preneur d'idées !

Merci encore pour le coup de main. 

MarcAndres
Partner - Contributor
Partner - Contributor

Bonjour,

je vois que la fragilité provient du fait que la table initiale doit être déjà triée par date, ce qui n'est pas forcément évident.

Pour cela, je te propose cela:

Temp: // chargement des données de base
Load *
Inline
[
Matricule, sexe, age, fonction, date_changement

123456,M,24,DSI, '22/02/2019'
123456,M,24,Dev,'21/01/2019'
124561,F,46,Secrétaire,'01/01/2001'
124561,F,46,Directrice,'01/04/2018'
424878,F,16,fonction2,'01/01/2017'
424878,F,16,fonction,'01/01/2019'
124878,F,56,Vaguemestre,'01/01/2019'
];

NoConcatenate
Temp2:
load Matricule, sexe, age,
fonction,
date_changement
Resident Temp
Order By date_changement;

drop table Temp;

NoConcatenate
Effectif:
load Matricule,
sexe, age,
lastvalue(fonction) as fonction,
lastvalue(date_changement) as date_changement

Resident Temp2
group by Matricule, sexe, age;

drop table Temp2;
christophebrault
Specialist
Specialist

Bonjour,

 

Pour rendre le script indépendant de l'âge, il faut l'enlever également du group by. En fait laisser simplement le matricule suffit :

 

right join (Effectif)
Load
Matricule,
max(Date#("date_changement", 'DD/MM/YYYY')) AS date_changement

Resident Effectif
Group By Matricule;

Inscrivez vous à ma Newletter Qlik
DoNotMissQlik- Connect with me on Linkedin