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 :

[SQL] Stockage d'une colonne dans une macro variable en différenciant les groupes


Sujet :

Macro

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut [SQL] Stockage d'une colonne dans une macro variable en différenciant les groupes
    Bonsoir à tous,

    Je souhaite stocker une colonne dans une macro variable. Pour cela je me sers de INTO:. Exemple avec la sashelp.class :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    proc sql noprint;
    select name into:prenoms separated by ", "
    from sashelp.class
    where age > 14;
    quit;
     
    %put &prenoms.;
    Jusque là tout va bien. Sauf qu'en fait, je veux créer non pas une macro variable mais autant que j'ai de groupe. C'est là que ça coince :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    proc sql noprint;
    select sex, name into:prenomsb separated by ", "
    from sashelp.class
    where age > 14
    group by sex;
     
    quit;
     
    %put &prenomsb.;
    Je ne peux pas créer une table par groupe car en fait il s'agit d'individus (nombre assez élevé). J'ai pris la sashelp.class pour exemple.

    En fait je veux créer autant de macro-variable qu'il y a de groupe (un peu comme un SUM() par groupes).

    Quelqu'un a-t-il une idée pour m'aider ?

    Merci beaucoup,

    alers

  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
    27
    28
    29
    30
    31
    32
     
    data test(where=(age>14));
    set sashelp.class;
    run;
     
    proc sort data=test out= test1; by sex; run;
     
    data test2 ;
    set test1;
    by sex;
    if first.sex  then output;
    run;
     
    data _null_;
    set test2;
    call symput('val'||left(_n_),sex);
    call symput ('nbr',_n_);
    run;
     
    %macro test();
    data _null_;
    %do i=1 %to &nbr;
    %global res&i;
    proc sql;
    select name into: res&i separated  by "," from test
    where sex=%sysfunc(trim("&&val&i"))
    ;
    quit;
     
    %end;
    %mend;
    %test();
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select distinct ta_variable info :  mv_col separated by ',´ ....
    Néanmoins attention à la longueur de la macro variable ...
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour et merci beaucoup,

    Ça fonctionne à la perfection.

    En revanche, j'ai un problème car je voudrais envoyer toutes ces macros variables dans ma table, mais je n'y arrive pas.

    En reprenant ton exemple :

    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
    option mprint mlogic symbolgen;
    %macro noms();
    data test22;
    set test2;
    %do i = 1 %to 2;
    	%if num = &i. %then %do;
    		noms = "&&res&i";
    	%end;
    %end;
    run;
    %mend;
    %noms();
     
    %put &res1;
    %put &res2;
    Ça bloque au niveau du num = &i., SAS me dit toujours que cette condition est fausse. Il ne reconnait pas le nombre mais juste &i. à chaque fois.

    Où fais-je erreur ?

    Merci encore,

    alers

  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,

    Avec Symget

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DATA tables (drop=i) ;
    do i=1 to &nbr ;
    val=symget(cats('res', i));	
    output ;
    end ;	  
    run ;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse et ton aide précieuse !

    J'ai même réussis à mettre le groupe à côté, juste en rajoutant une ligne pour le sexe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DATA TABLES (DROP=i) ;
    do i=1 TO &nbr ;
    val=symget(cats('res', i));
    sex=symget(cats('val', i));		
    output ;
    end ;	  
    run ;
    Je ne connaissais pas cette fonction symget. Si je comprends bien le site de SAS, elle permet de retourner la valeur d'une macro variable à chaque ligne ? C'est à dire ligne _N_=1 il va chercher i=1, puis i=2 pour la seconde ligne ?
    Output sert à sortir chaque ligne ? Car si je le retire, je n'ai que la dernière exécution.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Il y a quand meme un pb de conception...

    tu as une table
    tu en fais des macro-variables
    que tu remets dans une autre table?

    tu as donc réinventé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data toto;
    set titi;
    run;
    ?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. SQL-Server changer le nom d'une colonne dans une table .
    Par silset dans le forum Développement
    Réponses: 2
    Dernier message: 31/10/2009, 23h34
  3. Réponses: 4
    Dernier message: 05/05/2008, 15h16
  4. Récupérer le nom d'une colonne d'une table dans une variable
    Par mimi51340 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/03/2008, 14h23
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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