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 :

Utilisation de DISTINCT [AC-2016]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut Utilisation de DISTINCT
    Bonjour,

    J'ai actuellement un formulaire qui permet de saisir quelques informations à propos du vermifuge administrés à un animal et une zone de liste qui ordonne cela sous forme d'historique.

    Nom : 2.PNG
Affichages : 307
Taille : 10,5 Ko

    Le numéro d'identification est propre à chaque animal et donc si je sélectionne un autre animal, j'ai accès à son historique à lui en fonction de son numéro d'identification.

    A présent, je souhaiterais crée dans un autre formulaire une zone de liste qui extrait toutes les informations de ma table, comme ceci :

    Nom : 4.PNG
Affichages : 271
Taille : 6,4 Ko

    Néanmoins, je souhaiterais dans cette zone de liste ne pas retrouver l'intégralité des vermifuges administrés pour chaque animal, seulement le dernier.

    Par exemple, par rapport à ma précédente capture, il ne faudrait retrouver que ces deux enregistrements :
    N°Iidentification : 123
    TypeVermifuge : Test2
    DateFin : 27/07/2018

    Et

    N°Identification : 1234
    TypeVermifuge : BBB
    DateFin : 26/07/2018

    En faisant quelques recherches, je suis tombé sur la requête DISTINCT, mais celle ci semble être un peu complexe et je n'y arrive pas. Pourriez vous m'aidez ?

    J'ai quelques pistes de codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim strSQL As String
    strSQL = "SELECT DISTINCT Chien_Vermifuge.N°Identification FROM Chien_Vermifuge;"
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Chien_Vermifuge.N°Identification
    FROM Chien_Vermifuge
    ORDER BY Chien_Vermifuge.N°Identification
    Néanmoins, lorsque je les applique, rien ne se passe...

    D'avance, merci pour vos réponses.

  2. #2
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Salut,
    Vos 2 tbl Chien et Vermifuge sont-elles liées ?
    Avez-vous créé un form (Chien) et un sform (Vermifuge) pour répertorier par chien l'ensemble des vermifuges prescrits ?
    Pourquoi avoir un btn de commande Ajout traitement ?
    Et pour votre liste déroulante vous pouvez utiliser last() ou max()
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Bonjour et merci pour votre réponse.

    Vos 2 tbl Chien et Vermifuge sont-elles liées ?

    Avez-vous créé un form (Chien) et un sform (Vermifuge) pour répertorier par chien l'ensemble des vermifuges prescrits ?

    Pourquoi avoir un btn de commande Ajout traitement ?
    J'ai un formulaire "Recherche_Chien" qui me permet de rechercher en fonction de certains critères un animal. Une fois ma recherche effectué, je double clique sur l'animal et j'arrive sur un formulaire contenant les informations basiques concernant cet animal.

    Puis, j'ai plusieurs boutons, dont l'un me redirige vers le formulaire "Chien_Vermifuge" (cf. capture d'écran de mon 1er message) qui me permet d'ajouter un nouveau vermifuge ou bien de consulter l'historique des vermifuges concernant cet animal.

    Ainsi, l'ensemble des vermifuges concernant l'ensemble des animaux est répertorié dans la table "Chien_Vermifuge" et le formulaire "Chien_Vermifuge" permet d'ajouter les vermifuges et également de répertorier tous ceux administrés pour un animal en particulier.

    Et pour votre liste déroulante vous pouvez utiliser last() ou max()
    Pouvez vous détaillez ?

  4. #4
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Vous n'indiquez pas combien de tbl vous avez pour traiter l'administration de vermifuge aux chiens.
    C'est un truc comme ci-dessous ?

    Faire un req avec un regroupement sur l'identifiant chien et un last() sur datedébut ou datefin.
    Images attachées Images attachées  
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Vous n'indiquez pas combien de tbl vous avez pour traiter l'administration de vermifuge aux chiens.
    Si :
    l'ensemble des vermifuges concernant l'ensemble des animaux est répertorié dans la table "Chien_Vermifuge" et le formulaire "Chien_Vermifuge" permet d'ajouter les vermifuges et également de répertorier tous ceux administrés pour un animal en particulier.
    Il y a une table et un formulaire qui me permette de traiter l'administration des vermifuges.

    J'ai un formulaire "Chien_IP" qui contient différentes informations sur l'animal. Lorsque j'ouvre celui ci pour l'animal "A" par exemple, j'ai donc toutes les informations de l'animal "A".
    J'ai également, depuis le formulaire "Chien_IP" la possibilité de cliquer sur un bouton qui ouvre le formulaire "Chien_Vermifuge" qui permet deux choses :
    - Ajouter un vermifuge pour cet animal
    - Consulter via la zone de liste l'ensemble des vermifuges administrés à cet animal.

    Lorsque j'ajoute un vermifuge, celui ci s'enregistre dans la table "Chien_Vermifuge"

    Faire un req avec un regroupement sur l'identifiant chien et un last() sur datedébut ou datefin.
    Je ne vois toujours pas, qu'est ce que req ? Et qu'est ce que j'indique entre les parenthèses qui suivent last ?

  6. #6
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Un peu de lecture s'impose pour modéliser une bdd, ici.
    Un exemple pour calculer Last()/Dernier() selon le schéma que j'ai réalisé dans le billet précédent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tbl_traitement.idChientT, Last(tbl_traitement.idTraitement) AS DernierTraitement, Last(tbl_traitement.Datefin) AS DerniereDate
    FROM tbl_traitement
    GROUP BY tbl_traitement.idChientT;
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  7. #7
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Un peu de lecture s'impose pour modéliser une bdd, ici.
    Je ne vois pas l'intérêt de cette recommandation.

    Un exemple pour calculer Last()/Dernier() selon le schéma que j'ai réalisé dans le billet précédent.
    Merci. Adapté à ma situation, cela donnerait quelque chose dans ce style là je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim strSQL As String
     
    strSQL = "SELECT Chien_Vermifuge.N°Identification, Last (Chien_Vermifuge.N°) AS DernierTraitement, Last(Chien_Vermifuge.DateFin) AS DernierDate"
    FROM Chien_Vermifuge
    GROUP BY Chien_Vermifuge.N°Identification;"
    Néanmoins, pour la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY Chien_Vermifuge.N°Identification;"
    j'ai une erreur de compilation. Attendu : Fin d'instruction.

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    la syntaxe n'est pas respectée : il manque les caractères de continuation _ et de concaténation & pour la construction de la variable strSQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim strSQL As String
     
    strSQL = "SELECT Chien_Vermifuge.N°Identification, Last(Chien_Vermifuge.N°) AS DernierTraitement, Last(Chien_Vermifuge.DateFin) AS DernierDate " _ &
    " FROM Chien_Vermifuge GROUP BY Chien_Vermifuge.N°Identification;"
    Bien que, dans l'absolu, Last concerne le dernier enregistrement saisi, par forcément le plus grand, Max serait plus logique mais il est plus prudent de l'utiliser avec un seul champ, car plusieurs peut renvoyer des résultats faux.

    En général, j'utilise une sous-requête TOP qui me renvoie la date la plus récente: l'avantage, c'est qu'il suffit de modifier le nombre du TOP pour avoir les n derniers si on souhaite en avoir plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strSQL = "SELECT N°Identification, N° AS DernierTraitement, DateFin AS DernierDate FROM Chien_Vermifuge " _ &
    "WHERE (N°Identification) In (select top 1 N°Identification from (SELECT CV.N°Identification, Max(CV.DateFin) " _ &
    "FROM Chien_Vermifuge CV GROUP BY CV.N°Identification ORDER BY Max(CV.DateFin) DESC));"
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Ah, bonjour tee_grandbois !

    En général, j'utilise une sous-requête TOP qui me renvoie la date la plus récente: l'avantage, c'est qu'il suffit de modifier le nombre du TOP pour avoir les n derniers si on souhaite en avoir plus
    Merci pour cette précision, cela pourrait m'être utile.

    Concernant le code, a présent que celui ci est établi, ou est ce que je l'ajoute afin qu'à l'ouverture du formulaire, le "tri" soit fait ?
    Actuellement sur ce formulaire je n'ai aucune procédure événementielle : est ce là que je dois l'ajouter ?
    Ou bien quelque part ici ?

    Nom : 6.PNG
Affichages : 252
Taille : 8,4 Ko

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    si c'est un formulaire il faut utiliser l'évènement Load pour définir le tri ou plus simplement utiliser la propriété "Tri par" du formulaire.
    Si c'est une liste déroulante c'est bien dans la requête qu'il faut mettre le tri.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Il s'agit d'une liste déroulante, je l'ajoute donc dans la requête, néanmoins, un code est déjà présent (celui qui s'occupe d'allez chercher les informations dans ma table et d'ordonner cela en fonction de la date de fin) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Chien_Vermifuge.N°, Chien_Vermifuge.N°Identification, Chien_Vermifuge.TypeVermifuge, Chien_Vermifuge.DateFin
    FROM Chien_Vermifuge
    ORDER BY Chien_Vermifuge.DateFin
    Pour ajouter votre code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT N°Identification, N° AS DernierTraitement, DateFin AS DernierDate FROM Chien_Vermifuge 
    WHERE (N°Identification) In (select top 1 N°Identification from (SELECT CV.N°Identification, Max(CV.DateFin) 
    FROM Chien_Vermifuge CV GROUP BY CV.N°Identification ORDER BY Max(CV.DateFin) DESC));
    Que faut-il que je fasse ? Combiner les deux ?

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    il suffit d'insérer le WHERE de mon code entre le SELECT FROM et le ORDER BY du tien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Chien_Vermifuge.N°, Chien_Vermifuge.N°Identification, Chien_Vermifuge.TypeVermifuge, Chien_Vermifuge.DateFin
    FROM Chien_Vermifuge
    WHERE (N°Identification) In (select top 1 N°Identification from (SELECT CV.N°Identification, Max(CV.DateFin) 
    FROM Chien_Vermifuge CV GROUP BY CV.N°Identification ORDER BY Max(CV.DateFin) DESC))
    ORDER BY Chien_Vermifuge.DateFin;
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  13. #13
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    il suffit d'insérer le WHERE de mon code entre le SELECT FROM et le ORDER BY du tien:
    D'accord, c'est fait. Sauf que cela ne trie visiblement pas comme je le souhaiterais :

    Nom : 8.PNG
Affichages : 226
Taille : 4,1 Ko

    Or, j'ai ces informations dans ma table :

    Nom : 9.PNG
Affichages : 213
Taille : 8,5 Ko

    Le vermifuge du 07/07/2018 ne devrait pas s'afficher, tandis que le vermifuge du 26/07/2018 du N°Identification 1234 devrait.

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    oups ! désolé je me suis emmêlé les touches du clavier, le TOP n'est pas nécessaire ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Chien_Vermifuge.N°, Chien_Vermifuge.N°Identification, Chien_Vermifuge.TypeVermifuge, Chien_Vermifuge.DateFin
    FROM Chien_Vermifuge
    WHERE (Chien_Vermifuge.DateFin) In (select DF from (SELECT CV.N°Identification, Max(CV.DateFin) as DF
    FROM Chien_Vermifuge CV GROUP BY CV.N°Identification ORDER BY Max(CV.DateFin) DESC)) 
    AND (Chien_Vermifuge.[N°Identification]) In (select N°Identification from (SELECT CV.N°Identification, Max(CV.DateFin) 
    FROM Chien_Vermifuge CV GROUP BY CV.N°Identification ORDER BY Max(CV.DateFin) DESC))
    ORDER BY Chien_Vermifuge.DateFin DESC;
    il faut prendre le Max de date fin pour chaque N° identification
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  15. #15
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Aucun soucis, c'est tout bon, cela fonctionne !
    Un grand merci pour votre aide

    PS : Cette fois ci je n'oublie pas de mettre la discussion en résolu ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de DISTINCT ou pas ?
    Par passpartout007 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/12/2010, 01h19
  2. Utilisation de Distinct sur un seul champ!
    Par Bils dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/11/2007, 09h31
  3. [SQL] Utilisation de distinct
    Par toddy_101 dans le forum PHP & Base de données
    Réponses: 29
    Dernier message: 03/01/2007, 16h52
  4. Utilisation de Distinct
    Par qwert33 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 23/06/2006, 09h54
  5. Utilisation de DISTINCT
    Par vanmouniren dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/12/2005, 12h16

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