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 20/06/2008, 12h23   #1
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2007
Messages : 96
Points : 32
Points : 32
Par défaut Fusion de 2 tables SAS ( MERGE ou SET)

J'ai 2 tables SAS dont une contient les titres de colonnes et de lignes (nom de colonne et ligne identique) et une contient les données relatives à ces titres.

Je voudrais n'en faire plus qu'une table:

Code :
1
2
3
4
5
6
7
8
 
DATA TABLEFINALE;
	SET TABLECARACTERE TABLEENTIER; 
 
OU 
 
DATA TABLEFINALE;
	MERGE TABLECARACTERE TABLEENTIER;
La table finale ne se remplit pas et le journal me donne :
ERREUR: La variable COL1 a été définie comme alphanumérique et numérique.
Flynt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 13h15   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Code :
1
2
3
 
DATA TABLEFINALE;
	SET TABLECARACTERE TABLEENTIER;
Tu empiles les tables : il faut avoir les mêmes nom de variables pour que cela marche.
fusion horizontal

Code :
1
2
3
 
DATA TABLEFINALE;
	MERGE TABLECARACTERE TABLEENTIER;
fusion vericale; il faut avoir une variable en commun (équivalent à une proc sql)
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 14h45   #3
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Bahraoui a raison, il ne faut pas confondre concaténation et fusion de tables. Dans la première tu empile les tables les une à la suite des autres, dans la seconde tu "colle" les tables côte à côtre selon une clé de jointure.
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 14h55   #4
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2007
Messages : 96
Points : 32
Points : 32
Oui je pense devoir passer par un SET mais mon principal problème est que je récupère les données à partir de 2 matrices une remplie de caractères et l'autre d'entiers.

Avant de concaténer les 2 tables il faudrait que je puisse convertir les entiers en caractère du style un PUT...

Je n'arrive pas à grand chose malheureusement.
Flynt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h03   #5
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
arf ! dans ce cas il faut en effet utiliser la fonction PUT dans une étape data pour convertir les numériques en caractère (ou la fonction INPUT pour passer du caractère au numérique)

essaie ça :

Code :
1
2
3
4
5
 
DATA TABLECARACTERE2(DROP=tmp);
    SET TABLEENTIER (RENAME=(ta_variable=tmp));
    ta_variable=put(tmp,8.);
RUN;
8 étant la longueur de ta variable. Essaie de prendre la même longueur que dans l'autre table.

Apres tu fais un SET des 2 tables, veille a ce qu'elles ont le même nom de variable sinon tu aura 2 colonnes différentes.
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h05   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
convertir un entier en caractère.
Code :
1
2
3
4
5
 
DATA t;
a=1;
b=put(a,3.);
run;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h22   #7
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Est-ce que tu es sûr que tu veux mettre dans une table les noms des colonnes en tant que les données ? Tu ne veux pas plutôt changer les noms des colonnes de cette même table ?
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h24   #8
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2007
Messages : 96
Points : 32
Points : 32
Ok merci pour les réponses je dois surement toucher au but.

Donc

Code :
1
2
3
4
5
6
7
8
9
 
DATA TABLEINTVERSCHAR(DROP=tmp);
    SET TABLEINT ;   
RUN;
 
 
DATA TABLEFINALE ;	
	SET TABLEINTVERSCHAR TABLECHAR ; 
	run;
J'explicite pas les noms de variables, mes colonnes portant les noms COL1 COL2... pour les 2 tableaux.

Je me piffre quand même une erreur de type même après conversion O_o :

ERREUR: La variable COL32 a été définie comme alphanumérique et numérique.

NOTE: Le Système SAS a interrompu le traitement de cette étape en raison d'erreurs.
AVERTISSEMENT: La table TABLEFINALE est peut-être incomplète. Lorsque cette étape a été stoppée, il y avait 0
observations et 34 variables.

EDIT :
@greenfr : dans l'absolu ce serait pas mal mais ces noms de variables doivent aussi apparaitre en ligne en fait c'est au final une matrice de distance pour info.
Flynt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h29   #9
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Citation:
Envoyé par Flynt Voir le message
ERREUR: La variable COL32 a été définie comme alphanumérique et numérique.
ça signifie que tu essaie de convertir ta variable en caractère alors qu'elle existe déja en numérique tu peux pas convertir une variable qui existe déja. pour convertir une variable tu dois en créer une c'est pour ça que je fais un rename= dans mon code :
je renomme ma varaible ma_variable en tmp puis je créé une nouvelle variable nommé ma_variable qui converti tmp.
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h35   #10
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2007
Messages : 96
Points : 32
Points : 32
Sauf que dans mon cas je n'ai pas qu'une variable mais une trentaine et qui ne sont pas forcément dans le même ordre pour chaque exécution.

Ces variables ont été stockés précedemment dans une matrice.

Enfin ça me parait compliqué de faire RENAME sur toute mes variables.
Flynt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 10h51   #11
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Si tu tiens vraiment à changer le type de donnée de tes colonnes, le plus simple pour moi est de recréer une table avec une proc sql. De genre :
Code :
1
2
3
4
5
6
7
8
9
proc sql;
CREATE TABLE TABLEFINALE AS
  SELECT F1, F2, F3
  FROM TABLECHAR
union
  SELECT put(F1, 3.), put(F2, 3.), put(F3, 3.)
  FROM TABLEINT
;
quit;
Mais si j'ai bien compris ton besoin, il te faut une matrice de distances, i.e. dans ta table tu a les noms des "point de départ" dans la première colonne, les noms des "points d'arrivée" dans la première ligne et "une distance" dans l'intersection.
Si c'est ça, je me poserai une question : est-ce que je cherche le format de table pour le stockage (et l'utilisation) des données ? Ou c'est juste le format de représentation ? Parce que la réponse sera différente.
1. Pour le stockage et l'utilisation de cette information il faut surtout pas convertir les nombres en texte. Imagine la galère pour toutes les opérations arithmétiques. Et même la structure de la table - je le ferai différemment : à juste trois colonnes "point de départ", "point d'arrivée" et "distance".
2. Et pour l'affichage / export / impressions et autre format de présentation de cette information tu peux faire juste une proc transpose qui te fera une matrice telle que j'ai décri : les noms dans la première colonne et la première ligne avec des chiffres dans l'intersection.

J'espère que je n'ai pas déliré :-) Il est parfois difficile de deviner ce que veulent faire les autres :-)
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h52.


 
 
 
 
Partenaires

Hébergement Web