1. #1
    Membre du Club
    Inscrit en
    juin 2010
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 266
    Points : 60
    Points
    60

    Par défaut Afficher les doublons dans une requête

    Bonjour,

    Je recherche donc un moyen d'afficher dans un select la présence de doublons.

    Tout ce que j'ai pu trouver sur internet est une requête du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT   COUNT(*) AS nbr_doublon, champ1, champ2, champ3
    FROM     table
    GROUP BY champ1, champ2, champ3
    HAVING   COUNT(*) > 1
    qui m'affiche uniquement les lignes en doublons alors que ce que je recherche est l'affichage d'un indicateur (ex: ajout d'une colonne "doublons" avec valeurs "O" ou "N") permettant ensuite de faire un filtre dans un export Excel.

    Je précise que la recherche des doublons porterait sur un identifiant unique (siret).

    Est-ce que quelqu'un aurait une idée sur la conception de cette requête ?

    Merci.
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Toad 10.1.0.7

  2. #2
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 640
    Points : 8 213
    Points
    8 213
    Billets dans le blog
    1

    Par défaut

    Vous pouvez procéder ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select col1
         , col2
         , case when exists
               (select 1
                from ma_table as Sub
                where sub.col1=tab.col1
                  and sub.col2=tab.col2
                  and sub.id<>tab.id
                 ) then 'D'
                else ' '
                end as Doub
    From ma_table as tab
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select tab.col1
         , tab.col2
         , sub.nbr
    From ma_table as tab
       , (select col1, col2, count(*) as nbr
          from ma_table as sub
          where sub.col1=tab.col1
            and sub.col2=tab.col2
          group by col1, col2) as sub

  3. #3
    Membre du Club
    Inscrit en
    juin 2010
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 266
    Points : 60
    Points
    60

    Par défaut

    Merci pour la réponse.
    Je dois dire que les 2 propositions m'ont l'air compliquées (je n'ai que des notions de sql...) mais j'ai quand même tenté la 2éme avec cette version:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select SIRET,
    NOM, 
    sub.nbr
    From SOCIETES as tab, 
    (select SIRET, NOM, count(*) as nbr
    from SOCIETES as sub
    where sub.SIRET = SIRET,
    and sub.NOM = NOM
    group by SIRET, NOM) as sub
    ;
    et cela me sort l'erreur suivante: ORA-00933: la commande SQL ne se termine pas correctement pour le as de cette partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    From MORPE.FDALTARES_FINAL as tab,
    Si j'enlève le as tab, cela me provoque alors une autre erreur...
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Toad 10.1.0.7

  4. #4
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 640
    Points : 8 213
    Points
    8 213
    Billets dans le blog
    1

    Par défaut

    Pour la solution 2 il faut faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select tab.col1
         , tab.col2
         , sub.nbr
    From ma_table as tab
    inner join 
         (select col1, col2, count(*) as nbr
          from ma_table 
          group by col1, col2) as sub
       on sub.col1=tab.col1
      and sub.col2=tab.col2

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 732
    Points : 23 827
    Points
    23 827

    Par défaut

    Si tu travailles avec Oracle, enlève le mot clé AS dans la définition des alias de la clause FROM.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre du Club
    Inscrit en
    juin 2010
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 266
    Points : 60
    Points
    60

    Par défaut

    Après vérification du fichier Excel que je souhaite fournir en export, il se trouve que l'affichage d'un indicateur doublon ne soit finalement pas ce qu'il faudrait (désolé au passage pour le dérangement inutile).

    Il me faudrait plutôt un système de compteur pour éviter d'exclure par filtre excel tous les siret présentant un doublon:

    Ce que je souhaite éviter:

    SIRET ID DOUBLON
    01234567891234 012345 O
    01234567891234 234567 O
    01234567891234 234767 O
    23456789012345 789456 N
    34567890123456 258946 N


    Ce que je voudrais:
    SIRET ID COMPTEUR
    01234567891234 012345 1
    01234567891234 234567 2
    01234567891234 234767 3
    23456789012345 789456 1
    34567890123456 258946 1

    Ce qui me permettrait, en filtrant ensuite sur le compteur = 1, d'obtenir tous les sirets de manière unique.

    Est-ce que la requête proposée au début de la discussion peut-être réutilisée pour y intégrer ce système de compteur ou faut-il repartir sur une autre complètement différente ?
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Toad 10.1.0.7

  7. #7
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 640
    Points : 8 213
    Points
    8 213
    Billets dans le blog
    1

    Par défaut

    Utilisez ma requete publiée hier à 11h09 du coup, et sans les mots clefs AS

  8. #8
    Membre du Club
    Inscrit en
    juin 2010
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 266
    Points : 60
    Points
    60

    Par défaut

    Merci pour la réponse rapide.

    Alors j'ai refait ma requête de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select SIRET, NOM
    From SOCIETES, 
    (select SIRET, NOM, count(*)
    from TABLE1, SOCIETES
    where TABLE1.ID1 = SIRET
    group by SIRET, NOM)
    ;
    Je ne rencontre plus d'erreur mais par contre, je n'ai pas de colonne de compteur en référence à la colonne SIRET qui apparaît.
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Toad 10.1.0.7

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 679
    Points : 16 514
    Points
    16 514

    Par défaut

    Elles sont bien compliquées vos propositions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select SIRET, NOM
         , row_number() over(partition by SIRET order by NOM asc) as compteur
      From SOCIETES;

  10. #10
    Membre du Club
    Inscrit en
    juin 2010
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 266
    Points : 60
    Points
    60

    Par défaut

    Parfait, ça fonctionne très bien !
    Merci quand même aux autres pour m'avoir répondu, même pour des versions plus compliquées...

    Dernière subtilité, j'essaye (en vain) de remplacer les chiffres de ma nouvelle colonne "compteur" par :

    -1 = N
    -<> 1 = O

    par un système de case when then... mais cela ne fonctionne bien évidemment pas !

    J'y arrive quand mon select ne contient rien de spécial mais avec l'ajout du row_number..., je n'arrive pas à trouver la bonne syntaxe pour le placer.
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Toad 10.1.0.7

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 679
    Points : 16 514
    Points
    16 514

    Par défaut

    Vous êtes sur la bonne piste avec le case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select SIRET, NOM
         , row_number() over(partition by SIRET order by NOM asc) as compteur
         , case row_number() over(partition by SIRET order by NOM asc) when 1 then 'N' else 'O' end as doublon
      From SOCIETES;

  12. #12
    Membre du Club
    Inscrit en
    juin 2010
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 266
    Points : 60
    Points
    60

    Par défaut

    J'essayais absolument de caser le case dans la parenthèse...

    Merci beaucoup en tout cas !
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Toad 10.1.0.7

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

Discussions similaires

  1. Eviter les doublons dans une requête.
    Par Smint dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/03/2017, 16h17
  2. Interdire les doublons dans une requête
    Par Gorane dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 06/11/2011, 13h32
  3. [AC-2003] Numéroter les doublons dans une requête en utilisant une fonction VBA
    Par maldan dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/09/2009, 16h46
  4. Réponses: 1
    Dernier message: 23/09/2009, 15h38
  5. Réponses: 2
    Dernier message: 21/04/2009, 21h10

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