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 19/04/2011, 11h59   #1
Invité régulier
 
Homme Damien Guiavarch
Étudiant
Inscription : avril 2011
Messages : 19
Détails du profil
Informations personnelles :
Nom : Homme Damien Guiavarch
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Conseil

Informations forums :
Inscription : avril 2011
Messages : 19
Points : 8
Points : 8
Par défaut Jointure avec boucle

Bonjour,

J'ai 500 bases de données avec des noms incrémentés et plusieurs autres indépendantes.
Je souhaiterais les joindre en un seul fichier.
Chaque base de données contient un identifiant pays.

J'ai trié toutes les bases de données avant la jointure

Code :
1
2
3
4
5
6
7
8
 
        do num = 1 TO 20 ;
 
	DATA work.Donnees_macro;
	merge work.base_&num (IN = a) Base_brevets (IN = c);
	BY code;
	IF a OR c ;
	run;
J'ai essayé le code ci-dessus mais il me garde que la dernière base de données joint.

Est ce que quelqu'un aurait un idée?

Merci
damien29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 12h40   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Salut,
Je te propose ce code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
/* paramètre num=nombre de tables indexées notamment 500*/
 
%MACRO JOINTURE(num=);
 
DATA work.Donnees_macro; 
	MERGE %DO j=1 %TO &num.; work.base_&j.(IN=a) Base_brevets(IN=c) %END;;
	BY code;
	IF a OR c;
RUN;
 
%MEND;
 
%JOINTURE(num=500);
Bon courage!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 12h56   #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
Je crois qu'il faut mettre (in=a&j) puis if a&j or c;
Code :
1
2
3
work.base_&j.(IN=a&j.)....;
BY code;
IF a&j OR c;
Espèrent que damien29 a bien trié toutes tables avec la clé de jointure qui est code ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 13h23   #4
Invité régulier
 
Homme Damien Guiavarch
Étudiant
Inscription : avril 2011
Messages : 19
Détails du profil
Informations personnelles :
Nom : Homme Damien Guiavarch
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Conseil

Informations forums :
Inscription : avril 2011
Messages : 19
Points : 8
Points : 8
Merci beaucoup cela marche très bien
damien29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 13h24   #5
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
@ sam:

J'ai testé le code en remplaçant le OR par AND mais ça ne donne pas le résultat attendu.

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
DATA work.base_1;
input code Y;
cards;
1 78
2 98
3 98
;
run;
DATA work.base_2;
input code Y2;
cards;
1 783
2 986
3 989
;
run;
DATA work.Base_brevets;
input code Y3;
cards;
1 7
2 9
3 9
4 3
;
run;
 
/* paramètre num=nombre de tables indexées notamment 500*/
 
%MACRO JOINTURE(num=);
 
DATA work.Donnees_macro; 
	MERGE %DO j=1 %TO &num.; work.base_&j.(IN=a&j.) Base_brevets(IN=c) %END;;
	BY code;
	IF a&j AND c ;
RUN;
 
%MEND;
 
%JOINTURE(num=2);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 14h57   #6
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 t'as raison et c'est normal, car il fallait inclure le by et le if dans la jointure:

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 work.base_1;
	input code Y;
	cards;
1 78
2 98
3 98
;
run;
 
DATA work.base_2;
	input code Y2;
	cards;
1 783
2 986
3 989
;
run;
 
DATA work.Base_brevets;
	input code Y3;
	cards;
1 7
2 9
3 9
4 3
;
run;
 
/* paramètre num=nombre de tables indexées notamment 500*/
%MACRO JOINTURE(num=);
 
	DATA work.Donnees_macro;
		%DO j=1 %TO &num.;
			MERGE work.base_&j.(IN=a&j.) work.Base_brevets(IN=c);
			BY code;
 
			IF a&j. AND c;
		%end;
	RUN;
 
%MEND;
 
%JOINTURE(num=2);
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h01   #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
Pour damien29, il faut utiliser, mais apparemment il a solutionné son problème
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

Code :
1234567891011121314151617
/* paramètre num=nombre de tables indexées notamment 500*/
 
%MACRO JOINTURE(num=);
 
DATA work.Donnees_macro; 
%DO j=1 %TO &num.; 
 
	MERGE work.base_&j.(IN=a&j.) Base_brevets(IN=c);
	BY code;
 
	IF a&j. OR c;
 %END;
RUN;
 
%MEND;
 
%JOINTURE(num=500);
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h11   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bien sur qu'il ya le BY Sam, excuses moi si je t'ai reveillé
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h15   #9
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 MEGAMIND2 Voir le message
Bien sur qu'il ya le BY Sam, excuses moi si je t'ai reveillé
=====> Presque .
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h16   #10
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par s_a_m Voir le message
=====> Presque .
Soit tu reprends ta sièste, soit tu vas à la machine à potin
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h19   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Citation:
Envoyé par MEGAMIND2 Voir le message
@ sam:

J'ai testé le code en remplaçant le OR par AND mais ça ne donne pas le résultat attendu.

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
DATA work.base_1;
input code Y;
cards;
1 78
2 98
3 98
;
run;
DATA work.base_2;
input code Y2;
cards;
1 783
2 986
3 989
;
run;
DATA work.Base_brevets;
input code Y3;
cards;
1 7
2 9
3 9
4 3
;
run;
 
/* paramètre num=nombre de tables indexées notamment 500*/
 
%MACRO JOINTURE(num=);
 
DATA work.Donnees_macro; 
	MERGE %DO j=1 %TO &num.; work.base_&j.(IN=a&j.) Base_brevets(IN=c) %END;;
	BY code;
	IF a&j AND c ;
RUN;
 
%MEND;
 
%JOINTURE(num=2);
Bonjour,
Dans l'exemple ci-dessus, seul deux tables contribuent dans la jointure, la table base_brevets et la base_&j tels que &j égal à num.
Il me semble qu'il manque une boucle après le IF pour que toutes les tables contribuent dans la jointure.
Cordialement
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h43   #12
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
J'ai testé avec la boucle mais sans succès. La solution la plus facile est de générer une table SAS à partir d'un fichier Excel contenant le nom de toutes les tables, générer une deuxième colonne: table1(in=a1) table2(in=2),...,table500(in=a500) ainsi qu'une troisième colonne: a1 or a2, ..., or a500 puis stocker tout ça dans 2 macros liste puis les appeler (pas besoin de faire une boucle), mais c'est pas sexy!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h47   #13
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
tu ne peux pas automatiser ce genre de traitement (créer un fichier excel avec 500 lignes...) si le nombre de tables change, tu fais comment?
il faut faire attention à la longueur d'une macro variables...
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h58   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
C'est pour ça que j'ai dit que c'est pas sexy
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h00   #15
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Citation:
Envoyé par MEGAMIND2 Voir le message
J'ai testé avec la boucle mais sans succès. La solution la plus facile est de générer une table SAS à partir d'un fichier Excel contenant le nom de toutes les tables, générer une deuxième colonne: table1(in=a1) table2(in=2),...,table500(in=a500) ainsi qu'une troisième colonne: a1 or a2, ..., or a500 puis stocker tout ça dans 2 macros liste puis les appeler (pas besoin de faire une boucle), mais c'est pas sexy!
tu dis que la boucle ne marhce pas, pourquoi?
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h03   #16
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
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
DATA work.base_1;
input code Y;
cards;
1 78
2 98
3 98
;
run;
DATA work.base_2;
input code Y2;
cards;
1 783
2 986
3 989
;
run;
DATA work.Base_brevets;
input code Y3;
cards;
1 7
2 9
3 9
4 3
;
run;
 
/* paramètre num=nombre de tables indexées notamment 500*/
 OPTION mprint;
%MACRO JOINTURE(num=);
 
DATA work.Donnees_macro; 
	MERGE %DO j=1 %TO &num.; work.base_&j.(IN=a&j.)%END; Base_brevets(IN=c) ;
	BY code;
	IF %DO j=1 %TO &num.; a&j AND %end;  c ;
RUN;
 
%MEND;
 
%JOINTURE(num=2);
j'ai modifié un peu ton code
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h07   #17
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
Excusez moi,
mais je crois qu'il faut inclure le by code dans la boucle.
@megamed: t'as testé ma solution ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h13   #18
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
@Sam: Désolé Sam, j'avais pas compris, ça marche nickel!!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h17   #19
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 MEGAMIND2 Voir le message
@Sam: Désolé Sam, j'avais pas compris, ça marche nickel!!
je peux retourner à ma sièste.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h18   #20
Invité régulier
 
Homme Damien Guiavarch
Étudiant
Inscription : avril 2011
Messages : 19
Détails du profil
Informations personnelles :
Nom : Homme Damien Guiavarch
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Conseil

Informations forums :
Inscription : avril 2011
Messages : 19
Points : 8
Points : 8
J'avais pas vu qu'il me manqué des lignes.

Encore merci
damien29 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 06h36.


 
 
 
 
Partenaires

Hébergement Web