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 :

Boucle dans une proc sql avec nombre de variables indéterminé


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut Boucle dans une proc sql avec nombre de variables indéterminé
    Bonjour,

    j'ai fait le tour de quelques discussions sur l'utilisation des boucles, et j'ai réussi à écrire un bout de programme à l'aide des solutions trouvées.
    Le code que j'ai écrit fonctionne dans certains cas et j'essaie de l'automatiser.
    Par exemple, ici mon code fonctionne, seulement quand j'ai dans ma base de données les 4 variables p1-p2-p3-p4. Cependant dans mes bases de données je peux avoir une à plusieurs variables dépassant le nombre de 20.
    Mes variables initatiales s'appellent used_GSP, used_AGOA, ..., elig_GSP, elig_AGOA,...

    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
    %macro res;
    %let p1=GSP;
    %let p2=AGOA;
    %let p3=LDC;
    %let p4=AGOAtex;
     
     
    %do i=1 %to 4;
    PROC SQL;
    CREATE TABLE TX_Util_cat AS
    SELECT *,(sum(used_&&p&i.))/(sum(import_value))*100 AS taux_util_&&p&i.,
    (sum(used_&&p1.-used_&&p4.))/(sum(import_value))*100 AS taux_util_pref
    FROM pref_utilization3
    WHERE elig_&&p&i.=1
    GROUP BY cat;
    QUIT; 
     
    PROC SQL;
    CREATE TABLE TX_Util_all AS
    SELECT * , (sum(used_&&p&i.))/(sum(import_value))*100 AS taux_util_&&p&i.
    FROM pref_utilization3
    WHERE elig_&&p&i.=1;
    QUIT; 
     
    %end;
    %mend;
    Option mprint; %res;
    J'ai essayé de remplacer le %do i=1 %to 4; par %do i=1 %to dim(i); mais ça ne fonctionne pas.

    Mon deuxième problème est au niveau de la somme suivante puisque si la variable du début ne bouge pas, la variable finale, elle, n'est pas toujours la même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sum(used_&&p1.-used_&&p4.))
    Par exemple sur une base de données où je n'ai qu'une variable (used_GSP), il me crée forcement une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR: The following columns were not found in the contributing tables: elig_AGOA, used_AGOA, used_LDC.
    ps : le code est un peu long car je répète deux opérations : une qui distingue les catégories, une autre sans distinction de catégorie.

    Quelqu'un aurait une idée? suis-je dans la bonne direction, ou faut-il utiliser un array plutôt?
    Merci d'avance pour vos solutions!

  2. #2
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Finalement j'ai réécri le code avec un petit changement à la place du %to 4, j'ai écrit %to &howmany. Ensuite je n'ai qu'à changer le chiffre à la fin du code.

    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
    %macro create(howmany);
    %let p1=GSP;
    %let p2=AGOA;
    %let p3=LDC;
    %let p4=AGOAtex;
     
     
    %do i=1 %to &howmany;
    PROC SQL;
    CREATE TABLE TX_Util_cat AS
    SELECT *,(sum(used_&&p&i.))/(sum(import_value))*100 AS taux_util_&&p&i.,
    (sum(used_&&p1.-used_&&p&howmany.))/(sum(import_value))*100 AS taux_util_pref
    FROM pref_utilization3
    WHERE elig_&&p&i.=1
    GROUP BY cat;
    QUIT; 
     
    PROC SQL;
    CREATE TABLE TX_Util_all AS
    SELECT * , (sum(used_&&p&i.))/(sum(import_value))*100 AS taux_util_&&p&i.
    FROM pref_utilization3
    WHERE elig_&&p&i.=1;
    QUIT; 
     
    %end;
    %mend;
    Option mprint; %create(4);
    Si vous avez d'autres idées...

  3. #3
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    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 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Hello,
    Je te propose une solution d'automatisation avec la proc contents:

    1- tu récupères les variables de ta table via une proc contents
    2- tu fais un call symput pour récupérer ces variables dans une macro variable + compteur
    3 - tu intègres les macros dans le programme que t'as écrit plus haut.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Ok un grand merci!

    Du coup, je mets le code que j'ai tapé avant d'écrire le reste du programme ci-dessus :

    * proc contents pour récupérer les variables de la table : Créer le data set LST_VAR servant de fichier de référence;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    proc contents DATA= table_eligibility2 out= lst_var (keep =NAME WHERE=(upcase(NAME) =: 'ELIG_') ) noprint ; 
    run;
    DATA list_var (drop= name);
    SET lst_var;
    pref=substr(NAME,6,length(NAME));
    If pref="MFN_zero" then delete;
    If pref="MFN_dutiable" then delete;
    run;
    * call symput pour récupérer ces variables dans une macro variable + compteur;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    data _null_;
       set list_var;
       cnt+1;
       call symput (cats("p",put(cnt,best.)),pref);
    run;
    * Créer la macro variable VAR_MAX en se basant sur le data set LST_VAR créé précédemment;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data _null_ ;
       call symputx("max_var",_N_-1);
       set list_var;
    run;
    Et le début qui a été modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %macro utilisation;
     
    %do i=1 %to &max_var.;

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

Discussions similaires

  1. Definir un format décimal dans une proc SQL
    Par pierre24 dans le forum SAS Base
    Réponses: 1
    Dernier message: 07/08/2008, 09h36
  2. Besoin de retrouner des 0 aussi dans une requête SQL avec JOIN
    Par Jean-Marc68 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 05/11/2007, 14h45
  3. compter enregistrement dans une requete sql avec UNION
    Par dbzzzde dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/10/2007, 10h43
  4. [Access] Problème dans une requête SQL avec INNER JOIN ?
    Par bds2006 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/06/2006, 10h57
  5. Problème dans une requête SQL avec AS et ON ?
    Par bds2006 dans le forum Bases de données
    Réponses: 9
    Dernier message: 26/06/2006, 15h25

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