Faire des jointures de tables avec la PROC SQL

Le langage SQL (Structured Query Language) est un langage de définition, de manipulation et de contrôle des données au sein d'une base de données.
On parle souvent à tort et à travers de bases de données. Le principe en est d'élaborer un système de tables reliées entre elles et organisées de manière à éviter au maximum la redondance d'informations et à faciliter la manipulation de données parfois très volumineuses.

SAS n'est pas un système de gestion de bases de données. En particulier, les tables de données sous SAS n'ont aucun lien entre elles. Mais bien qu'il n'y ait pas à proprement parler de bases de données sous SAS, il peut être pratique de recourir au langage SQL dès que l'on traite des données appartenant à des tables différentes.

La PROC SQL permet d'écrire des requêtes SQL sur des tables SAS. Il existe un outil "presse-bouton" qui permet de faire du SQL sans douleur : SAS Query.

Le langage SQL est très riche, on propose ici de n'aborder que la syntaxe de requêtes simples.

Une PROC SQL n'a pas besoin de RUN; pour fonctionner. Par contre, on doit ajouter un QUIT; à la fin.


Fusions contrôlées et jointures

Reprenons l'exemple de fusion de deux tables abordé dans la partie Etape data, paragraphe Concaténation et fusion de tables.

Le programme de fusion contrôlée :

PROC SORT data=a; BY nom;
PROC SORT data=b; BY nom;
DATA ab;
  MERGE a (rename=(note=note_a)) b (rename=(note=note_b));
  BY nom;
RUN;

Peut être remplacé par le programme SQL suivant :

PROC SQL;
  CREATE TABLE ab AS
    SELECT a.nom,a.note as note_a,b.note as note_b
    FROM a FULL JOIN b
    ON a.nom=b.nom;
QUIT;

Traduction du programme SQL :

Je crée une table qui a pour nom ab, comme étant le résultat de la requête suivante :
Je sélectionne les variables : nom provenant de a, note provenant de a (que j'appelle note_a), note provenant de b (que j'appelle note_b)
A partir des tables a et b dont je fais une jointure complète
Cette jointure portant sur la condition que le nom provenant de a égale le nom provenant de b.


Les différents types de jointure en SQL :

Exemple de jointure interne :

Supposons que dans notre fusion précédente on n'ait souhaité conservé que les élèves appartenant à la fois à la table a et à la table b. L'étape DATA s'alourdit d'un test :

DATA ab;
  MERGE a (rename=(note=note_a) in=x) b (rename=(note=note_b) in=y);
  BY nom;
  IF x AND y THEN OUTPUT;
RUN;

Tandis que dans le programme SQL, il suffit de remplacer FULL JOIN par INNER JOIN :

PROC SQL;
  CREATE TABLE ab AS
    SELECT a.nom,a.note as note_a,b.note as note_b
    FROM a INNER JOIN b
    ON a.nom=b.nom;
QUIT;

Quelques bonnes raisons de préférer SQL à MERGE


Un autre exemple d'utilisation de la PROC SQL

Supposons que l'on dispose de la table langues suivante :

table langues
nomlangue
tataanglais
tataallemand
tataespagnol
titiallemand
totoanglais
totoallemand
tutuanglais
tutuespagnol

Et que l'on souhaite avoir la liste des élèves ayant choisi exactement deux langues.

Sans la PROC SQL, il faudrait :

Avec la PROC SQL, on écrit :

PROC SQL;
  CREATE TABLE qui2langues AS
    SELECT DISTINCT nom
    FROM langues
    GROUP BY nom HAVING count(*)=2 ;
QUIT;

Traduction du programme SQL

Je crée une table de nom qui2langues comme étant le résultat de la requête suivante :
Je sélectionne les valeurs distinctes de nom
A partir de la table langues
Je groupe mes observations par nom et ne garde que les noms qui apparaissent 2 fois dans la table.