Bonjour,
Pourriez-vous m'aider sur ce sujet s'il vous plait ?
En effet, la problématique consiste à remplir 2 colonnes, la 1ère c'est pour compter le nombre de dossier avant chaque contrat et la 2eme colonne c'est pour compter le nombre de contrat ouvert durant chaque contrat et cela pour chaque client.
J'ai réalisé l'opération en utilisant la commande First et Last, mais cela ne semble pas correcte à 100% (car j'ai un problème avec les dates non renseignées).
Il me semble que cela peut être réalisé avec une boucle et se basant sur les dates de création et de clôture des contrats ou par une proc SQL.
Exemple : Pour 3 clients : idir, laurent et paul
Idir :
client | CREATION_DATE | CLOSURE_DATE | amount | nb_cont_avant | nb_cont_ouvert |
idir | 05APR2022:16:32:32.628999949 | 05JUL2022:17:00:02.467000008 | 299.99 | 1 | 1 |
idir | 04APR2022:19:21:56.956000090 | 04JUL2022:19:30:02.747999907 | 171 | 0 | 2 |
Laurent :
client | CREATION_DATE | CLOSURE_DATE | amount | nb_cont_avant | nb_cont_ouvert |
laurent | 06APR2022:16:26:49.085999966 | 06JUL2022:16:30:03.121999979 | 45.18 | 3 | 1 |
laurent | 06APR2022:20:11:41.582999945 | 06JUL2022:20:30:02.753000021 | 140 | 1 | 2 |
laurent | 07APR2022:18:56:03.078000069 | 07JUL2022:19:00:03.101999998 | 19.09 | 0 | 3 |
laurent | 06APR2022:17:17:45.084000111 | 06JUL2022:17:30:03.157999992 | 61.96 | 4 | 4 |
laurent | 06APR2022:15:27:43.875999928 | 06JUL2022:15:30:03.236999989 | 298.79 | 2 | 5 |
laurent | 06APR2022:22:27:29.566999912 | 06JUL2022:22:30:02.845000029 | 113.92 | 7 | 1 |
laurent | 06APR2022:17:57:56.187000036 | 06JUL2022:18:00:03.391999960 | 50.9 | 6 | 2 |
laurent | 06APR2022:16:34:52.822000027 | 06JUL2022:17:00:02.829999924 | 11 | 5 | 3 |
Paul :
client | CREATION_DATE | CLOSURE_DATE | amount | nb_cont_avant | nb_cont_ouvert |
Paul | 04JUN2022:07:46:54.303999901 | . | 54.2 | 2 | 1 |
Paul | 04MAY2022:17:59:33.095000029 | 04AUG2022:18:00:03.529999971 | 153.2 | 0 | 2 |
Paul | 03MAY2022:10:59:41.878000021 | 03AUG2022:11:00:03.448999882 | 372 | 1 | 3 |
Paul | 29MAY2022:21:22:01.579999924 | 29AUG2022:21:30:03.081000090 | 65 | 1 | 1 |
Paul | 29MAY2022:08:19:16.059999943 | 29AUG2022:08:30:03.226000071 | 222.71 | 0 | 2 |
Paul | 02JUN2022:22:39:14.381999969 | . | 49 | 6 | 1 |
Paul | 30MAY2022:21:36:52.592999935 | 30AUG2022:22:00:02.921000004 | 59 | 5 | 2 |
Paul | 01JUN2022:18:02:28.953000069 | 01SEP2022:18:30:03.053999901 | 173 | 4 | 3 |
Paul | 03JUN2022:14:48:07.697999954 | . | 85.7 | 3 | 4 |
Paul | 29MAY2022:16:09:00.170000076 | 29AUG2022:16:30:02.714999914 | 151.2 | 2 | 5 |
Voici mon code :
LIBNAME Test "/home/u43350984/sasuser.v94";
/* Fichier source : test.xlsx */
FILENAME NB_ctr '/home/u43350984/sasuser.v94/test.xlsx';
PROC IMPORT DATAFILE=nb_ctr DBMS=XLSX OUT=WORK.nb_ctr; GETNAMES=YES;
RUN;
Data Data_format;
Set NB_ctr (rename=(CREATION_DATE=old1 CLOSURE_DATE=old2));
CREATION_DATE = input(old1, DATETIME.);
CLOSURE_DATE = input(old2, DATETIME.);
format CREATION_DATE DATETIME. CLOSURE_DATE DATETIME.;
run;
data Data_manip_date1;
Set Data_format;
CRE_DATE = substr(old1,1,9);
CLO_DATE = substr(old2,1,9);
CRE_TIME = substr(old1,11,8);
CLO_TIME = substr(old2,11,8);
run;
data Data_manip_date2;
Set Data_manip_date1;
a = substr(CRE_TIME,1,2);
b = substr(CRE_TIME,4,2);
c = substr(CRE_TIME,7,2);
x = substr(CLO_TIME,1,2);
y = substr(CLO_TIME,4,2);
z = substr(CLO_TIME,7,2);
A2= cats(a,b,c);
B2 = cats(x,y,z);
drop a b c x y z CRE_TIME CLO_TIME;
run;
PROC SQL;
CREATE TABLE Table_ordonee AS
SELECT client, old1,old2, amount, A2, B2, nb_cont_avant, nb_cont_ouvert,
datepart(CREATION_DATE) format=date9. as DatexCRE,
datepart(CLOSURE_DATE) format=date9. as DAtexCLO
FROM Data_manip_date2;
quit;
data Table_ordonee1;
Set Table_ordonee;
A1= input(put(DatexCRE,YYMMDDn8.),8.);
B1= input(put(DAtexCLO,YYMMDDn8.),8.);
DCR = cats (A1,A2);
DCL = cats (B1,B2);
run;
PROC SQL;
CREATE TABLE table_cerverti AS
SELECT client, old1 as CREATION_DATE ,old2 as CLOSURE_DATE, DCR, DCL, amount
FROM Table_ordonee1;
quit;
Proc sort data=table_cerverti;
by client DCR;
run;
/*Impression de la base pour vérifier le tri*/
proc print data=NB_ctr; run;
/*Compter le nombre de contrat avant la création des nouveaux contrats pour chaque client*/
data Data_nb_cont_avant ;
set table_cerverti;
by client;
if first.client then nb_cont_avant=0; else nb_cont_avant+1;
run;
/*Compter le nombre de contrat ouvert pour chaque client*/
Proc sort data=Data_nb_cont_avant;
by client descending DCL ;
run;
data Data_contrats_final;
set Data_nb_cont_avant;
by client;
if first.client then nb_cont_ouvert=1; else nb_cont_ouvert+1;
run;
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.