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

Macro Discussion :

creation d'une table à partir des valeurs de 2 tables


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut creation d'une table à partir des valeurs de 2 tables
    Bonjour,

    A partir de 2 tables source je souhaiterais créer une table résultat qui aurait la forme suivante :

    Source1
    col1 Col2 Col3
    Var11 Var21 Var31
    Var12 Var22 Var32
    Var13 Var23 Var33
    Var14 Var24 Var34

    Source2
    Col1 Col2 Col3
    val11 val21 val31
    val12 val22 val32
    val13 val23 val33
    val14 val24 val34

    Resultat
    Colonne1 colonne2
    var11 val11
    var12 val12
    var13 val13
    var14 val14
    var21 val21
    Var22 val22
    var23 val23
    var24 val24
    var31 val31
    var32 val32
    var33 val33
    var34 val34

    Je souhaiterais créer la table resultat par macro car dans les tables sources j'ai un nombre important de colonnes. J'ai testé en faisant des proc transpose mais je n'arrive pas au résultat attendu. Pourriez-vous m'aider ?

    Merci par avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Ton exemple de données, en table SAS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    data source1 ;
        input col1 $ col2 $ col3 $ ;
        cards ;
    Var11 Var21 Var31
    Var12 Var22 Var32
    Var13 Var23 Var33
    Var14 Var24 Var34
    ;
    run ;
     
    data source2 ;
        input col1 $ col2 $ col3 $ ;    
        cards ;
    val11 val21 val31
    val12 val22 val32
    val13 val23 val33
    val14 val24 val34
    ;
    run ;
    Une solution, par approche "étape data" + macro + sql pour macros variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    /* 1. Macro pour mettre une table "en colonne" */;
    %MACRO METTRE_EN_COLONNE (TABLE) ;
        /* 1.1.  Compter le nombre de colonnes et liste des noms de colonnes  */
        proc contents data = &TABLE
                      out  = &TABLE._contents 
                      noprint ;
        run ;
        proc sql noprint ;
            select distinct NAME
            into : LIST_NAME
            separated by ' '
            from &TABLE._contents ;
            select count(distinct NAME)
            into : NB_COLONNES
            from &TABLE._contents ;
        quit ;
        /* 1.2. Boucle dans étape data pour mise en colonne */
        data &TABLE._EN_COLONNE ;
            set %do LOOP = 1 %to &NB_COLONNES. ;
                &TABLE. (keep = %scan(&LIST_NAME., &LOOP.)
                         rename = (%scan(&LIST_NAME., &LOOP.)=COLONNE_&TABLE.)) 
                %end ; ;
        run ;
    %MEND METTRE_EN_COLONNE ;
     
    /* 1.3. Appel de la macros sur les deux tables en entrée */
    %METTRE_EN_COLONNE (SOURCE1) ;
    %METTRE_EN_COLONNE (SOURCE2) ;
     
    /* 2. Fusion des 2 tables */
    option mergenoby = NOWARN ; 
    data WORK.RESULTAT ;
        merge   SOURCE1_EN_COLONNE
                SOURCE2_EN_COLONNE ;
    run ;
    option mergenoby = ERROR ;
    A noter:
    1- c'est une fusion "sans by" -> l faut les utiliser avec parcimonie!
    Par défaut il vaut mieux avoir toujours l'option mergenoby = ERROR, pour éviter les accidents (oubli du by accidentel) et désactiver cette option uniquement de façon ponctuelle.
    2- nécessite que, de façon certaine, les deux tables en entrée aient bien la même structure (nombre de lignes, nombre de colonnes). Si besoin, rajouter des "contrôles de cohérence" avant fusion.
    3- nécessite que toutes les variables de source1 aient le même format. Idem pour source2. Idem que précédent, possibilité de rajouter si besoin des "contrôles de cohérence"

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Cela fonctionne bien si on a moins de 10 colonnes car comme j'en ai 25 le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT NAME
            INTO : LIST_NAME
            separated BY ' '
            FROM &TABLE._contents ;
    reclasse mes colonnes => Var1 Var10 Var11 Var12 ... Var2 Var20 var21 .... de ma table source1. Les colonnes de ma table source 2 sont déjà ordonnées du coup les deux colonnes jointes ne correspondent pas....

    Y a t-il un moyen pour que &LIST_NAME ne soit pas ordonnée ?

    Merci par avance.

Discussions similaires

  1. [Toutes versions] Récupérer une date à partir des valeurs de 3 ComboBox
    Par ch0ubida dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 03/12/2014, 11h48
  2. Réponses: 7
    Dernier message: 18/05/2011, 12h09
  3. Réponses: 6
    Dernier message: 09/08/2010, 19h52
  4. Réponses: 5
    Dernier message: 21/05/2006, 13h23
  5. Réponses: 1
    Dernier message: 23/01/2006, 18h53

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