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 14/06/2011, 09h57   #1
Invité régulier
 
Inscription : avril 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 60
Points : 8
Points : 8
Par défaut Ajout d'un compteur

Bonjour amis saseurs!

J'ai des petits soucis de compteurs... Je vous explique mon problème :

Dans ma table, il y a deux variables : le numéro et l'année.
Je souhaiterais que pour chaque numero, lorsqu'il y a des années consécutives, le compteur soit le même. Par contre lorsqu'elles ne le sont pas, on ajoute 1 au compteur.

Le résultat donnerait un truc du genre :

Numero Annee Compteur
1007 1991 1
1007 1992 1
1007 1995 2
1007 1996 2
1007 1998 3
1007 1999 3
1007 2000 3
1007 2001 3
1008 1997 4
1008 1999 5
1008 2000 5
1008 2001 5
1008 2002 5
1008 2003 5
1009 2004 6<---Attention, ici, on change de numéro donc aussi de compteur!
1009 2005 6
1009 2006 6
1009 2010 7
1010 1973 8
1009 1975 9
1009 1976 9

J'ai pour code :

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
proc sort DATA = coucou;
BY numero annee;
run;
 
DATA coucou (keep=numero annee compteur64);
	SET coucou;
	retain compteur64;
	IF first.numero then compteur64=1;
	else compteur64 +1;
	BY numero;
run;
 
proc sort DATA=coucou;
BY numero descending annee;
run;
proc sort DATA=coucou out=coucousort nodupkey;
BY numero;
run;
DATA _null_;
	SET coucousort;
	call symput('var'||LEFT(_N_),numero);
	call symput('nb'||LEFT(_n_),compteur64);
	call symput('nb',_N_);
run;
 
proc sort DATA = coucou;
	BY numero annee;
run;
options mlogic mprint;
%macro numero();
	DATA coucou;
		SET coucou;
		retain compteur;
		%do i=1 %TO &nb;
			IF numero=&&var&i then do; 
				%do k=1 %TO &&nb&i;
					IF annee=lag(annee)+1 then compteur=&i;
					else compteur +1;
				%end;
			end;
		%end;
		BY numero annee;
	run;
 
%mend;
%numero();
Merci pour votre aide!!!
Misspatate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 11h24   #2
Nouveau Membre du Club
 
Homme Gaëtan
Inscription : avril 2011
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 29
Points : 26
Points : 26
Bonjour,

à priori avec une seule étape data ça marche très bien :

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
33
34
35
36
37
38
39
40
 
DATA truc;
input num annee compteur;
cards;
1007 1991 1
1007 1992 1
1007 1995 2
1007 1996 2
1007 1998 3
1007 1999 3
1007 2000 3
1007 2001 3
1008 1997 4
1008 1999 5
1008 2000 5
1008 2001 5
1008 2002 5
1008 2003 5
1009 2004 6
1009 2005 6
1009 2006 6
1009 2010 7
1010 1973 8
1011 1975 9
1011 1976 9
;
run;
 
proc sort DATA=truc;
BY num annee;
run;
 
DATA coucou (keep=num annee compteur new_compteur);
SET truc;
IF _n_ = 1 then new_compteur = 0;
IF first.num then new_compteur+1;/*quand on change de num on rajoute 1*/
BY num;
IF annee^=lag(annee)+1 then new_compteur+1;/*quand on change d'année on rajoute 1*/
IF first.num AND annee^=lag(annee)+1 then new_compteur=new_compteur-1;/*si on change de num et d'année on a rajouté 2 avec les lignes d'avant donc là on enlève 1*/
run;
boutchiwah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 13h27   #3
Invité régulier
 
Inscription : avril 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 60
Points : 8
Points : 8
Merci

Suis-je bête...!
Misspatate 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 01h08.


 
 
 
 
Partenaires

Hébergement Web