Bonjour,
J'ai une table principale nommée population que je souhaite joindre avec d'autres tables mentionnées, utilisant comme principaux critères de jointure l'identifiant juridique (identifiant_jur) en premier, ainsi que d'autres variables telles que mois_naissance, annee_naissance ou code_sexe. La majorité des identifiants de population correspondent aux tables via l'identifiant_jur. Cependant, environ la moitié des identifiants ne sont pas trouvés car ils correspondent en joignant par l'identifiant géographique (identifiant_geo).
C'est pourquoi j'avais initialement créé deux requêtes ou macros : la première effectuait la jointure par l'identifiant_jur et d'autres variables d'intérêt, et ensuite, pour la population sans correspondance, que je nommais sans_correspondances, la deuxième macro réalisait la jointure par l'identifiant_geo, trouvant ainsi presque la totalité des identifiants. Comment puis-je réaliser ces deux étapes en une seule requête ou macro, qui effectue d'abord la jointure par l'identifiant_jur et, en cas d'absence de correspondance, utilise la variable identifiant_geo pour tenter la jointure, en plus des variables mois_naissance, annee_naissance et code_sexe?
Ceci, en prenant en compte l'ordre des tables et ces clés de jointures. Ce que je cherche, c'est une seule requête, avec une hiérarchie bien établie qui joigne d'abord par l'identifiant_jur et, s'il n'y a pas de correspondance, essaie ensuite la jointure avec l'identifiant_geo, la condition de hiérarchie n'étant pas l'absence de l'identifiant_jur car la table de population n'est jamais vide ni pour la variable identifiant_jur ni pour identifiant_geo. Ainsi, si la jointure a.identifiant_jur = c.CODE_ETABLISSEMENT ne trouve pas de correspondance, elle passe à l'autre table et tente a.identifiant_geo = u.CODE_GEO, sans oublier les autres conditions de correspondance and a.mois_naissance=b.MOIS_NAISSANCE, and a.annee_naissance=b.ANNEE_NAISSANCE, and a.code_sexe = b.CODE_SEXE, et les clés de jointure des tables.
Pourriez vous m'aider a joindre cette deux requetes en 1 seul requete avec une jointure conditionnelle? if (a.identifiant_jur = c.CODE_ETABLISSEMENT or a.identifiant_geo = u.CODE_GEO) et apres les autres trois condicions de jointure a.mois_naissance=b.MOIS_NAISSANCE, and a.annee_naissance=b.ANNEE_NAISSANCE, and a.code_sexe = b.CODE_SEXE sans oublier que pour passer de la table DONNEES_SEJOUR a la table LOCALISATION_GEO il y a deux cles de jointure c.CODE_ETABLISSEMENT = u.CODE_ETABLISSEMENT /*cle de jointure */
and c.NUM_SEJOUR = u.NUM_SEJOUR /*cle de jointure */.
Merci
%MACRO JOIN_DONNEES_A(annee);
%let an = %substr(&annee,3,2);
proc sql;
%connectora;
create table APP.join_donnees_a_&annee. as select * from
connection to Oracle (select distinct
a.*,
c.CODE_ETABLISSEMENT,
c.NUM_SEJOUR,
c.ID_PATIENT,
c.DATE_DEB_SOIN,
c.DATE_FIN_SOIN,
c.ANNEE_ENTREE,
c.DATE_ENTREE,
c.DATE_SORTIE,
e.DIAG_PRINCIPAL,
e.DIAG_SECONDAIRE,
b.ANNEE_NAISSANCE,
b.MOIS_NAISSANCE,
b.CODE_SEXE,
b.INDICATEUR_DECES,
b.DATE_DECES,
d.CODE_MEDICAMENT,
u.CODE_GEO
from population a
inner join DONNEES_SEJOUR c
on a.identifiant_jur = c.CODE_ETABLISSEMENT
inner join DONNEES_PATIENT b
on c.ID_PATIENT = b.IDENTIFIANT_UNIQUE /*cle de jointure */
and a.mois_naissance=b.MOIS_NAISSANCE
and a.annee_naissance=b.ANNEE_NAISSANCE
and a.code_sexe = b.CODE_SEXE
inner join DIAGNOSTICS e
on c.CODE_ETABLISSEMENT = e.CODE_ETABLISSEMENT /*cle de jointure */
and c.NUM_SEJOUR = e.NUM_SEJOUR /*cle de jointure */
inner join LOCALISATION_GEO u
on c.CODE_ETABLISSEMENT = u.CODE_ETABLISSEMENT /*cle de jointure */
and c.NUM_SEJOUR = u.NUM_SEJOUR /*cle de jointure */
inner join MEDICAMENTS_PATIENT d
on c.ID_PATIENT = d.IDENTIFIANT_UNIQUE /*cle de jointure */
);
disconnect from oracle;
quit; run;
%mend;
%JOIN_DONNEES_A(2019);
Macro
%MACRO JOIN_DONNEES_B(annee);
%let an = %substr(&annee,3,2);
proc sql;
%connectora;
create table APP.join_donnees_a_&annee. as select * from
connection to Oracle (select distinct
a.*,
c.CODE_ETABLISSEMENT,
c.NUM_SEJOUR,
c.ID_PATIENT,
c.DATE_DEB_SOIN,
c.DATE_FIN_SOIN,
c.ANNEE_ENTREE,
c.DATE_ENTREE,
c.DATE_SORTIE,
/* Diagnostics et Médicaments commentés */
b.ANNEE_NAISSANCE,
b.MOIS_NAISSANCE,
b.CODE_SEXE,
b.INDICATEUR_DECES,
b.DATE_DECES,
u.CODE_GEO
from DONNEES_SEJOUR c
inner join LOCALISATION_GEO u
on c.CODE_ETABLISSEMENT = u.CODE_ETABLISSEMENT /*cle de jointure */
and c.NUM_SEJOUR = u.NUM_SEJOUR /*cle de jointure */
inner join sans_correspondances a
on a.identifiant_geo = u.CODE_GEO
inner join DONNEES_PATIENT b
on c.ID_PATIENT = b.IDENTIFIANT_UNIQUE /*cle de jointure */
and a.mois_naissance=b.MOIS_NAISSANCE
and a.annee_naissance=b.ANNEE_NAISSANCE
and a.code_sexe = b.CODE_SEXE
/* Sections Diagnostics et Médicaments commentées */
);
disconnect from oracle;
quit; run;
%mend;
%JOIN_DONNEES_B(2019);
Si j'ai bien compris le problème, il faudrait remplacer les jointures internes par des jointures externes.
select
pop.pop_id, pop.date, ... ,
pop.geo_id,
coalesce(jur.var1, geo.var1) as var1,
coalesce(jur.var2, geo.var2) as var2, ...
from
pop
left join jur on pop.pop_id=jur.id and pop.date=jur.date and ...
left join geo on pop.geo_id=geo.id and pop.date=geo.date and ...;
quit;
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Select SAS Training centers are offering in-person courses. View upcoming courses for: