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 01/12/2011, 16h46   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Par défaut Fusion fichier avec Merge : Variable numed has been defined as both character and numeric

Bonjour à tous,
je suis une nouvelle utilisatrice de SAS et je souhaite fusionner 2 fichiers, j'ai donc fais un merge.
Mais e probleme est que j'ai une erreur : " Variable numed has been defined as both character and numeric" et je ne comprends pas.
Faut il que ma variable identique soit numérique?
J'ai verifié la variable identique est au meme format dans les 2 fichiers.
Je vous remercie pas avance pour vos suggestions.
Natacha
5natacha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 16h52   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 713
Points : 1 713
Hello et bienvenue;


pour répondre à cette question
Code :
1
2
 
Faut il que ma variable identique soit numérique?
la réponse est : ou bien que la variable soit numérique dans les deux tables ou bien qu'elle soit caractère dans les deux table.


Sinon peux-tu poster ton code ? afin qu'on puisse t'aider?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 17h10   #3
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Voila mon code

Code :
1
2
3
4
5
6
Proc sort DATA=sasuser.cohortes2;BY idet ;run;
Proc sort DATA=sasuser.Cohortes1;BY idet;run;
DATA sasuser.Cohortes3;
merge sasuser.cohortes2 sasuser.Cohortes1;
BY idet;
run;
Je ne comprends pas la variable est caractere dans les 2 tables.
Merci d'avance.
5natacha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 17h20   #4
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 713
Points : 1 713
Bon le code à l'aire bon,
est ce que tu peux faire ceci :
Code :
1
2
3
4
5
 
 
proc sql;
DESCRIBE TABLE sasuser.cohortes1;
DESCRIBE TABLE sasuser.cohortes2;
et regarder le résultat dans la log pour s'assurer que ta variable idet est caractère dans les deux tables?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 21h53   #5
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
Citation:
Envoyé par 5natacha Voir le message
" Variable numed has been defined as both character and numeric"
Bonjour Natacha.
Ce n'est pas IDET qui pose problème, mais NUMED, comme l'indique le message. Attention dans MERGE, si des variables (autre que la clé IDET) portent le même nom, SAS essaye d'écraser les valeurs de la 1e table par celles de la 2e table en cas de correspondance.
Si tu veux conserver toutes les variables, il faudrait renommer celles qui sont identiques avant la jointure.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2011, 09h59   #6
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Merci beaucoup,
Olivier a raison mon problème vient du fait que mes variables ont le même nom entre les 2 tables.
Comment fait t-on pour renommer des variables de manière automatique .
Ex: on rajoute "_06".
Bonne journée et merci d'avance.
Natacha
5natacha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h13   #7
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.
A ma connaissance, pas de solution vraiment totalement simple. Un peu de macro-langage est nécessaire : on liste les variables de la table (sauf l'identifiant) avec une proc CONTENTS et ensuite on construit les couples ancien nom = nouveau nom avec _06 à la fin. On stocke ces couples dans une macro-variable qui sert ensuite à faire le RENAME nécessaire.
Code :
1
2
3
4
5
6
7
8
9
10
11
Proc CONTENTS DATA=sasuser.cohortes2 (DROP=idet)
          NOPRINT OUT=work.dico2 ;
run;
PROC SQL NOPRINT ;
  SELECT CATS(name,"=","name","_06")
    INTO : listeRename SEPARATED BY " "
  FROM work.dico2 ;
QUIT ;
PROC SORT DATA=sasuser.cohortes2 (RENAME=(&listeRename)) ;
  BY idet ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2011, 10h22   #8
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Merci beaucoup pour le code car j'avoue que c'est pas très simple.
Mais j'ai compris le principe.
Encore merci bonne journée.
Natacha
5natacha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h38   #9
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
Je rectifie mon code posté un peu vite : pas de guillemets autour de NAME dans les formules.
Code :
1
2
3
4
5
PROC SQL NOPRINT ;
  SELECT CATS(name,"=",name,"_06")
    INTO : listeRename SEPARATED BY " "
  FROM work.dico2 ;
QUIT ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2011, 12h08   #10
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Olivier, j'ai effectué ton code c'est génial cela fonctionne mais en fait je voudrais que dans ma nouvelle table cohorte3, les variable de la table cohorte2 soient visibles grace à "_06". Et en fait avec ton code j'arrive à faire un merge et cela fonctionne mais je ne distingue plus le "_06".
Je ne sais pas si je suis très claire!!
Merci d'avance
5natacha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 12h11   #11
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
J'imagine que c'est parce que les labels, eux, sont restés les mêmes. Si tu vas dans le menu VIEW > COLUMN NAMES tu devrais avoir les noms de variables en tête de colonne (je suppose que tu n'es pas dans SAS Enterprise Guide).
Est-ce que c'est ça le problème ? Sinon je ne vois pas.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 10h42   #12
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Bonjour,
c'est exactement ça , le "name" a été modifié mais pas le "label".
J'ai tenté de remplacer le "name" par "label" dans ton code mais dommage ça fonctionne pas! Trop simple.
Merci d'avance.
Natacha
5natacha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 12h18   #13
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
Voici donc la nouvelle version qui changer aussi les labels en mettant "2006" au début de ceux-ci.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Proc CONTENTS DATA=sasuser.cohortes2 (DROP=idet)
          NOPRINT OUT=work.dico2 ;
run;
PROC SQL NOPRINT ;
  SELECT CATS(name,"=",name,"_06"),
             CATS(name,"_06 = ")!!QUOTE(CATS("2006 : ", COALESCE(label,name)))
    INTO : listeRename SEPARATED BY " ",
           : listeLabels  SEPARATED BY " "
  FROM work.dico2 ;
QUIT ;
PROC SORT DATA=sasuser.cohortes2 (RENAME=(&listeRename)) ;
  BY idet ;
  LABEL &listeLabels ;
RUN ;
Un peu plus tordu, surtout que j'ai voulu prévoir le cas où la variable n'avait pas de label (d'où le COALESCE).
J'espère que ça fera ce que tu veux.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h09   #14
Invité de passage
 
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 3
Points : 3
Merci beaucoup ça fonctionne.
Bonne apres midi.
Natacha
5natacha 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 14h55.


 
 
 
 
Partenaires

Hébergement Web