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

Développement SQL Server Discussion :

Eviter les doublons


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 107
    Par défaut Eviter les doublons
    Salut à tous,
    je viens vers pour une petite aide s'il vous plait vu que je suis débutant en SQL server.
    je m'explique : j'ai réussi a extraire des données mais il y a des lignes qui se répètes 2 fois ou plus, je souhaite ne pas afficher toutes ces lignes répétés s'il existe au moins une ligne qui contient le nom ' en cours' sur la colonne ' statut'

    vous trouvez ci-dessous ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select a.CT_Num,
    case when b.AB_No is null then '0' else b.AB_No end as 'AB_No'
    , case AB_Type
    , case when c.CA_Num is null then '' else c.CA_Num end as 'AB_No'
      FROM [dbo].[F_COMPTET] a
    left join [dbo].[F_ABONNEMENT] b on a.CT_Num=b.CT_Num
    left join [dbo].[F_ABOENTETE] c on b.AB_No=c.AB_No
    where CT_Type =0
    order by a.CT_Num
    merci par avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Pour supprimer les doublons de lignes, il suffit d'ajouter DISTINCT après SELECT.
    Mais je crains que ton besoin ne soit pas aussi simple et que tu qualifies de doublons des lignes possédant des informations communes mais pas identiques.
    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.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 107
    Par défaut
    Merci pour ta réactivité. oui je suis d'accord avec toi , mais dans mon cas je ne veux pas afficher toutes les lignes non pas que les doublons à conditions q'au moins une ligne parmi ces lignes répétées doit y avoir dans la colonne DR_Statut cette expression "en cours"

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 447
    Par défaut
    Bonjour,
    Si j'ai bien compris la demande, il faut afficher toutes les lignes dont la colonne "statut" contient "en cours", ou pour lesquelles il n'existe pas de ligne avec les mêmes données et un statut qui contient "en cours".
    Le problème ici est qu'on ne voit pas de colonne "statut".

    Pour ce genre de "problème" je ferai une requête du genre (en imaginant que col1 ne peut pas être null):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with req1 as (
    select col1,col2,col3,statut
    from LaTable as t1
    left outer join AutreTable as t2 on ...
    )
    select distinct req1.* from req1
    left outer join req1 as req2 on req1.col1 = req2.col1 and req1.col2 = req2.col2 and req1.col3 = req2.col3 and req2.statut = 'EnCours'
    where req1.statut = 'EnCours' or req2.col1 is null

    Tatayo

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 107
    Par défaut
    MERCI pour ta réponse ,non c'est pas ça peut être j'ai mal exprimé.
    je m'explique : d’après la base de données je veux lister toutes lignes répétées ( qui ont le même nom sur la colonne A ) ensuite à partir de ces lignes répétées je vérifie la colonne B si elle contient 'en cours' du coup on ne les affiches pas , et si on trouve pas de colonne qui contient 'en cours' on les gardes toutes.
    j’espère que je me suis bien expliqué et désole.

    merci par avance.

  6. #6
    Invité
    Invité(e)
    Par défaut
    comme toujours, au lieu de faire de grandes phrases, un script avec la DDL des tables incriminées et des données de tests ainsi que le résultat attendu simplifient largement la compréhension

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par slakhdine Voir le message
    MERCI pour ta réponse ,non c'est pas ça peut être j'ai mal exprimé.
    je m'explique : d’après la base de données je veux lister toutes lignes répétées ( qui ont le même nom sur la colonne A ) ensuite à partir de ces lignes répétées je vérifie la colonne B si elle contient 'en cours' du coup on ne les affiches pas , et si on trouve pas de colonne qui contient 'en cours' on les gardes toutes.
    j’espère que je me suis bien expliqué et désole.

    merci par avance.
    En termes de row pattern matching cela pourrait se dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    select col1, col2/*, any other col*/, status
    from (
        select col1, col2, statut/*, any other col*/, decode(statut,'en cours',' ',statut) as ostatut from data
    )
    match_recognize (
        partition by col1, col2 -- partition sur la liste des colonnes communes
        order by ostatut -- tri sur une version de statut qui met 'en cours' en premier
        measures statut as status, EC.statut as fstatus
        all rows per match
        pattern(  EC* NN+ )
        define
            EC as statut = 'en cours'
    )
    -- on ne garde que les groupes n'ayant pas de 'en cours'
    where fstatus is null
    et la même logique peut ici se traduire en SQL standard facilement tout en gardant l'avantage de ne scanner la table source qu'une seule fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select  col1, col2/*, any other col*/, statut from (
    select col1, col2/*, any other col*/, statut, max(ostatut) over(partition by col1,col2) as mstatut from (
        select col1, col2/*, any other col*/, statut, decode(statut,'en cours',1) as ostatut from data 
    )
    )
    where mstatut is null;
    (ou count(ostatut) et le test sera mstatut = 0)


    NB
    en complexifiant le pattern on peut même se passer de la "where clause" (et donc plus besoin de EC.status dans le "measures" non plus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        pattern(  ( {- (EC+ EQ+) -} | EQ+) NN* )
        define
            EC as statut = 'en cours', 
            EQ as statut <> 'en cours'

Discussions similaires

  1. Après importation, eviter les doublons
    Par uloaccess dans le forum Access
    Réponses: 6
    Dernier message: 16/11/2005, 16h36
  2. [Débutant][XSLT]Eviter les doublons
    Par leminipouce dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/10/2005, 11h34
  3. hash et Tie , eviter les doublons
    Par bluecurve dans le forum Langage
    Réponses: 5
    Dernier message: 12/10/2005, 16h39
  4. Eviter les doublons
    Par cyrill.gremaud dans le forum ASP
    Réponses: 5
    Dernier message: 14/09/2005, 12h37
  5. [langage] 2 fichier dans 1 en evitant les doublons
    Par remixxl dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 17h05

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