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 26/10/2011, 07h32   #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 Ajout de dates entre deux dates

Bonjour à tous,

Voici mon souci : dans ma table, j'ai des milliers de clients avec leurs situations mensuelles (dt_situation).
Mais pour certains de ces clients, il peut y avoir un trou entre deux dates mensuelles et j'aimerais pouvoir combler ce trou en ajoutant les situations mensuelles manquantes.

Imaginons que pour une client donné, j'ai sa situation de janvier 2009 jusque août 2009, et de novembre 2009 à décembre 2010. Il me manque donc les situations mensuelles de septembre et d'octobre que j'aimerais pouvoir ajouter en conservant pour ces deux nouveaux mois les informations observées (ex : solde etc ...) du mois d'août 2009.

Qq aurait-il des idées ???

Merci par avance !!!!
Chicou17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 10h06   #2
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Bonjour,

Ce ne doit pas être pas trop compliqué à faire

1) tester si la situation mensuelle est manquante
(en construisant avec un retain un mois "attendu" qu'on utilise dans un test
if mois_courant=mois_attendu alors OK sinon code de génération de la situation mensuelle manquante)
Je dis ça rapidement, mais d'autres tests pourraient être imaginés.

2) reprendre pour le mois manquant la situation mensuelle courante M-1

Pourrait on en savoir plus sur ta variable dt_situation , de quelle type est elle ? A quoi ressemble-t-elle ?
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 10h38   #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,

Merci pour ta réponse.

Ma variable "dt_situation" est de la forme "31/01/2009" ddmmyy10.

Mais comment lui définir un mois attendu ?
En partant de la 1ère date de situation présente pour un compte et en incrémentant les mois suivants attendus en faisant "dt_situation" + 1 mois ?
Ensuite en comparant mois attendu et mois observé, j'identife les mois manquants et les remplace par les mois attendus ?

Mon souci est plutôt en terme de language SAS en fait ... Pour calculer le mois attendu, je peux faire ca via la fontion INTNX je pense, ça devrait fonctionner. Mais comment lui dire d'ajouter les situations manquantes identifées entre deux dates de situation observées tout en lui demandant de garder les informations du mois précédent ???

Merci pour ton aide !!
Chicou17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 15h01   #4
Membre du Club
 
Homme Jérémy Noël
Consultant Support Client SAS
Inscription : mai 2011
Messages : 38
Détails du profil
Informations personnelles :
Nom : Homme Jérémy Noël
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant Support Client SAS
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 38
Points : 58
Points : 58
Bonjour,

Dans une autre table tu crées une variable de date (portant le même nom et avec le même format que celle de ta table initiale) via une boucle simple.

Ensuite tu tries tes deux tables par ta variable de date.

Enfin tu merges en lui indiquant de garder toutes les obersavations de ta table contenant uniquement la date.

Je te fais un bout de code pour l'exemple d'ici 15 minutes.
frajen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 16h03   #5
Membre du Club
 
Homme Jérémy Noël
Consultant Support Client SAS
Inscription : mai 2011
Messages : 38
Détails du profil
Informations personnelles :
Nom : Homme Jérémy Noël
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant Support Client SAS
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 38
Points : 58
Points : 58
Voici le code promis:

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 TABLE;
input date :ddmmyy10. dt_situation;
cards;
01/01/2009 10
01/02/2009 12
01/04/2009 14
;
run;
 
DATA date(keep =date);
format date ddmmyy10.;
do i='01JAN2009'd TO '01APR2009'd ;
date=i;
y=day(date);
IF y=1 then output;
end;
run;
 
proc sort DATA=TABLE out=table1;
BY date;
run;
 
proc sort DATA=date out=date1;
BY date;
run;
 
DATA final;
merge date1 table1;
BY date;
run;
frajen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 19h16   #6
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Voici avec une variante de la proc FREQ. Je considère que les dates sont reconstituées à partir du jeu de données de tous les clients. Après tu peux t'amuser avec RETAIN, LAG, CROSS JOIN ...


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
DATA test;
input client date :date9. situation;
format date date9. ;
datalines;
1 01jan2009 25
1 01feb2009 26
1 01mar2009 27
1 01apr2009 28
1 01jun2009 30
2 01jan2009 25
2 01feb2009 26
2 01mar2009 27
2 01apr2009 28
2 01may2009 29
2 01jul2009 30
3 01jan2009 25
3 01feb2009 26
3 01mar2009 27
3 01apr2009 28
3 01jun2009 30
;
 
run;
 
proc freq DATA=test noprint;
TABLE client*date / sparse out=ref;
run;
 
proc sql;
CREATE TABLE test2 AS
SELECT a.client, a.date , b.situation
FROM ref AS a 
LEFT JOIN test AS b ON a.client=b.client AND a.date = b.date
;
quit;
 
DATA test3;
SET test2;
BY client;
situ=lag(situation);
situation = coalesce (situation , situ);
DROP situ;
run;
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 10h10   #7
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,

Désolé pour cette réponse tardive mais je n'ai pas pu tester tout de suite vos solutions.

Je viens de le faire et cela fonctionne !!!!

Un grand merci !!!
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 08h46.


 
 
 
 
Partenaires

Hébergement Web