BookmarkSubscribeRSS Feed
agdato
Calcite | Level 5

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);

1 REPLY 1
PGStats
Opal | Level 21

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;
PG

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 1 reply
  • 395 views
  • 0 likes
  • 2 in conversation