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 :

[Teradata] Affichage doublons selon critère


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 53
    Points : 34
    Points
    34
    Par défaut [Teradata] Affichage doublons selon critère
    Bonjour à tous,

    Je cherche une syntaxe SQL qui permet d'identier les valeurs d'un champs selon un critère.

    Le champs 1 corresponds à des matricules, le champs 2 possède 3 valeurs distinctes 0, 1 ou vide. Je cherche à identifier les matricules dont le champs 2 est égal à 0 et 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select count (*) as nbr, champs1, champs2
    from T1
    group by 2,3
    order by 2
    having count(*) >=1 and (champs2='1' or champs2='0')
    Cette requête compte tout les résultats de la table, je vois bien quel matricule possède la valeur 0 et 1, mais aussi ceux possèdant uniquement la valeur 0, 1 ou vide.

    Je souhaite donc conserver uniquement les matricules pour lesquels la valeur du champs2 est égal à 0 et 1.

    Résultat de la requête :
    1 0002415 1
    1 0002415 0
    13 0002434 0
    14 0002469 0

    Résultat souhaité :
    1 0002415 1
    13 0002415 0

    je suis tout ouïe

    Bon week end à tous

  2. #2
    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
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select champs1
        from T1
       where champs2 in ('0', '1')
    group by champs1
      having count(distinct champs2) = 2;

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Si je comprends bien, il s'agit d'identifier les matricules qui possèdent à la fois des champs2=0 et des champs2=1 ?

    Auquel cas, on peut faire ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  DISTINCT matricule
    FROM    matable as main
    WHERE  exists
         (select 1 from matable as sub1
          where  sub1.matricule = main.matricule 
              and sub1.champs2=0)
       AND exists
         (select 1 from matable as sub2
          where  sub2.matricule = main.matricule 
              and sub2.champs2=1)

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    en syntaxe teratada, moi je ferais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *    
    from T1
       where champs2 in (''0, '1')
    qualify count(*) over (partition by champs1) = 2

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Je viens de prendre connaissance de vos réponses et effectivement ces différentes syntaxes fonctionnent !

    En fait un nouveau filtre vient compliquer la requête. Cette dernière doit être filtré selon la date (disons champs3) en respectant cette règle:

    Pour les matricules (champs1) disposant à la fois des valeurs 0 et 1 (champs2), je voudrais effectuer un tri supplémentaire de tel sorte que

    Date du champs3 (avec champs2=1) > date du champs3 (avec champs2=0).

    Escartefigue en suivant ta requête j'avais pensé à un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  DISTINCT matricule
    FROM    matable as main
    WHERE  exists
         (select 1 from matable as sub1
          where  sub1.matricule = main.matricule 
              and sub1.champs2=0)
       AND exists
         (select 1 from matable as sub2
          where  sub2.matricule = main.matricule 
              and sub2.champs2=1) 
    and sub2.champs3 > sub1.champs3
    Je sais j'abuse un peu... Merci d'avance

    Bien à vous

  6. #6
    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
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      select champs1
        from T1
       where champs2 in ('0', '1')
    group by champs1
      having count(distinct champs2) = 2
         and max(case champs2 when '1' then champs3 end)
           > max(case champs2 when '0' then champs3 end);

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Mes respects Waldar ça fonctionne parfaitement. J'ignorais qu'on pouvait comparer 2 CASE.

    Dans ta solution je vois que tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (case champs2 when '1' then champs3 end)
    Cela fonctionne également comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (case when champs 2='1' then champs3 end)
    Une subtilité technique ou juste une différence d'écriture ?

    Merci encore

  8. #8
    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
    C'est l'une des deux syntaxes du CASE en SQL.

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

Discussions similaires

  1. [Teradata] Suppression doublons selon critères
    Par nubed dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 12/05/2015, 17h37
  2. doublons selon critères
    Par azzouzze dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/09/2007, 09h43
  3. Affichage d'un sous formulaire selon critère
    Par setegue dans le forum IHM
    Réponses: 11
    Dernier message: 15/02/2007, 18h42
  4. affichage des champs selon critère dans un formulaire
    Par emmablue dans le forum Access
    Réponses: 5
    Dernier message: 31/07/2006, 09h39

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