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

Langage SQL Discussion :

Afficher les doublons dans une requête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    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.
    Microsoft SQL Server Management Studio v17.9.1

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 125
    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 : 10 125
    Points : 38 506
    Points
    38 506
    Billets dans le blog
    9
    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 régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    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...
    Microsoft SQL Server Management Studio v17.9.1

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 125
    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 : 10 125
    Points : 38 506
    Points
    38 506
    Billets dans le blog
    9
    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
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 776
    Points
    30 776
    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 régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    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 ?
    Microsoft SQL Server Management Studio v17.9.1

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 125
    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 : 10 125
    Points : 38 506
    Points
    38 506
    Billets dans le blog
    9
    Par défaut
    Utilisez ma requete publiée hier à 11h09 du coup, et sans les mots clefs AS

  8. #8
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    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.
    Microsoft SQL Server Management Studio v17.9.1

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    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 régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    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.
    Microsoft SQL Server Management Studio v17.9.1

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    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 régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut
    J'essayais absolument de caser le case dans la parenthèse...

    Merci beaucoup en tout cas !
    Microsoft SQL Server Management Studio v17.9.1

+ 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