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;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.