• Keine Ergebnisse gefunden

2.2.2.3. Définir plusieurs macro-variables, chacune correspondant à une ligne du résultat de la PROC SQL

CHAPITRE III : UTILISATION DES MACRO-

III. 2.2.2.3. Définir plusieurs macro-variables, chacune correspondant à une ligne du résultat de la PROC SQL

Cas d’une SQL sur une seule variable

Nous avons montré que par défaut l’instruction INTO sélectionne la première valeur de la liste des valeurs fournie par PROC SQL. Toutes les valeurs restantes sont donc abandonnées. Pour modifier ce comportement et créer une macro-variable pour chaque élément de la liste, on adopte la formulation suivante (prenant l’exemple du nom des employés) :

PROC SQL;

SELECT NOM

INTO :nomval1- :nomvalN FROM EMPLOYE ;

QUIT ;

%PUT &nomval1;

%PUT &nomvalN;

Dans cette formulation, les noms des employés sont individuellement stockées dans les macro-variables allant de nomval1 à nomvalN où N correspond au nombre d’observations de la table. Comme la table contenant 10 employés, on crée dix macro-variables telles que :

PROC SQL;

SELECT NOM

INTO :nomval1- :nomval10 FROM EMPLOYE ;

QUIT ;

%PUT &nomval1;

%PUT &nomval10;

Cette formulation indique qu’on connait à priori le nombre d’observation dans la table. En effet, comme on a 10 employés dans la table, on spécifie qu’on veut 10 macro-variables indexés de 1 à 10. A ce propos, il faut signaler que lorsque le nombre de macro-variables déclarée est supérieur au nombre d’observations obtenu dans PROC SQL, toutes les macro-variables indexées au-delà de ce nombre auront une valeur NULL c'est-à-dire vide. Par exemple, en spécifiant :

PROC SQL;

SELECT NOM

INTO :nomval1- :nomval13 FROM EMPLOYE ;

QUIT ;

Sachant que nous avons 10 employés dans la table EMPLOYE, alors les macro-variables nomval11 à nomval13 sont des macro-variables vides d’éléments (NULL).

En revanche, lorsque le nombre de macro-variables déclarée est inférieur au nombre d’observations obtenu dans PROC SQL, aucune macro-variable n’est créée pour les observations restantes. Par exemple, en spécifiant :

PROC SQL;

SELECT NOM

INTO :nomval1- :nomval6 FROM EMPLOYE ;

QUIT ;

Sachant que nous avons 10 employés dans la table EMPLOYE, alors aucune macro-variable ne sera créée pour les observations 7 à 10.

Compte tenu de cette propriété, on peut considérer la création de macro-variable dans cette comme une généralisation du premier cas étudié. En effet en spécifiant par exemple :

PROC SQL;

SELECT NOM

INTO :nomval1- :nomval1 FROM EMPLOYE ;

QUIT ;

On obtient le même résultat que lorsqu’on spécifie PROC SQL;

SELECT NOM INTO :nomval1 FROM EMPLOYE ; QUIT ;

Car dans les deux cas, seule la première ligne du résultat du SQL est stockée sous forme de macro-variable.

Remarque : cas où le nombre d’observation n’est pas connu à priori

Dans les exemples présentés ci-dessus, il est supposé qu’on connait à priori le nombre d’observations dans la table. Par exemple, puisque nous savons qu’il y a 10 employés dans la table, nous extrayons les noms de ces 10 employés pour les stocker dans les macro-variables nomval1 à nomval10. Toutefois, lorsque l’on ne connait pas à priori le nombre d’observation dans la table (plus spécifiquement le nombre d’observation sur la variable considérée), il faut alors chercher avant tout à déterminer ce nombre afin de le spécifier dans la requête. Mais grâce aux fonctionnalités du PROC SQL ce travail est extrêmement simplifié. En effet, pour chaque PROC SQL exécutée, SAS crée automatiquement une macro-variable nommée SQLOBS. Cette macro-variable stocke le nombre d’observations associé à la PROC SQL dernièrement exécutée. Pour l’afficher il suffit de faire %PUT &SQLOBS ; Cette fonction sera donc utile pour déterminer la valeur maximale de la liste des macro-variables à créer. Mais son utilisation n’est pas directe. Effet, la création des macro -variables à partir de la valeur de SQLOBS se fait en trois étapes décrites comme suit :

- Dans une première étape, on fait une proc SQL (sans la clause INTO) afin que SAS crée de lui-même la macro-variable automatique SQLOBS.

- Dans un second temps, nous une nouvelle macro-variable en lui assignant

" manuellement" la valeur de SQLOBS. Cette assignation se fait comme suit :

%LET i=&SQLOBS ;

- Et dans une troisième étape, on refait une PROC SQL avec la clause INTO en utilisant la valeur contenue dans i comme l’indice de la dernière macro variable à créer.

Ces trois étapes sont résumées dans l’exemple ci-dessous : /*Etape 1*/

PROC SQL;

SELECT NOM FROM EMPLOYE ; QUIT ;

/*Etape 2*/

%LET i=&SQLOBS ; /*Etape 3*/

PROC SQL;

SELECT NOM

INTO :nomval1- :nomval&i FROM EMPLOYE ;

QUIT ;

Cas d’une SQL sur plusieurs variables

Lorsque la requête porte sur plusieurs variables, pour créer une macro-variable pour chaque élément de chaque colonne, on indique la liste des macro-variables à créer pour chaque en les séparant de celles des autres colonnes par des virgules. Dans les exemples ci-dessous, nous distinguons les cas selon que le nombre d’observations de la requête est connue ou pas.

En effet supposons qu’on veuille récupérer les noms et les âges des employés et stocker chaque valeur obtenue dans une macro-variable. Dès lors, si le nombre d’employés est à priori connu (ex : 10), on adopte la formulation suivante :

PROC SQL;

SELECT NOM, AGE

INTO :nomval1-nomval10, :ageval1- :ag_val10 FROM EMPLOYE ;

QUIT ;

En revanche, lorsque le nombre d’observations n’est pas connu à priori, on suit les

PROC SQL;

SELECT NOM, AGE FROM EMPLOYE ; QUIT ;

/*Etape 2*/

%LET i=&SQLOBS ; /*Etape 3*/

PROC SQL;

SELECT NOM, AGE

INTO :nomval1- :nomval&i , :ageval1- :ageval&i FROM EMPLOYE ;

QUIT ;

Notons que dans toutes méthodes de création automatique de macro-variables discutées ci-dessus, lorsque le nombre de variables à traiter devient plus élevé, il faut préférer construire un macro-programme en élaborant une boucle %DO LOOP qui traite individuellement chaque variable et stocker les macro-variables sous des noms indexés avec les nom des variables initiales (nous verrons la construction de macro programme plus loin).

III.2.2.3. Les macro-variables prédéfinies dans le système SAS

Il existe plusieurs macro-variables prédéfinies dans le système SAS. Par exemple la macro-variable SYSDATE indique la date du jour paramétré sur le système. Tandis que la macro-variable SYSDAY indique le jour actuel en se basant sur la date indiquée par le système. Les deux exemples ci-dessous affichent dans le fichier log la date et jour actuels.

%PUT &SYSDATE;

%PUT &SYSDAY;

Pour afficher toutes les autres macro-variables automatiques du système SAS, on fait :

%PUT _AUTOMATIC_;

Ces macro-variables automatiques fournissent de nombreuses informations qui s’avérer utiles dans e nombreux contexte (consulter le fichier log).

Par ailleurs, on peut afficher les noms de toutes les macro-variables disponibles dans une session en faisant :

%PUT _ALL_;

Mais il y a aussi :

%PUT _GLOBAL_ ; /* Affiche toutes les macro-variables de type global*/

%PUT _LOCAL_ ; /* Affiche toutes les macro-variables de type local*/

%PUT _USER_ ; /* Affiche toutes les macro-variables définies par l’utilisateur*/

III.2.2.4. Stocker le nombre d’observation s dans une macro-variable

On peut distinguer plusieurs méthodes d’extraction du nombre d’observation pour le stocker sous forme de macro-variables. Ici, nous passons en revue quelques une d’entre elles.