|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Bonjour,
Encore un nouveau souci dans SAS .... et en essayant avec des last, retain, je ne m'en sors pas. Voici le problème : je cherche à décumuler une variable, l'exemple suivant sera plus explicite qu'un long texte Date Client Montant cum Montant dé-cumulé voulu 31/01/2009 AAA 0 0 (1ère situation reste inchangé) 28/02/2009 AAA 100 100 (100-0) 31/03/2009 AAA 200 100 (200-100) 30/04/2009 AAA 400 200 (400-200) 31/05/2009 AAA 700 300 (700-400) 30/06/2009 BBB 10 10 (1ère situation reste inchangé) 31/07/2009 BBB 100 90 (100-10) 31/08/2009 BBB 500 400 (500-100) 30/09/2009 BBB 1000 500 (1000-500) Est-ce quelqu'un pourrait m'expliquer comment faire pour obtenir la colonne "montant dé-cumulé voulu" ??? Merci beaucoup pour votre aide ! |
|
|
00
|
|
|
#2 | ||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Bonjour
je te propose de classer tes observations par client et montant cumulé si ce n'est pas déjà fait. Code :
Code :
|
||||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Ca fonctionne !!!!
merci mille fois !
|
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
En fait, j'ai trouvé un problème dans le résultat du programme
Voila ce qu'il me donne : Date Client Montant cum Montant dé-cumulé voulu 31/01/2009 AAA 0 0 (1ère situation reste inchangé) 28/02/2009 AAA 100 100 31/03/2009 AAA 100 0 30/04/2009 AAA 200 100 31/05/2009 AAA 200 0 30/06/2009 BBB 0 0 31/07/2009 BBB 0 -200 ??????? 31/08/2009 BBB 100 100 30/09/2009 BBB 100 0 Je ne comprends pas pourquoi il me fait ca .. il se base sur la situation d'un autre client alors qu'il ne devrait pas ... Une idée pour résoudre ce problème ??? Deuxième point : j'aimerais lui dire que si la différence d'un mois à l'autre est nul, alors il me garde la valeur dé-cumulée non nulle précédente. Pour obtenir au final : Date Client Mt_cum Mt_décumulé_voulu Mt_décum_final 31/01/2009 AAA 0 0 -> 0 28/02/2009 AAA 100 100 -> 100 31/03/2009 AAA 100 0 -> 100 30/04/2009 AAA 400 300 -> 300 31/05/2009 AAA 400 0 -> 300 30/06/2009 BBB 0 0 -> 0 31/07/2009 BBB 0 0 -> 0 31/08/2009 BBB 100 100 -> 100 30/09/2009 BBB 100 0 -> 100 Merci à toutes les bonnes âmes qui prendront le temps de m'aider ! |
|
|
00
|
|
|
#5 | ||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Ok pour ta première question, je vois le truc, je ne sais pas comment nous en débarrasser "proprement", mais on peut contourner le problème
Code :
Pour ta deuxième question, sur le même principe, tu as essayé par exemple de mettre ceci à la fin ? dern_val=lag(montant_decum); if montant_decum=0 then montant_decum=dern_val; Si les dates sont importantes pour toi n'oublie pas de mettre la date dans les variables de tri (en dernier : soit dans le sort by client montant_cumul date; sans toucher au by de l'étape data ). |
||
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
C'est nikel !! les valeurs négatives ont disparu !
Et il redémarre bien là où il faut par client ! merci bcp bcp !!!Pour ma deuxième question, est ce que tu sais comment je peux faire pour lui dire de garder le mt décumulé non nul, date par date, jusqu'à ce qu'il trouve un autre mt décumulé non nul et ainsi de suite ... ????? J'ai mis un exemple dans mon mail précédent si ce n'est pas très clair par écrit |
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
En fait, j'avais aussi essayer de passer par une nouvelle variable LAG(mt_decum) en l'intégrant dans le programme, mais ca ne fonctionnait pas.
J'ai essayé avec ta proposition ... mais même erreur ... En fait, j'ai trouvé : cela ne fonctionnait pas parce qu'il faut créer cette nouvelle variable dans un autre data step ... certainement parce qu'elle se base sur une variable créée dans le 1er programme ... En tout cas, en passant par un nouveau data step, ca fonctionne !! Ouf ! En tout cas, vraiment vraiment merci pour ton aide !!
|
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
je suis désespérée ...
ca a marché une fois en passant par des tables tests mais maintenant que je veux intégrer tout ca pour travailler sur mes vrais données, ca ne fonctionne plus a cause de la variable dern_val qui ne garde pas à toutes les situations les valeur non nulles décumulées ... voila ce que j'ai : date mt_cum mt_decum dern_val 31/01/2009 0 0 0 28/02/2009 500 500 0 31/03/2009 500 0 devient 500 500 30/04/2009 500 0 devrait être 500 0 (on veut avoir 500 ...) au secours je deviens folle !!!!!! |
|
|
00
|
|
|
#9 | ||
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Voila mon programme :
A noter que la table test00 est une table trier (proc sort) par client, mt_cum et date. Code :
table initiale : date mt_cum soustract mt_decum 31/01/2009 0 0 0 28/02/2009 500 0 500 31/03/2009 500 500 0 30/04/2009 500 500 0 table de résultat: date mt_cum soustract mt_decum dern_val 31/01/2009 0 0 0 0 28/02/2009 500 0 500 0 31/03/2009 500 500 500 500 30/04/2009 500 500 0 0 comme constaté, le pb se pose sur la dernière ligne dans ce cas précis : nous devrions avoir dern_val = 500 et donc mt_decum = 500 Est-ce que qq un voit où est le problème ??? Un grand merci par avance. |
||
|
|
00
|
|
|
#10 | ||
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
Pourquoi vous n'aviez pas utilisé le DIF ? si la valeur d'après est inférieure à la valeur d'avant alors le decum est négatif.
Code :
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
||
|
00
|
|
|
#11 | ||
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
pour la deuxième question, tu veux cela ?
Code :
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
||
|
00
|
|
|
#12 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
J'obtiens aussi :
date client mt_cum mt_decum 31/01/2009 AAA 0 0 28/02/2009 AAA 500 500 31/03/2009 AAA 500 0 30/04/2009 AAA 500 0 31/05/2009 AAA 600 100 30/06/2009 AAA 600 0 31/07/2009 AAA 600 0 Mon souci est que je veux garder le mt_decum à la place des 0 donc par exemple au 31/03/2009, SAS doit me mettre 500 de mt_decum, idem pour le 30/04/2009 pour le 30/06/2009, il doit me garder 100 comme mt_decum et ainsi de suite ... ma table contient ainsi des milliers de clients pour lesquels il faut généraliser tout ceci .... |
|
|
00
|
|
|
#13 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
cela ne fonctionne pas en utilisant ta solution : voila ce que j'obtiens :
date client mt_cum mt_decum 31/01/2009 AAA 0 0 28/02/2009 AAA 500 500 31/03/2009 AAA 500 500 30/04/2009 AAA 500 500 31/05/2009 AAA 600 100 30/06/2009 AAA 600 600 -> faux, devrait etre 100 31/07/2009 AAA 600 600 -> faux, devrait etre 100 31/08/2009 AAA 800 200 30/09/2009 AAA 800 800 -> faux, devrait etre 200 31/10/2009 AAA 800 800 -> faux, devrait etre 200 |
|
|
00
|
|
|
#14 | ||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
re
sur la base du code posté par datametrics Code :
Code :
|
||||
|
|
00
|
|
|
#15 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Bonjour,
Je ne pourrais essayer ta solution que demain matin au boulot. Je reviendrais donc demain pour dire si ça a fonctionné. Merci d'avance ! |
|
|
00
|
|
|
#16 | ||
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Bonjour,
Faisant suite à ton programme Code :
Merci par avance. |
||
|
|
00
|
|
|
#17 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Si j'enlève cette sorte d'accent circonflexe, voici ce que j'obtiens :
date client mt_cum mt_decum 01/2009 A 0 0 02/2009 A 500 500 03/2009 A 500 0 04/2009 A 500 500 05/2009 A 1500 1000 06/2009 A 1500 0 07/2009 A 1500 1000 01/2009 B 0 0 02/2009 B 100 100 03/2009 B 100 -1500 04/2009 B 100 100 05/2009 B 500 400 06/2009 B 500 0 07/2009 B 500 400 et avec l'accent circonflexe, je m'éloigne encore plus de la solution ... |
|
|
00
|
|
|
#18 |
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
le chapeau chinois signifie "différent" donc ^= signifie n'est pas égal à
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
|
00
|
|
|
#19 |
|
Invité régulier
![]() Inscription : octobre 2011 Messages : 30 ![]() |
Ok, merci pour l'information !!!
|
|
|
00
|
|
|
#20 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour à tous.
^= signifie "différent de". On peut aussi écrire NE (Not Equals), ce qui me semble une écriture plus robuste. Par ailleurs, je ne suis pas certain d'avoir tout compris à ton cahier des charges, Chicou17, mais je trouve que la solution actuelle, avec des LAG sous condition, des LAG dans la condition à évaluer, tout ça fait un peu rafistolage. Si tu as besoin de savoir qu'un montant ne varie pas, utilise des blocs BY sur le montant par client. Code :
Bon courage. Olivier |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com