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 :

Croiser la valeur d'un champ avec le nom d'un champ d'une autre table SAS


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Croiser la valeur d'un champ avec le nom d'un champ d'une autre table SAS
    Bonjour à tous,

    Je vous fais part de cette demande car je n'arrive pas à trouver le raisonnement à avoir pour ce cas de figure.

    En effet, voici ma problématique (travail effectué sous Sas Entreprise Guide 7.1) :

    J'obtient via plusieurs requêtes l'équivalent de la table suivante :

    Table_A :

    CC1 CC2 CC3
    OK KO OK

    En parallèle, j'ai une table référentiel pour les messages d'erreurs en cas de KO :

    Table_B :

    CONTROLE MESSAGE
    CC1 Le contrôle 1 n'est pas valide
    CC2 Le contrôle 2 n'est pas valide
    CC3 Le contrôle 3 n'est pas valide

    Ce que je souhaite obtenir, c'est une table listant les contrôles de la table A mais en remplaçant les KO par le message d'erreur correspondant (Sachant que le vrai nombre de champs de contrôles est conséquent) :

    Table_C :

    CC1 CC2 CC3
    OK Le contrôle 2 n'est pas valide OK

    J'ai beau chercher, je ne trouve pas, sauf erreur de ma part, de solution équivalente à mon problème

    En espérant que mon explication soit suffisamment claire.

    En vous remerciant d'avance pour le temps passé à mon problème.

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:
    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
    data test;
    input var1 $ var2 $ var3 $;
    cards;
    CC1 CC2 CC3
    KO OK OK
    OK KO OK
    OK OK KO
    ; run;
     
     
     
    data test1(drop=i);
    length var1 var2 var3 $35;
    set test;
     
    array forma(*) var:;
    do i =1 to dim(forma);
    if forma(i)='KO' then do;
    if i=1 then forma(1)="Le contrôle 1 n'est pas valide";
     
    if i=2 then forma(2)="Le contrôle 2 n'est pas valide"; 
     
    if i=3 then forma(3)="Le contrôle 3 n'est pas valide"; 
    end ;
    end;
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour m.brahim,

    Merci d'avoir pris le temps d'étudier mon problème.

    J'ai testé ton code et il correspond exactement à mon besoin.

    Je vais prendre le temps de l'appliquer à mon extraction et je placerais la discussion en résolue si j'arrive à la finalité sans encombre

    Encore un grand merci pour ta réactivité

    Cordialement

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Re Bonjour m.brahim,

    Je me permets de revenir vers toi concernant ta solution.

    En effet, celle-ci permet de faire une sorte de transcodification directement dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if forma(i)='KO' then 
    		do;
    			if i=1 then forma(1)="Le contrôle 1 n'est pas valide";
     
    			if i=2 then forma(2)="Le contrôle 2 n'est pas valide"; 
     
    			if i=3 then forma(3)="Le contrôle 3 n'est pas valide"; 
    		end ;
    Cependant, la source de cette transcodification est dans une autre table.

    Du coup, ce que j'essaye de faire c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if forma(i)='KO' then 
    		do;
    			nom_de_colonne(i) forma(i)=Valeur du champs MESSAGE de la table 2 où Valeur du champs CONTROLE de la table 2 est égal à nom_de_colonne(i);
    		end ;
    Aurais-tu une idée sur la syntaxe à opérer ? Je vois désormais comment utiliser l'indexation du champ mais pas son nom et j'avoue ramer encore plus sur la façon d'utiliser le nom d'un champ d'une autre table

    En te remerciant d'avance.

    Cordialement

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,
    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
    38
    39
    40
    41
    42
    data test;
    input var1 $ var2 $ var3 $;
    cards;
    CC1 CC2 CC3
    KO OK OK
    OK KO OK
    OK OK KO
    ; run;
     
    data test1;
    input var $ control $ 5 - 50; 
    cards;
    CC1 Le contrôle 1 n'est pas valide
    CC2 Le contrôle 2 n'est pas valide 
    CC3 Le contrôle 3 n'est pas valide
    ;run; 
     
    proc transpose data =test1 out=test11(drop= _name_ ); var control  ; id var; run; 
     
    data test2;
    set test
     test11;
    run;
     
    data test3(drop=CC: i);
    length var1 var2 var3 $35;
      set test2 (drop=CC1 CC2 CC3);
      if eod2=0 then set test2 (keep=CC1 CC2 CC3 where=(not missing(CC1))) end=eod2;
      array forma(*) var:;
      array CC(*) CC:;
      do i =1 to dim(forma);
      if forma(i)='KO' then do;
    forma(i)=CC(i);
    end;
    end;
    run;
     
    options missing = ' ';
    data test3;
    set test3;
    if ^missing(cats(of _all_));
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    m.brahim

    Bravo pour ce code qui pour le coup répond parfaitement à mon besoin !

    Un Grand Merci car vu la complexité du code, je pense que j'aurais ramé encore LONGTEMPS

    Bonne journée à toi

    Besoin résolu.

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

Discussions similaires

  1. [AC-2010] Choisir des champs d'un formulaire et les copier dans une autre table
    Par CmzxNene dans le forum VBA Access
    Réponses: 6
    Dernier message: 07/08/2016, 13h32
  2. Réponses: 5
    Dernier message: 17/08/2014, 18h19
  3. Réponses: 13
    Dernier message: 20/10/2009, 19h05
  4. Réponses: 11
    Dernier message: 28/04/2009, 15h58
  5. Update d'un champs avec valeur d'une autre table.
    Par dbuweb dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/06/2006, 11h36

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