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 09/04/2008, 11h41   #1
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Par défaut Equivalent Jointure Access -SAS

Bonjour,

J'ai un peu de mal à transformer des jointures du Type RIGHT JOIN ou LEFT JOIN de Access en SAS à travers des Merge ...if...

Exemple:

3 tables: T1 T2 T3 variables communes num

version Access

((T1 RIGHT JOIN T2 on num ) LEFT JOIN T3 on num)

version sas

data T_temporaire
merge T1 (in=a)
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h42   #2
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Bonjour,
A l'aide de la PROC SQL tu peux executer ton code SQL sur SAS.
Fafabzh
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h45   #3
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
Bonjour,

SAS reconnaît la norme SQL ANSI

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
DATA t1;
input a b;
cards;
1 2
2 6
3 4
5 6
4 8
;
run;
DATA t2;
input a c;
cards;
1 2
3 4
5 6
;
run;
proc sql;
CREATE TABLE fus AS
SELECT *
FROM t1 AS t1 LEFT JOIN t2 AS t2
ON t1.a = t2.a;
quit;
tu peux tester directement ton code.
Cordialement.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h49   #4
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Merci,

En fait je crois que ce message n'était pas entier oups
mais je commence à saisir ce que vous dites!
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h52   #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
Bonjour,

Par défaut SAS fait une jointure EXTERNE (tout A, tout B et le commun des deux).

Pour faire une jointure, il faut une clé de jointure ;-)

l'option in= met un flag virtuel sur la table (0 ou 1) 0 si la clé n'est pas présente et 1 si la clé est présente.

Jointure à gauche : je prend toute la table_a et ce qui est commun entre a et b
Code :
1
2
3
4
5
6
 
DATA jointure;
   merge table_a(IN=a) table_b(IN=b);
   BY cle;
   IF a;
run;
Jointure à droite:
Code :
1
2
3
4
5
6
 
DATA jointure;
   merge table_a(IN=a) table_b(IN=b);
   BY cle;
   IF b;
run;
jointure interne : commun au deux
Code :
1
2
3
4
5
6
 
DATA jointure;
   merge table_a(IN=a) table_b(IN=b);
   BY cle;
   IF a AND b;
run;
Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h52   #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
ton code marche si tu le mets dans une proc sql?
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h05   #7
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Je suis bien d'accord avec la solution de steelspirit sauf qu'avec SAS et ACCESS au final j'ai pas le même nombre de ligne.

Pour la proc SQL ca marche pour 1 jointure, peut on faire 2 à la suite.

J'ai un peu de mal à transformer des jointures du Type RIGHT JOIN ou LEFT JOIN de Access en SAS à travers des Merge ...if...

Exemple:

3 tables: T1 T2 T3, variable commune: num

version Access

((T1 RIGHT JOIN T2 on num ) LEFT JOIN T3 on num)

version sas souhaité
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA T_temporaire
merge T1 (IN=a)
T2 (IN= b)
IF ?
BY num
run;
 
DATA T_final
merge T_temporaire (IN=a)
T3 (IN= b)
IF ?
BY num
run;
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h14   #8
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
"a righth join b" veut dire que tu gardes les élèments qui se trouve dans la table b.

equivalent en merge
data fus; merge a(in=e) b(in=u);
by toto;
if u;
run;
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
44
 
DATA t1;
input a b;
cards;
1 2
2 6
3 4
5 6
4 8
;
run;
DATA t2;
input a c;
cards;
1 2
3 4
5 6
;
run;
DATA t3;
input a c;
cards;
1 2
3 4
;
run;
proc sort DATA=t1; BY a;run;
proc sort DATA=t2; BY a;run;
proc sort DATA=t3; BY a;run;
proc sql;
CREATE TABLE fus1_sql AS
SELECT *
FROM t1 AS t1 RIGHT JOIN t2 AS t2
ON t1.a = t2.a;
quit;
DATA fus1_merge; merge t1(IN=t1) t2(IN=t2);
BY a;
IF t2;
run;
proc sort DATA=fus1_merge; BY a;run;
DATA fus2_merge; merge fus1_merge(IN=f1) t3(IN=t3);
BY a;
IF f1;
run;
bahraoui 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 15h16.


 
 
 
 
Partenaires

Hébergement Web