Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
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 09/06/2011, 18h18   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 28
Points : 11
Points : 11
Par défaut Definition nouvelle variable avec format dans datastep

Bonjour,

1) Le contexte
Je travaille sur des tables SAS avec des proc sql. Je fais mes jointures sur des variables avec des formats associes. Visiblement SAS fait la jointure sur la valeur de la variable et non pas la variable formate. Je souhaite donc definir de nouvelles variable 'en dur' prenant la valeur du format qui leur est associe.

2) Le pbm
Voici mes formats :

Code :
1
2
3
4
5
6
7
8
9
10
proc format ;
value patatra 
low-0 ="badaboum"
0-high = "pifpafpof" ;
 
value $alphabet
"A","B" ="Debut" 
"C","D" ="Fin" ;
 
run ;
Le premier format transforme du numerique en character
Le deuxieme format transforme du character en character

Je peux faire un datastep pour le premier

Code :
1
2
3
4
DATA mytab1 ; 
SET mytab2 ; 
newvar_char = put(oldvar_num,patatra. -L) ; 
run ;
Le probleme c'est que je ne vois pas comment definir de meme une variable pour le format character to character. Je ne trouve pas la fonction equivalente a "put()" !

Merci d'avance a ceux qui essaieront de m'aider !
dachboden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h28   #2
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 28
Points : 11
Points : 11
J'ajoute que input() permet d'appliquer un format numerique a une variable character.

On a donc en resume :

pour faire du numeric avec du character : input
pour faire du character avec du numeric : put
pour faire du character avec du character : ???
dachboden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h57   #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
Citation:
Envoyé par dachboden Voir le message
pour faire du character avec du character : ???
bah put.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h59   #4
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
pour ton premier message tu dis que sas ne prend pas en compte les valeurs formater ? t'es sûr que ton code est bon?
postes ta proc sql, pour qu'on voie ce qui ne va pas.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 09h59   #5
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 28
Points : 11
Points : 11
Yop ! voila un exemple :

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
DATA work.test1 ; 
input var1$ ; 
cards ;
A 
C 
B
D 
;
run ; 
 
proc format ;
 
value $alphabet
"A","B" ="Debut" 
"C","D" ="Fin" ;
 
run ; 
 
DATA work.test1 ; 
SET work.test1 ; 
var2 = var1 ; 
format var2 $alphabet. ; 
run ; 
 
proc sql ; 
CREATE TABLE work.joint AS
SELECT gauche.*, droite.var2 AS droite_var2 
FROM work.test1 gauche
INNER JOIN work.test1 droite
ON gauche.var2 = droite.var1 ; 
quit ;


Si la jointure se faisait effectivement sur les valeurs formates alors ma table work.joint serait vide ! Or elle ne l'est pas : SAS fait la jointure sur les valeurs en dur, non formates. C'est precisement ce que je veux eviter.
dachboden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h01   #6
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 28
Points : 11
Points : 11
Bon apres verification je me suis enflamme...
Put marche tres bien pour faire du character avec du character....

Code :
1
2
3
4
DATA work.test2 ; 
SET work.test1 ; 
var3 = put(var2, $alphabet. -L) ; 
run ;
Merci s a m !
dachboden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h04   #7
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
c'est normal tu n'as pas applicqué ton format:
essaie ceci.

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
 
 
DATA work.test1 ; 
input var1$ ; 
cards ;
A 
C 
B
D 
;
run ; 
 
proc format ;
 
value $alphabet
"A","B" ="Debut" 
"C","D" ="Fin" ;
 
run ; 
 
DATA work.test1 ; 
SET work.test1 ; 
var2 = put(var1,$alphabet.) ; 
*format var2 $alphabet. ; 
run ; 
 
 
 
 
proc sql ; 
CREATE TABLE work.joint AS
SELECT gauche.*, droite.var2 AS droite_var2 
FROM work.test1 gauche
INNER JOIN work.test1 droite
ON gauche.var2 = droite.var1 ; 
quit ;
ce que t'as fais au début ne gère que l'affichage et non pas les données stockées.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h05   #8
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
très bien
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h06   #9
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 28
Points : 11
Points : 11
Et en fait si on veut faire une jointure sur la valeur formate il suffit de mettre le put direct dans la proc sql :

Code :
1
2
3
4
5
6
7
8
 
proc sql ; 
CREATE TABLE work.joint AS
SELECT gauche.*, droite.var2 AS droite_var2 
FROM work.test1 gauche
INNER JOIN work.test1 droite
ON gauche.var2 = put(droite.var1, $alphabet.)  ; 
quit ;
et la ma table est bien vide !

Autant pour moi donc...
dachboden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h15   #10
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
oui si tu veux garder les valeurs initiales de ta variable sans les altérées.
s_a_m 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 16h02.


 
 
 
 
Partenaires

Hébergement Web