Nous allons utiliser dans ce TP une base de données classique, Gymnase2000. Cette base de données concernent des sportifs, des sports et des gymnases. Un sportif peut jouer, arbitrer et/ou entraîner un ou plusieurs sports (ou aucun). Dans un gymnase, il peut y avoir une ou plusieurs séances d’un sport, avec un entraîneur spécifié.
Vous pouvez accéder aux tables de cette base de données via l’utilisation d’une librairie sous SAS. Le code ci-dessous permettra d’utiliser les tables avec le formalisme gym.nom_table.
libname gym '/courses/dee4fb65ba27fe300/Gymnase2000';
Dans les questions suivantes, vous allez être amener à trier les tables pour effectuer les jointures. Puisque vous n’avez pas les droits de modifications sur ces tables et surtout pour éviter que nous travaillions tous sur les mêmes tables, il vous faut les copier dans un répertoire à vous (soit dans la librairie work temporaire, soit dans une autre librairie précédemment créée). Pour effectuer cette copie, vous pouvez utiliser le code ci-dessous, qui copie le contenu de la librairie gym pour le mettre dans la librairie work.
proc copy out = work in = gym;
run;
Nous allons ici stocker les résultats des demandes dans une table. Si vous souhaitez afficher le contenu de celle-ci, vous pouvez ajouter le code suivant :
proc print data = ex1;
run;
data ex1;
    set Sportifs;
    if (age >= 20 and age <= 30) then output;
    keep idSportif Nom Prenom;
run;
* ou ;
data ex1;
    set Sportifs;
    where age between 20 and 30;
    keep idSportif Nom Prenom;
run;
* ou ;
data ex1;
    set Sportifs (where= (age between 20 and 30));
    keep idSportif Nom Prenom;
run;
* voire ;
data ex1;
    set Sportifs (where= (age between 20 and 30) keep= age idSportif Nom Prenom);
    drop age;
run;
* a. jointure entre Gymnases et Séances ;
proc sort data = Gymnases; by idGymnase;
proc sort data = Seances; by idGymnase;
data ex2a;
    merge Gymnases (in=A) Seances (in=B);
    by idGymnase;
    if (A & B);
    if (Jour = "dimanche") then output;
    keep NomGymnase Ville;
run;
* b. suppression des doublons dans les résultats ;
proc sort data = ex2a nodupkey; by Ville NomGymnase;
run;
data ex3a;
    set Sportifs (where= (Nom = "KERVADEC"));
    rename idSportifConseiller=idSp;
    keep idSportifConseiller;
run;
* b. jointure entre cette table et Sportifs (pour le conseiller) ;
proc sort data = ex3a; by idSp;
proc sort data = Sportifs; by idSportif;
data ex3b;
    merge 
        ex3a (in=A) 
        Sportifs (in=B rename= (idSportif=idSp));
    by idSp;
    if (A & B);
    keep Nom Prenom;
run;
* a. jointure des tables Seances, Sports (pour connaître les séances de Hand ball) ;
proc sort data = Seances; by idSport;
proc sort data = Sports; by idSport;
data ex4a;
    merge Seances (in=A) Sports (in=B where= (Libelle = "Hand ball")); by idSport;
    if (A & B);
run;
* b. jointure du résultat avec Gymnase (pour avoir les informations des gymnases) ;
proc sort data = ex4a; by idGymnase;
proc sort data = Gymnases; by idGymnase;
data ex4b;
    merge ex4a (in=A) Gymnases (in=B);
    if (A & B);
    keep NomGymnase Ville Jour Horaire;
run;
* c. affichage amélioré ;
proc sort data = ex4b; by Ville NomGymnase Jour Horaire;
proc print data = ex4b;
    id Ville NomGymnase;
    by Ville;
    var Jour Horaire;
run;
* a. calcul de la superficie minimale des gymnases ;
proc summary data = Gymnases;
    var Surface;
    output out = ex5a min=minSurface;
run;
* b. jointure des deux, avec répétition de la valeur minimale obtenue précédemment ;
data ex5b;
    retain min;
    merge Gymnases ex5a;
    if (minSurface ^= .) then min = minSurface;
    if (Surface = min) then output;
    keep NomGymnase Ville;
run;