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 03/11/2011, 16h13   #1
Invité régulier
 
Femme
Inscription : octobre 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 30
Points : 7
Points : 7
Par défaut Calcul d'une variable mensuelle à l'aide d'informations semestrielles

Bonjour à tous,

Mon problème est le suivant : dans ma table initiale, je possédais une liste de clients avec leurs évolutions semestrielles (dans la plupart des cas), mais dans certains autres cas, on peut trouver un peu tout et n'importe quoi : des informations semestrielles au début de la vie du client, puis des informations tout les 3 mois ou tout les deux mois ...
Bref, on a un peut tout et n'importe quoi ...

Mon objectif est de "lisser" tout cela pour avoir au final l'évolution mensuelle de chacun des clients de ma table.
Pour ce faire, j'ai d'abord ajouté les situations mensuelles manquantes.
Là où cela devient plus compliqué (en tout cas pour moi ) c'est lorsqu'il faut déterminer des montants mensuels.
Voici un exemple de ce que j'ai :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dt_situation  client      Sit_Mensuel_New             Solde       dif_solde
03/2009        A                     0                                  4000       0  
04/2009        A                     1                                  4000       0
05/2009        A                     1                                  4000       0
06/2009        A                     1                                  4000       0    
07/2009        A                     1                                  4000       0
08/2009        A                     1                                  4000       0
09/2009        A                     0                                  4300       300
10/2009        A                     1                                  4300       0
11/2009        A                     1                                  4300       0
12/2009        A                     0                                  3000       -1300
01/2010        A                     1                                  3000        0
02/2010        A                     1                                  3000        0 
03/2010        A                     1                                  3000        0
04/2010        A                     0                                  3500        500
05/2010        A                     1                                  3500        0
En fait, ce que je cherche à avoir c'est :
1. dupliquer vers le haut la colonne dif_solde
ex :entre 03/2009 et 08/2009, la colonne dif_solde doit être = à 300
ainsi de suite
j'ai essayé en faisant un tri décroissant pour pouvoir faire ensuite un lag, mais cela ne fonctionne pas ....

2. Diviser ensuite la colonne dif_solde par le nombre de mois ajoutées
par exemple : de 04/2009 à 08/2009 : on obtiendra une nouvelle colonne qui sera égale à 300/5 pour chaque ligne de 04/2009 à 08/2009 ...

Une fois cela obtenu, je peux alors calculer un solde mensuel :
par ex 03/2009, solde = 4000
04/2009, solde = 4000 + (300/5)
05/2009, solde = 4000 + (300/5) + (300/5)
et ainsi de suite ....


Voilà j'espère que c'est clair et que quelqu'un pourra m'aider !!!
D'avance merci pour le coup de main !!!

PS : désolé, je n'arrive pas à aligner correctement les deux dernières colonnes ....
Chicou17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 16h47   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
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 467
Points : 2 828
Points : 2 828
Bonjour.
Je crois que tant qu'à y être, je préfère repartir des données non complétées avec les mois qui manquaient. Comme ça tu fais tout en même temps : tu ajoutes les mois qui manquent et tu lisses tes évolutions de solde.
Ca demande un peu de code, il y a une petite boucle, mais je crois rien de bien compliqué. J'ai laissé volontairement les variables intermédiaires (compteur de boucle, résultat des LAG, etc.) pour que tu voies bien comment le programme avance dans tes données.
Bon courage.
Olivier

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
47
48
DATA work.clients (DROP=mois annee Sit_Mensuel_New) ;
  FORMAT dt_situation MMYYS7. ;
  INPUT mois 2. +1 annee 4. 
        client $
        Sit_Mensuel_New  
        Solde ;
  dt_situation = MDY(mois,1,annee) ;
  IF Sit_Mensuel_New = 0 ;
DATALINES ;
03/2009        A                     0                                  4000       0  
04/2009        A                     1                                  4000       0
05/2009        A                     1                                  4000       0
06/2009        A                     1                                  4000       0    
07/2009        A                     1                                  4000       0
08/2009        A                     1                                  4000       0
09/2009        A                     0                                  4300       300
10/2009        A                     1                                  4300       0
11/2009        A                     1                                  4300       0
12/2009        A                     0                                  3000       -1300
01/2010        A                     1                                  3000        0
02/2010        A                     1                                  3000        0 
03/2010        A                     1                                  3000        0
04/2010        A                     0                                  3500        500
05/2010        A                     1                                  3500        0
;
RUN ;
 
 
DATA work.mensuel ;
  SET work.clients ;
  BY client ;
  mois_prec = LAG(dt_situation) ;
  sld_prec = LAG(solde) ;
  mois=dt_situation ;
  IF NOT FIRST.client THEN diff = INTCK("MONTH",mois_prec,dt_situation) ;
  ELSE DO ;
	solde_new = solde ;
	diff=0 ;
	OUTPUT ;
  END ;
  solde_new = sld_prec ;
  DO i=1 TO diff ;
    solde_new = solde_new + (solde-sld_prec)/diff ;
	mois = INTNX("MONTH",mois_prec,i) ;
	OUTPUT ;
  END ;
  FORMAT mois: MMYYS7. ;
RUN ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 07h02   #3
Invité régulier
 
Femme
Inscription : octobre 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 30
Points : 7
Points : 7
Bonjour Olivier,

Tout d'abord un grand pour ta réponse !!

Je vais regarder cela en détails et reviendrais donner des nouvelles ensuite.
Chicou17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 08h13   #4
Invité régulier
 
Femme
Inscription : octobre 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : octobre 2011
Messages : 30
Points : 7
Points : 7
Bonjour à tous,

Désolé pour cette réponse tardive ...

En tout cas, Olivier, ta proposition semble bien fonctionner !

Encore un tout grand merci pour ton aide

Bonne journée.
Chicou17 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 13h12.


 
 
 
 
Partenaires

Hébergement Web