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);
... View more