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: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

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
  • 456 views
  • 0 likes
  • 2 in conversation