Bonjour,
Je cherche à réaliser une jointure un peu complexe en Etape Data.
J’ai une table source qui contient des informations sur des étudiants s’étant présenté dans une école à une date donnée pour un concours.
Table source :
Ecole Elève Date Rang EtatCivil Note1 Note2 Champolion 1 01/07/2014 1 F . . Champolion 2 01/07/2014 14 F . . LeVernet 13 02/08/2014 7 H . . LeVernet 13 02/08/2014 8 H . . LeVernet 14 05/09/2014 10 H . . Poissard 25 01/07/2014 9 F . . Poissard 25 01/07/2014 20 F . .
Un élève peut passer deux concours le même jour dans la même école, il apparaitra donc deux fois dans la table mais avec deux rangs distincts, car il n’y a pas deux rangs différents le même jour dans la même école. (Cas des élèves 13 et 25).
Plusieurs jours après, une autre table est alimentée avec les résultats des examens :
Table Note :
Ecolei Elèvei Datei Note1i Note2i CHAMPOLION 1 01/07/2014 20 19 CHAMPOLION 2 01/07/2014 14 15 CHAMPOLION 2 01/07/2014 13 14 LEVERNET 13 02/08/2014 20 13 LEVERNET 13 02/08/2014 07 12 LEVERNET 14 05/09/2014 08 0 POISSARD 25 01/07/2014 09 09
Il est possible que tout les résultats ne soit pas disponible lorsque la table est alimentée, et qu’à l’inverse l’on ai des résultats dans la table d’élèves non renseignés.
Il n’y a absolument pas la notion de « rang » sur cette table, seulement un ordre de remplissage.
L’idée est de joindre la table Note avec la table Source grâce à l’école, l’élève et la date. Si il y a plusieurs enregistrements pour un élève dans la même école le même jour, le premier enregistrement correspondant dans la table Note correspond à celui ayant le plus petit rang dans la table source et ainsi de suite.
L’attendu pour cet exemple est donc :
Ecole Elève Date Rang EtatCivil Note1 Note2 Champolion 1 01/07/2014 1 F 20 19 Champolion 2 01/07/2014 14 F 14 15 LeVernet 13 02/08/2014 7 H 20 13 LeVernet 13 02/08/2014 8 H 07 12 LeVernet 14 05/09/2014 10 H 08 0 Poissard 25 01/07/2014 9 F 09 09 Poissard 25 01/07/2014 20 F . .
-> Le second enregistrement pour l’élève 2 dans la table note n’est pas pris en compte, c’est le premier qui est remonté dans la table source
-> Les deux enregistrements pour l’élève 13 correspondent bien à celles de la table Note, dans l’ordre
-> Le second enregistrement pour l’élève 25 dans la table source ne remonte pas de résultat car aucun second enregistrement n’est trouvé dans la table Note
-> Les autres jointures ne sont pas atypiques
Pour l’instant mon code est le suivant :
Ce qui me donne en résultats :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 DATA work.source (keep= Ecole Elève Date Rang EtatCivil Note1 Note2 ); SET source ; j=0 ; do k=1 TO nbs; j+1 ; SET work.note nobs=nbs point=k ; if upcase(Ecole) = upcase(Ecole i) and Date = Datei and Elève=Elèvei then do; Note1 = Note1i; Note2 = Note2i; end; end; run;
Ecole Elève Date Rang EtatCivil Note1 Note2 Champolion 1 01/07/2014 1 F 20 19 Champolion 2 01/07/2014 14 F 13 14 LeVernet 13 02/08/2014 7 H 07 12 LeVernet 13 02/08/2014 8 H 07 12 LeVernet 14 05/09/2014 10 H 08 0 Poissard 25 01/07/2014 9 F 09 09 Poissard 25 01/07/2014 20 F 09 09
Les erreurs que je cherche à corriger sont donc :
-> Le second enregistrement de la table Note pour l’élève 2 remontes au lieu du premier
-> Les deux passages de l’élève 13 dans la table sources sont alimentés avec les seconds résultats de cette élève dans la table Note
-> Une jointure se fait sur le second passage de l’élève 25 alors que les Notes n’existent pas.
Voilà ce que je cherche à faire… Je vous remercie de votre aide par avance ! Bonne journée !![]()
Partager