Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/11/2010, 11h05   #1
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2009
Messages : 81
Points : 19
Points : 19
Par défaut Macro variable dans PROC SQL : fusion de SELECT

Bonjour,

j'essai d'utiliser une macro variable au sein d'une proc SQL mais j'ai toujours une erreur.

1/ je déclare mes variables :

Code :
1
2
3
4
5
6
7
/*création de macro variable, */
DATA _null_;
SET liste;
call symput('num'||LEFT(trim(_n_)),num);
call symput('tok'||LEFT(trim(_n_)),tok);
call symput('nb_num',_n_);
run;
j'utilise ensuite une macro pour créer une vingtaine de tables faisant référence à des tables mensuelles

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%macro test4;
%do i=25 %TO &nb_num.;
PROC SQL;
CREATE TABLE work.PER&&num&i AS SELECT TABL.compte,
TABL.opcint,
TABL2.mois,
TABL2.poste_analy,
TABL2.montant * -1
FROM TOTAL AS TABL
LEFT JOIN QUALIAC.QUALIAC_MENSCLI_20&&tok&i AS TABL2 ON (TABL.compte = TABL2.cpt)
WHERE TABL2.poste_analy IN ('67500030A');
QUIT;
%end;
%mend;
%test4;
tout ceci fonctionne très bien.

mais je veux terminer en fusionnant toutes ces tables en une.
pour éviter d'écrire un code du genre
Code :
1
2
3
4
5
6
7
PROC SQL;
CREATE TABLE TOTAL_PER AS 
SELECT * FROM PER25 UNION 
SELECT * FROM PER26 UNION
SELECT * FROM PER27 UNION 
.......;
QUIT;
j'ai tenté :
Code :
1
2
3
4
5
6
7
8
9
10
%macro fusion;
proc sql; 
CREATE TABLE PER_TOTAL AS
SELECT * FROM PER25  
%do i=26 %TO &nb_num.;
UNION SELECT * FROM PER&&num&i;
%end;
quit;
%mend fusion;
%fusion;
mais j'obtiens ce message d'erreur :

Code :
1
2
3
4
5
NOTE: Line generated BY the invoked macro "FUSION".
45          UNION SELECT * FROM PER&&num&i;
            _____
            180
ERROR 180-322: Statement IS NOT valid OR it IS used out of proper ORDER.
pouvez-vous m'aider?
docteurdorian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 11h59   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 133
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 133
Points : 1 744
Points : 1 744
essaye union all au lieu de union
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 12h06   #3
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2009
Messages : 81
Points : 19
Points : 19
Ca ne marche pas non plus avec UNION ALL.

meme message d'erreur
Code :
1
2
3
4
5
NOTE: Line generated BY the invoked macro "FUSION".
45          UNION ALL SELECT * FROM PER&&num&i;
            _____
            180
ERROR 180-322: Statement IS NOT valid OR it IS used out of proper ORDER.
docteurdorian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 12h15   #4
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 133
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 133
Points : 1 744
Points : 1 744
vaoila comment fonctionne le union all. Essaye sur du code statique avant de passser sur du dynamique.

Code :
1
2
3
4
5
6
7
8
9
10
11
Proc SQL;
CREATE TABLE Cost AS
SELECT *
FROM
ThisYearsCost(obs=max)
Union ALL
SELECT *
FROM
LastYearsCost(obs=max)
;
Quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 12h57   #5
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
par de point virgule avant UNION ALL


Citation:
Envoyé par docteurdorian Voir le message
Ca ne marche pas non plus avec UNION ALL.

meme message d'erreur
Code :
1
2
3
4
5
NOTE: Line generated BY the invoked macro "FUSION".
45          UNION ALL SELECT * FROM PER&&num&i;
            _____
            180
ERROR 180-322: Statement IS NOT valid OR it IS used out of proper ORDER.
  Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 13h55   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
bonjour,

c'est un problème de syntaxe supprime le ";" suis se trouve à la fin de la ligne UNION SELECT * FROM PER&&num&i; et mets le après le %end;;
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 14h48   #7
Futur Membre du Club
 
Inscription : avril 2009
Messages : 81
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2009
Messages : 81
Points : 19
Points : 19
merci beaucoup à tous.

merci Bahraoui, en effet c'était juste un problème de placement du point-virgule.
docteurdorian est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h53.


 
 
 
 
Partenaires

Hébergement Web