Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
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 28/11/2011, 15h54   #1
Invité régulier
 
Femme
Responsable marketing opérationnel
Inscription : avril 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Responsable marketing opérationnel
Secteur : Biens de consommation

Informations forums :
Inscription : avril 2011
Messages : 16
Points : 8
Points : 8
Par défaut boucle dans SQL

Bonjour,

je dois calculer deux variables par numéro d'observation et semaine comme suit:

Code :
1
2
3
4
5
6
7
proc sql;
  CREATE tablere AS
  SELECT
 (sum(a1)>0) AS vara_1 		
,(sum(a1)) AS varb_1	,numero, semaine	
FROM lib.my_table GROUP BY numero, semaine;
quit;
Mon souci: je n'ai pas UNE variable a1 mais 100 variables (de a1 à a100)... Je ne vais pas faire 100 Proc Sql!!!!
Est-il possible de créer une macro en mettant une boucle DANS ma Proc Sql pour obtenir dans ma table res (donc une table de résultat unique) mes 100 variables vara_1 à vara_100 ET mes 100 variables varb_1 à varb_100? Je n'ai pas réussi pour le moment à écrire cette macro...

Merci de votre aide.

Olive.
Olive2011 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h39   #2
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Une solution possible:

Code :
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 t;
input a1 a2 a3 numero semaine;
cards;
 
 1   2  3 10 6
 1   2  3 10 6
-1  -2 -3 13 6
-1  -2 -3 15 8
 
;
run;
 
%macro res;
 
%do i=1 %TO 3;
proc sql;
CREATE TABLE res_&i AS
SELECT numero, semaine ,
(sum(a&i)>0) AS vara_&i ,
(sum(a&i)) AS varb_&i
FROM t GROUP BY numero, semaine;
quit;
%end;
DATA res;
merge res_1-res_3;
BY numero semaine;
run;
 
%mend;
options mprint;
%res;
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h54   #3
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
plus court
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%macro res;
 
%let nb=100;
proc sql;
CREATE TABLE res AS
SELECT numero, semaine ,
%do i=1 %TO &nb-1;
	(sum(a&i)>0) AS vara_&i ,
	(sum(a&i)) AS varb_&i,
%end;
	(sum(a&nb)>0) AS vara_nb,
	(sum(a&nb)) AS varb_nb
 
FROM t GROUP BY numero, semaine;
quit;
%mend;
OPTION mprint;
%res;
__________________
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 28/11/2011, 16h56   #4
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
moi je m'amusais:
Code :
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
 
 
 DATA test (keep=age1-age4 sex);
SET sashelp.class;
IF _n_<3 then age=.;
age1=age *2;
age2=age *3;
age3=age *4;
age4=age *5;
 
run;
 
 
 
%macro _sql;
proc sql;
CREATE TABLE _test AS SELECT
 
%do i=1 %TO 4;
sum (age&i)>0  AS vara_&i,
sum(age&i) AS varb_&i,%end; 
sex FROM test GROUP BY sex;
quit;
 
%mend;
 
%_sql;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h08   #5
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Citation:
Envoyé par s_a_m Voir le message
moi je m'amusais:
Code :
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
 
 
 DATA test (keep=age1-age4 sex);
SET sashelp.class;
IF _n_<3 then age=.;
age1=age *2;
age2=age *3;
age3=age *4;
age4=age *5;
 
run;
 
 
 
%macro _sql;
proc sql;
CREATE TABLE _test AS SELECT
 
%do i=1 %TO 4;
sum (age&i)>0  AS vara_&i,
sum(age&i) AS varb_&i,%end; 
sex FROM test GROUP BY sex;
quit;
 
%mend;
 
%_sql;
Que vaut la vie sans le jeux????
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h50   #6
Invité régulier
 
Femme
Responsable marketing opérationnel
Inscription : avril 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Responsable marketing opérationnel
Secteur : Biens de consommation

Informations forums :
Inscription : avril 2011
Messages : 16
Points : 8
Points : 8
YES! ça marche! Mille mercis!!! et bonne soirée à tous!
Olive2011 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 00h09.


 
 
 
 
Partenaires

Hébergement Web