IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Faire un SELECT en utilisant MAX sur une colonne et DISTINCT sur une autre pour obtenir une liste sans doublon


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : bibliothécaire

    Informations forums :
    Inscription : Mars 2017
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Faire un SELECT en utilisant MAX sur une colonne et DISTINCT sur une autre pour obtenir une liste sans doublon
    Bonjour,

    J’ai une base de données Access d’auteurs de laquelle j’aimerais extraire une liste.
    La base contient environ 5000 enregistrements.

    Cette base contient un enregistrement pour chaque contribution d’un auteur à un article. Si un auteur a contribué 20 fois depuis 15 ans, la base de données contient 20 enregistrement pour cet auteur.

    La liste que je cherche à obtenir devrait contenir :
    - Une seule fiche pour un auteur donné (pas de doublon de prénom + nom)
    - Cette fiche devrait être celle qui contient le nombre le plus élevé dans le champ numéro.
    - Il doit y avoir quelque chose dans le champ adresse.
    - La liste doit être classée par nom d’auteur.
    - La liste ne doit afficher que les champs :
    NO
    PRENOM
    NOM1
    NOM2
    ADR
    ADR 2
    VILLE
    CODE
    AUTRE
    COURRIEL
    TEL
    TEL2

    Je ne suis pas très familier avec le SQL d’Access et j’ai fait plusieurs tentatives, mais sans succès, pour obtenir ma liste.
    Est-ce qu’une âme charitable aurait une idée de la requête qui permettrait d’obtenir le résultat recherché.

    Merci beaucoup.

    La base de données possède une seule table dont voici la structure.

    Nom du champ Type de données
    NO Texte
    Au besoin Texte
    DATE Date/Heure
    TITRE Texte
    PRENOM Texte
    NOM1 Texte
    NOM2 Texte
    ADR Texte
    ADR 2 Texte
    VILLE Texte
    AUTRE Texte
    CODE Texte
    CHEQ Monétaire
    BONS Monétaire
    REMERCIER Oui/Non
    ABON Oui/Non
    VOIR DIVERS Oui/Non
    RUBRIQUES Texte
    TITARTICLE Texte
    MOTS-CLÉ Mémo
    PAGE Texte
    COURRIEL Texte
    TEL Texte
    TEL2 Texte
    NO BON Texte
    DIVERS Mémo
    MoisAn Texte

    Exemples de fiches :

    NO PRENOM NOM1 NOM2 ADR ADR 2 VILLE CODE AUTRE COURRIEL TEL TEL2
    799 Sylvain Bouchard 422, rue des Oiseaux Laval H7M 3P8 xxxxxATxxx.ca 777-7777
    787 Guy Bélanger 37, rue de Mey Mascouche J7P 4T9 yyyyyATyyy.com 111-1111
    768 Paul Bouchard 678, Jean-Rottot Saint-Viateur H8M 3T5 aaaaaATaaa.ca 222-2222 514-666-6666
    787 Sylvain Bouchard xxxxxATxxx.ca 777-7777
    799 Pierre Béland 545, Gande-Côte Boisbriand J8T 9L1 belanAThotmail.ca
    769 Guy Bélanger 37, rue de Mey Mascouche J7P 4T9 yyyyyATyyy.com 111-1111
    796 Roland Masson 453, rue Saint-Denis Montréal H2P 1S8 massonxxATxxx.ca 333-3333
    785 Paul Bouchard 452, Saint-Joseph Saint-Viateur H8M 3T5 aaaaaATaaa.ca 222-2222 514-666-6666
    787 Steph Lajoie 234, rue Latour Saint-Jérôme J8R 2P3 axxxATbil.ca
    794 Steph Lajoie Saint-Jérôme J8R 2P3 laxxxATbil.ca
    800 Pierre Béland Boisbriand J8T 9L1 belanAThotmail.ca

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Avec une seule requête, cela me paraît difficile mais avec une série c'est possible.

    1. Requête qui donne la liste des auteurs, au cas où un n'aurait aucune adresse.

      reqAuteur

      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      select Nz(tblContribution.Nom1, "") as Nom1, Nz(tblContribution.Nom2, "") as Nom2, Nz(tblContribution.Prenom, "") as Prenom
      from tblContribution
      group by tblContribution.Nom1, tblContribution.Nom2, tblContribution.Prenom
      order by tblContribution.Nom, tblContribution.Nom2, tblContribution.Prenom
    2. Requête qui trouve la contribution avec le numéro le plus élevé

      reqContributionNoMax
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      select Nz(tblContribution.Nom1, "") as Nom1, Nz(tblContribution.Nom2, "") as Nom2, Nz(tblContribution.Prenom, "") as Prenom, Max(tblContribution.[No]) as [No]
      from tblContribution
      where tblContribution.Adr is not null or tblContribution.Adr2 is not null or tblContribution.Ville is not null or tblContribution.Code is not null
      group by tblContribution.Nom1, tblContribution.Nom2, tblContribution.Prenom
      order by tblContribution.Nom, tblContribution.Nom2, tblContribution.Prenom
    3. Requête d'affichage

      reqFiche :
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      select reqContributionNoMax.[No], reqAuteur.*, reqContributionNoMax.ADR, reqContributionNoMax.ADR 2, reqContributionNoMax.VILLE, reqContributionNoMax.CODE, reqContributionNoMax.AUTRE, reqContributionNoMax.COURRIEL, reqContributionNoMax.TEL, reqContributionNoMax.TEL2
      from reqAuteur left join reqContributionNoMax on 
      reqAuteur.Nom1=reqContributionNoMax.Nom1, reqAuteur.Nom2=reqContributionNoMax.Nom2, reqAuteur.Prenom=reqContributionNoMax.Prenom


    Bon ça c'était la méthode "douce".

    Une méthode plus "brutale" est possible si tu es sur que chaque auteur a au moins une contribution avec une adresse.
    1. Il faut créer une table (tblFiche) avec un champ No, Nom1, Nom2, Prenom.
    2. Définir un index unique composé de Nom1, Nom2 et Prenom.
    3. Puis faire une requête qui liste les contributions avec adresse dans l'ordre croissant de Nom1, Nom2 et prénom et décroissant des No (reqContribution).
    4. Et ensuite de créer une requête d'ajout (reqRemplirFiche) à la table tblFiche à partir de reqContribution.
    5. Quand tu exécutes reqRemplirtFiche, Access t'averti qu'il y a des doublons. Si tu confirmes l'exécution, tous les doublons sont rejetés et il ne reste dans tblFiche que ceux avec le numéro maximum.


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    bibliothécaire
    Inscrit en
    Mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : bibliothécaire

    Informations forums :
    Inscription : Mars 2017
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup, marot_r, pour ta généreuse réponse.

    Je suis en train de travailler avec tes requêtes.
    Je n'y suis pas encore mais ta contribution m'aide grandement.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo