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 16/01/2012, 19h49   #1
Invité de passage
 
Femme
apprentie développeur
Inscription : juillet 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Anguilla

Informations professionnelles :
Activité : apprentie développeur
Secteur : Service public

Informations forums :
Inscription : juillet 2011
Messages : 4
Points : 1
Points : 1
Par défaut Somme variables avec condition

Bonjour,
J'ai le cas suivant:

id annee y
100 1989 1
100 1990 2
100 1991 3
100 2002 4
100 2003 8
100 2004 2
100 2005 1
105 1987 2
105 1988 9
105 1989 1
Je voudrais faire la somme de y, pour le même identifiant s'il y a au moins 3 ans consécutifs!!! J'ai aucune idée. Résultat attendu:
id somme
100 1+2+3=6
100 4+8+2+1=15
105 -

J'ai essayé avec une nouvelle variable qui me donne la difference entre y et LAG(y) mais j'arrive pas à alller plus loin!!!

develap
Merci d'avance,


S.O.S.

Merci pour l'aide!!!
develap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 07h37   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 471
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 471
Points : 2 834
Points : 2 834
Bonjour.
Merci d'éviter de poster les messages en double dans plusieurs sections du forum. Cela demande ensuite aux modérateurs un travail de nettoyage et ça ne fait pas répondre plus vite à qui que ce soit.
Je verrais un travail en plusieurs étapes (même si on peut probablement tout faire en une seule étape Data, en décomposant on peut vérifier des résultats intermédiaires).
1) marquer les blocs d'années consécutives d'un même ID
2) sommer, par blocs d'ID et d'années consécutives, les valeurs de Y
3) éliminer les sommes concernant moins de 3 lignes de détail.
Pour l'étape 1 une étape DATA avec un SET BY (pour marquer les blocs d'ID) et une variable décalée sur l'année (LAG) devraient permettre de tester que dans un même bloc d'ID l'écart entre l'année en cours et l'année précédente n'excède pas 1. Si c'est le cas on ne change pas le n° du bloc, sinon on l'augmente. A la fin de cette étape, on a au moins dans la table les variables ID, Y et BLOC.
Code :
1
2
3
4
5
6
7
8
9
10
11
id annee y BLOC
100 1989 1 1
100 1990 2 1
100 1991 3 1
100 2002 4 2
100 2003 8 2
100 2004 2 2
100 2005 1 2
105 1987 2 1
105 1988 9 1
105 1990 1 2
L'étape 2 demande une simple PROC MEANS ou SQL.
L'étape 3, sur le résultat de l'étape 2, est un filtre décrit par un WHERE.

Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/01/2012, 12h54   #3
Invité de passage
 
Femme
apprentie développeur
Inscription : juillet 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Anguilla

Informations professionnelles :
Activité : apprentie développeur
Secteur : Service public

Informations forums :
Inscription : juillet 2011
Messages : 4
Points : 1
Points : 1
Par défaut Solution

Merci. et je prends le conseil!!!
Bonne journée

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
DATA TEST1;
SET work.TEST;
BY id_ass annee;
dif_annee=annee-LAG(annee);
IF first.id_ass then do;
	dif_annee=1;
	end;
sdiff=dif_annee;
run;
DATA test3;
SET work.test1;
BY id_ass;
T1=0;
IF dif_annee eq 1 then T1=dif_annee;
 
RETAIN CONTEO;
IF (first.id_ass) OR (T1=0)  THEN CONTEO=1;
ELSE IF (T1 ge 1) OR (T1 eq 1) THEN CONTEO+1;
RUN;
DATA test4;
SET work.test3;
IF (CONTEO eq 3);
run;
proc sql;
   CREATE TABLE final AS
   SELECT id_ass, annee,CONTEO
   FROM test4
   GROUP BY id_ass
   HAVING count(*) = 1;
quit;
develap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 12h56   #4
Invité de passage
 
Femme
apprentie développeur
Inscription : juillet 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Anguilla

Informations professionnelles :
Activité : apprentie développeur
Secteur : Service public

Informations forums :
Inscription : juillet 2011
Messages : 4
Points : 1
Points : 1
Aucune idée comment on fait pour poster le code!!!
develap 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 16h25.


 
 
 
 
Partenaires

Hébergement Web