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 :

Identifier des doublons sur plusieurs champs. [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut Identifier des doublons sur plusieurs champs.
    Bonjour le forum,

    A dire vrai, j'imagine que mon problème a déjà été traité, mais je pense que je n'ai pas trouvé la bonne formule pour trouver la solution dans les archives. Pardon d'avance si c'est une redite.

    J'ai une table "tbl_Prix" qui se compose entre autres des champs suivants:
    - CodeClient
    - Agence
    - Article
    - QteMini
    Si ces quatre champs sont égaux, c'est qu'il y a un doublon.
    Je ne peux pas me servir de l'index pour éliminer ces enregistrements puisqu'il faut que j'utilise des tests logiques sur d'autres champs pour trouver ceux que je dois éliminer, et ceux que je dois garder.

    Comme vous vous en doutez, je cherche à identifier ces doublons. J'ai bien essayé un:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT *
    FROM   tbl_Prix T1
    WHERE  EXISTS (SELECT *
                   FROM   tbl_Prix T2
                   WHERE  T1.CodeClient = T2.CodeClient
                     AND  T1.Agence  = T2.Agence
                     AND  T1.Article = T2.Article
                     AND  T1.QteMini = T2.QteMini);

    sans succès puisque je me retrouve avec autant d'enregistrements dans cette requête que dans ma table.

  2. #2
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Hmm j'avance un peu.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT CodeClient, Agence, Article, QteMini 
    FROM   tbl_Prix T1
    WHERE  EXISTS (SELECT CodeClient, Agence, Article, QteMini 
                   FROM   tbl_Prix T2
                   WHERE  T1.CodeClient = T2.CodeClient
                     AND  T1.Agence  = T2.Agence
                     AND  T1.Article = T2.Article
                     AND  T1.QteMini = T2.QteMini
                    GROUP BY CodeClient, Agence, Article, QteMini 
                    HAVING COUNT(*)>1);

    fonctionne bien, mais pas:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT *
    FROM   tbl_Prix T1
    WHERE  EXISTS (SELECT *
                   FROM   tbl_Prix T2
                   WHERE  T1.CodeClient = T2.CodeClient
                     AND  T1.Agence  = T2.Agence
                     AND  T1.Article = T2.Article
                     AND  T1.QteMini = T2.QteMini
                    GROUP BY CodeClient, Agence, Article, QteMini 
                    HAVING COUNT(*)>1);

    Access me dit qu'il est "impossible d'effectuer un regroupement sur les champs sélectionnés avec '*'". Et quand j'écris tous mes champs après SELECT, ma requête est vide. Ca irait peut être mieux si je comprenais bien ce que j'écris.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Pardon mais tu es sous Access? Tu utilise deux tables ou une seule? Il doit me manquer des éléments, parce que je ne comprends pas ce que tu veux faire...

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Ah oui, mon explication n'est peut-être pas facile à comprendre...
    Je suis sous Access 2007, j'ai une table "tbl_prix" qui contient plusieurs dizaines de milliers d'enregistrements d'une quinzaine de champs chacun.
    Ce que je souhaite, c'est créer une requête me permettant d'identifier les doublons dans cette table (peut-être que le mot est mal choisi?).
    Deux lignes sont des doublons quand leurs champs CodeClient, Agence, Article, QteMini sont identiques...

    Edit: Oups, je viens de m'apercevoir que mon post plus haut pouvait prêter à confusion. Je l'ai édité.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Ce qui me dérange c'est la requête que tu utilise. J'ai l'impression que tu utilise deux tables (T1 et T2) et que pour toi un doublon c'est quand tu as les champs de ces deux tables qui sont égaux. Je me répète mais il doit manquer une part d'explication non?

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    J'ai trouvé l'inspiration du code de la requête ici: http://sqlpro.developpez.com/cours/doublons/
    J'avoue que je ne comprends pas encore bien le code, mais il me donne effectivement le résultat voulu, ou presque.

    En mettant ce code de côté, comment est-ce que tu procéderais?

    Comment faire pour partir de ceci:
    CodeClient Agence Article QteMini Contact
    0001 A ABC 1 toto
    0002 B CBA 1 tata
    0001 A ABC 1 tutu


    et arriver à ceci:
    CodeClient Agence Article QteMini Contact
    0001 A ABC 1 toto
    0001 A ABC 1 tutu


    Ah, je n'arrive pas à bien aligner mes données.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    C'est pourtant assez simple et classique. Tu peux passer par l'assistance de requête pour la recherche de doublons ou sinon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tbl_prix.CodeClient, tbl_prix.Agence, tbl_prix.Article, tbl_prix.QteMini, tbl_prix.Contact
    FROM tbl_prix
    GROUP BY tbl_prix.CodeClient, tbl_prix.Agence, tbl_prix.Article, tbl_prix.QteMini, tbl_prix.Contact
    HAVING (((Sum(1))>1))

  8. #8
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Merci pour cette réponse déjà. J'aurais dû marquer que je suis encore débutant, et que je pose des questions faciles.

    Cependant, il y a un problème avec le résultat. La requête retourne un résultat nul. Je suis sûr que c'est parce que le champ "Contact" est différent à chaque fois...
    Ce que je cherche à faire en fait, c'est ramener tous les champs des enregistrements dont les champs "CodeClient", "Agence", "Article", "QteMini" sont égaux, et seulement ces quatre champs.
    Hmm...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    essaie avec cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CodeClient, Agence, Article, QteMini
    FROM tbl_Prix
    GROUP BY CodeClient, Agence, Article, QteMini
    HAVING COUNT(Contact)>1

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Il suffit d'enlever le champ contact:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tbl_prix.CodeClient, tbl_prix.Agence, tbl_prix.Article, tbl_prix.QteMini
    FROM tbl_prix
    GROUP BY tbl_prix.CodeClient, tbl_prix.Agence, tbl_prix.Article, tbl_prix.QteMini
    HAVING (((Sum(1))>1))

  11. #11
    Membre chevronné Avatar de Renardo
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 648
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 648
    Points : 2 019
    Points
    2 019
    Par défaut
    Bonjour
    voici un exemple mais je ne sais pas si tu recherche exactement a faire comme cela
    bonne journée

  12. #12
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Malheureusement, cela ne correspond pas exactement à ce que je cherche à faire.
    Peut-être qu'il faut que je trouve une autre façon de traiter mes données. Ce que j'essaie de faire a l'air un peu alambiqué...

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Qu'es-ce qui ne fonctionne pas concrètement?

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    essaie cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT A.CodeClient,A.Agence, A.Article,A.QteMini,B.Contact
    FROM (SELECT CodeClient, Agence, Article, QteMini FROM Tbl_Prix
     GROUP BY CodeClient, Agence, Article, QteMini HAVING COUNT(Contact)>1) as A 
    INNER JOIN Tbl_Prix as B ON B.CodeClient=A.CodeClient
      AND B.Agence=A.Agence
      AND B.Article=A.Article
      AND B.QteMini=A.QteMini

  15. #15
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Ah génial Ilank! Ta requête me donne le résultat que j'attendais. Maintenant, il faut que je la comprenne et que je l'essaie avec ma table grandeur réelle, avant de marquer ce sujet comme "Résolu".
    Merci!

    Psychopathe, ce qui ne fonctionnait pas correctement, c'est que les requêtes que j'avais écrites ou celles qui m'étaient proposées ici, ne fonctionnaient que si je ne ramenais que les quatre champs CodeClient, Agence, Article, QteMini dans le résultat de ma requête.
    Or je voulais ramener le champ contact également dans tous les cas. Hmm, je ne sais pas comment l'expliquer plus clairement. Désolé.

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Tu voulais les doublons mais avec tous les champs. J'avais pas compris.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/03/2012, 15h19
  2. contrôle des doublons sur plusieurs champs
    Par christy1 dans le forum Modélisation
    Réponses: 3
    Dernier message: 09/12/2011, 14h13
  3. identifier des doublons sur une clé composé
    Par laurentci dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/01/2008, 12h09
  4. Suppression de doublons sur plusieurs champs
    Par riperoutz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2007, 14h23
  5. Reperage de doublon sur plusieur champs
    Par sdblepas dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 18h19

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