IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Jointure en Etapa Data


Sujet :

SAS Base

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Par défaut Jointure en Etapa Data
    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 :

    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;
    Ce qui me donne en résultats :

    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 !

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Bonjour.
    Il me semblerait moins compliqué de recréer des rangs avec la même logique dans les 2 tables : 1 pour la 1e obs de chaque élève, puis 2, 3, etc. Avec des tris préalables, et une étape DATA avec SET BY, FIRST et RETAIN.
    Ensuite il n'y a plus qu'à faire un MERGE tout simple.

  3. #3
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    En fait ce qui manque principalement dans le code que tu proposes, c'est la notion de rang.
    Tu as reprogrammé avec ton double SET + boucle l'équivalent d'un MERGE ou d'une jointure SQL, mais tu n'as pas introduit l'ordre des notes et la gestion des enregistrements multiples dans la table NOTE. Il est donc normal que tu obtiennes ce résultat.
    D'où ma réaction précédente : crée d'abord des rangs cohérents dans les 2 tables et tu pourras fusionner tes tables par du code plus classique.

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Par défaut
    Bonjour,

    Merci ça me semble en effet adapté.
    Merci beaucoup, bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jointures et System.Data.SQLite
    Par ed73170 dans le forum SQLite
    Réponses: 3
    Dernier message: 25/09/2014, 20h33
  2. Faire la jointure de 2 data.frame
    Par L.A.. dans le forum R
    Réponses: 4
    Dernier message: 22/09/2014, 16h14
  3. [DATA] Optimisation d'une jointure : performance DATA vs PROC SQL
    Par foxrol dans le forum SAS Base
    Réponses: 3
    Dernier message: 08/02/2012, 12h15
  4. [2.3.2] Jointure complexe entre deux data set
    Par Nicolas281088 dans le forum BIRT
    Réponses: 2
    Dernier message: 11/05/2009, 16h47
  5. [forms] Data Block Lov Plusieurs tables jointure
    Par loupin dans le forum Forms
    Réponses: 5
    Dernier message: 13/09/2006, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo