[Access SQL] Requêtes complexes avec l’assistant QBE (Exercice 1)

Le but des exercices proposés dans cette rubrique est de s’exercer à la construction de requêtes complexes sous Access.
J’essaierais donc de proposer des exercices couvrant le maximum des possibilités offertes par le langage SQL Access, c.-à-d. des jointures internes, externes, des fonctions de regroupement, des filtres, des sous-requêtes, des analyses croisées etc.

Par contre j’aimerais que les solutions aux exercices restent à la portée du débutant.
Le gros code SQL tout rouge et qui tâche est donc proscrit ici tout comme l’usage de fonctions VBA personnalisées.

Seules les solutions obtenues avec l’assistant QBE (Query By Example) d’Access seront retenues.

Exercice 1 :

Il s’agit donc des interventions de membres sur des forums (liste des interventions arrêtée à l’année 2010).
La requête R_final doit retourner le nombre de forums dans lesquels sont intervenus chacun des membres en 2010.

Pour corser l’affaire, nous excluons les membres qui ne sont jamais intervenus (cas du membre n°6 inactif) et ceux dont l’année de la dernière intervention date d’avant 2009 (cas du membre n°4 dont la dernière intervention date de 2008).

Je mets un lien vers la base de départ : Exercice1.zip

Proposition de corrigé

Il faut donc passer par quelques « vues » intermédiaires.

1ère étape : déterminer les membres « actifs » (ceux qui ont au moins une intervention depuis 2009)
On commence par sélectionner les membres qui n’ont pas d’intervention ou dont la date de dernière intervention remonte avant 2009.

On peut maintenant obtenir les membres « actifs » (requête de non-correspondance):


2ème étape : déterminer les forums où sont intervenus les membres au cours de l’année 2010

On sélectionne les couples {membre, forum} sur les interventions de l’année 2010. Comme un membre peut intervenir plusieurs fois dans le même forum, on ne retient que les couples {membre, forum} distincts.


Dernière étape : le comptage des forums parmi les membres actifs

La requête R_Final compte le nombre souhaité de forums :

N’hésitez pas à laisser vos commentaires…

3 réflexions au sujet de « [Access SQL] Requêtes complexes avec l’assistant QBE (Exercice 1) »

  1. Avatar de ClaudeLELOUPClaudeLELOUP

    Merci Fabien,

    Je n’ai pas l’habitude : mon message a été tronqué.
    En fait j’avais « MembresActifs » et « MembreForumEn2010″.
    J’essayais d’écrire « Finale » sans devoir enregistrer les deux premières.
    Mais tu as raison, ça doit être très sale !
    Et, sans doute pas l’endroit.
    Au plaisir de te recroiser.
    Bon weekend

  2. Avatar de f-lebf-leb Auteur de l’article

    Bonjour Claude,

    Merci pour l’intérêt que tu portes à cet exercice mais moi qui essaye de porter le label Q.B.E.O (Query By Example Only <8-) ), c’était évidemment sans compter sur Claude qui préfère venir avec sa propre bouteille de gros SQL qui tâche, mouarf.

    Alors pour déterminer les membres actifs, ça doit donner quelque chose du genre:

    R_MembresActifs:

    SELECT Membre.idMembre, Membre.Prenom, Membre.Nom&nbsp;<br />
    FROM Membre LEFT JOIN&nbsp;<br />
    (&nbsp;<br />
    &nbsp; SELECT Membre.idMembre&nbsp;<br />
    &nbsp; FROM Membre LEFT JOIN Intervention&nbsp;<br />
    &nbsp; ON Membre.idMembre = Intervention.[idMembre]&nbsp;<br />
    &nbsp; GROUP BY Membre.idMembre&nbsp;<br />
    &nbsp; HAVING Max(Year([DateIntervention])) Is Null&nbsp;<br />
    &nbsp;          Or Max(Year([DateIntervention]))&lt;2009&nbsp;<br />
    )  R_MembresSansIntervRecentes&nbsp;<br />
    &nbsp;<br />
    ON Membre.idMembre=R_MembresSansIntervRecentes.idMembre&nbsp;<br />
    WHERE R_MembresSansIntervRecentes.idMembre IS NULL;

    mais je refuse d’aller plus loin, SQL c’est sale ;)

  3. Avatar de ClaudeLELOUPClaudeLELOUP

    Bonjour Fabien,

    Comme tu expliques bien !

    En me servant de ton exemple, j’essaie de construire directement le SQL de la requête finale.

    En suivant le cheminement de ton exemple (très didactique !), j’arrive à ceci :

    MembresActifs :

    SELECT Membre.idMembre, Membre.Prenom, Membre.Nom
    FROM Membre LEFT JOIN [SELECT DISTINCT Membre.idMembre FROM Membre LEFT JOIN Intervention ON Membre.idMembre = Intervention.idMembre GROUP BY Membre.idMembre HAVING (((Max((Year([DateIntervention])))) Is Null Or (Max((Year([DateIntervention]))))

Laisser un commentaire