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 25/07/2011, 16h53   #1
Invité de passage
 
Inscription : août 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 9
Points : 3
Points : 3
Par défaut Pourquoi mon "merge" se passe t il mal ?

Bonjour à vous,
j'essaie de trouver dans une table qui regroupe l'ensemble des appels faits dans l'entreprise, les gens qui ont "rappelé" la même journée ou le lendemain.
J'ai donc pris un dataset des appels, que je merge avec lui même en changeant les noms des champs date pour pouvoir ensuite les comparer.
Le dataset a la forme suivait :
#Client DateAppel HeureAppel.

En faisant un merge par le #client, j'avais espoir, que pour une personne qui a appelé 2 fois , le dataset de résultats contienne 4 lignes mais malheureusement la première ligne se match a la 1ere et la 2e à la 2e, mais pas le croisé ... Est ce que je rate un argument dans mon merge pour faire le merge croisé ou bien il faut obligatoirement que je passe par un "proc sql" pour avoir ce résultat ?
ChrisMaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 17h03   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Bonjour, pas sur de bien comprendre ton probleme, pd'une amniere generale le merge va associer des colonnes (contrairement au set qui va associer des lignes) par rapport a ta cle. As tu par ailleurs verifie l'unicite de ta cle et trie tes donnees? Normalement tu dois pouvoir faire la meme chose dans une etape data que dans une proc sql (hormis produit cartesien).

Peux tu nous faire parvenir ton code (si ce qui est mit au dessus ne resout pas ton probleme)
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/07/2011, 17h15   #3
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Hello,
je n'ai pas bien compris non plus. Peut être un exemple de données en entrée et le résultat souhaité nous aidera à réflichir avec toi.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/07/2011, 17h22   #4
Invité de passage
 
Inscription : août 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 9
Points : 3
Points : 3
ok j'avoue , on sent que c'est lundi matin ici Je vais essayer d'être plus clair. Et ce n'est pas moi qui ai créé les tables de base, je ne suis pas responsable du format de la date :

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
DATA appel_juin;
SET ptbcsas.tf_trx_aisv (WHERE = (id_date BETWEEN 20110601 AND 20110630 AND id_appel > 0 AND num_pdo >0));
id_date1 = id_date;
id_heure1 = id_heure;
id_appel1 = id_appel;
keep id_date1 id_heure1 id_appel1 num_pdo;
run;
 
DATA appel_juin2;
SET ptbcsas.tf_trx_aisv (WHERE = (id_date BETWEEN 20110601 AND 20110701 AND id_appel > 0 AND num_pdo >0));
IF id_date = 20110701 then id_date2 = 20110631; else id_date2=id_date;
id_heure2 = id_heure;
id_appel2 = id_appel;
keep id_date2 id_heure2 id_appel2 num_pdo;
run;
 
 
proc sort DATA=appel_juin nodupkey; BY id_appel1;run;
proc sort DATA=appel_juin; BY num_pdo id_date1; run;
proc sort DATA=appel_juin2 nodupkey; BY id_appel2;run;
proc sort DATA=appel_juin2; BY num_pdo id_date2; run;
 
DATA test;
merge appel_juin (IN=in1) appel_juin2;
BY num_pdo;
IF in1 ;
run;
Pour appel_juin
NUM_PDO = 123 ID_Appel1 = 999 ID_Date1 = 20110603 id_Heure1 = 101009
NUM_PDO = 123 ID_Appel1 = 1002 ID_Date1= 20110624 id_Heure1 = 1501018

et appel_juin2
NUM_PDO = 123 ID_Appel2 = 999 ID_Date2 = 20110603 id_Heure2 = 101009
NUM_PDO = 123 ID_Appel2 = 1002 ID_Date2= 20110624 id_Heure2 = 1501018
NUM_PDO = 123 ID_Appel2 = 1105 ID_Date2= 20110631 id_Heure2 = 060005

Je m'attendais a une table de résultat avec 6 lignes mais je n'en ai que 2 ... la troisième occurence dans appel_juin2 disparaissant complètement.
*croise les doigts pour que ce soit un peu plus clair maintenant*
ChrisMaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 18h09   #5
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
Pour cela il faudrait que le merge fasse un produit cartesien et il ne le fait pas ce sacripant

donc switch pour du SQL
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 18h20   #6
Invité de passage
 
Inscription : août 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 9
Points : 3
Points : 3
ouais ouais ouais ... Note mentale = pas de produit cartésien avec un merge .. ça me fait un peu peur sur les programmes que j'ai fait dans le passé !
Merci beaucoup pour la confirmation
ChrisMaire 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 12h08.


 
 
 
 
Partenaires

Hébergement Web