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 :

[Oracle 8i] ne garder que certains enregistrements (COUNT ?)


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut [Oracle 8i] ne garder que certains enregistrements (COUNT ?)
    J'ai une requête, qui renvoit des enregistrements sous cette forme :

    Champ 1 Champ2
    1 53
    1 54
    2 100
    3 110

    J'aimerais ne ramener que ceux dont le Champ1
    a plus d'une occurence, soit ici :

    1 53
    1 54

    Comment faire cela ?

    Merci d'avance !

    Delphim

  2. #2
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut ma requête
    Voilà ma requête :

    select DISTINCT(adhe_no_adher) adhe_no_adher, adhe_cod_cons, adhe_cod_agen
    from adhesions

    Elle retourne plus d'enregistrements que la suivante, parce qu'il y a ades adhe_cod_cons et des adhe_cod_agen différents

    select DISTINCT(adhe_no_adher)
    from adhesions

    J'aimerai avoir le différentiel.

  3. #3
    Membre habitué Avatar de nantais
    Inscrit en
    Juillet 2004
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 158
    Points : 192
    Points
    192
    Par défaut
    Salut,

    tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT champ1, champ2
    FROM ta_table
    GROUP BY champ1
    HAVING (count(champ1)>1)

  4. #4
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Bonjour,
    rectification du code du Nantais qui est faux (manque le champ2 dans le group by)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select champ1, champ2
    from ta_table
    where champ1 in 
    (select champ1 from ta_table
     GROUP BY champ1 
    HAVING (count(champ1)>1)
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  5. #5
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT champ1, champ2
    FROM ta_table
    GROUP BY champ1
    HAVING (count(champ1)>1)
    Ca ne marche pas parce que je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT(champ1), champ2
    FROM ta_table
    GROUP BY champ1, champ2
    HAVING (count(champ1)>1)
    Et que la requête ne fait pas le HAVING (count(champ1)>1) sur le nombre d'enregistrements ramenés par la requête, mais sur tous les enregistrements de la table.

    Ex :

    données de ma table :

    Champ 1 Champ 2
    1 50
    1 50
    1 51
    2 100
    2 100

    Données ramenées par la requête :

    Champ 1 Champ 2
    1 50
    1 51
    2 100
    2 100

    Dans ce cas, je ne voudrais ramener que les enregistrements "1", pas les "2". Car la différence porte sur le Champ2.

  6. #6
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    ceci devrait marcher :

    select champ1, champ2
    from ta_table
    where champ1 in
    (select champ1 from ta_table
    GROUP BY champ1
    HAVING (count(champ2)>1)

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT(champ1), champ2
    FROM ta_table t1
    WHERE EXISTS ( SELECT 1 FROM ta_table t2 
                              WHERE t1.champ1 = t2.champ1
                                  AND t1.rowid != t2.rowid)
    tu sélectionnes les lignes de ta table pour lesquelles il existe au moins une autre ligne avec un champ1 identique

    edit : finalement, je suis pas certain d'avoir bien saisi la subtilité de la demande

  8. #8
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Tu peux aussi faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select 
       substr(x, 1, instr(x, ',')-1) champ1, 
       substr(x, instr(x, ',')+1) champ2
    from
       (
          select   min(champ1 || ',' || champ2) x
          from     TEST
          group by champ1
          having count(*) > 1
       )
    Afin de ne garder qu'une ligne quand il y a plusieurs lignes pour un même champ1 (avantage : pas de jointure et pas de in, du bien bourrain quand même...)


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  9. #9
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Pour TheRussian :
    que ce soit count(champ2) ou count(champ1), le résultat sera le même si les champs sont renseignés.
    Il me semble que ma requête doit fonctionner sinon il faudrait m'expliquer ce qui est faux !
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  10. #10
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut
    Ca ne marche pas :

    J'ai plus d'enregistrements dans la table T2, que dans la table T1.

    Mon but est de faire le différentiel entre la table T1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT(adhe_no_adher)
    FROM ADHESIONS T1
    et la table T2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT(adhe_no_adher) adhe_no_adher, adhe_cod_cons, adhe_cod_agen FROM ADHESIONS T2
    Sachant que la différence est sur les champs adhe_cod_cons et adhe_cod_agen, ce qui fait que j'ai des lignes en plus sur ma requête T2...

  11. #11
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut
    J'ai peut-être trouvé, grâce à votre aide :

    Cette requête me permet, je pense, d'avoir le différentiel entre 2 requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT(adhe_no_adher), adhe_cod_cons, adhe_cod_agen
    FROM adhesions t1
    WHERE EXISTS
    (
    SELECT DISTINCT(ADHE_NO_ADHER) FROM adhesions t2
    WHERE t1.adhe_no_adher = t2.adhe_no_adher
    and ((t1.adhe_cod_cons <> t2.adhe_cod_cons) OR (t1.adhe_cod_agen <> t2.adhe_cod_agen))
    )

  12. #12
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par lper
    Pour TheRussian :
    que ce soit count(champ2) ou count(champ1), le résultat sera le même si les champs sont renseignés.
    Il me semble que ma requête doit fonctionner sinon il faudrait m'expliquer ce qui est faux !
    Autant pour moi. Je viens de tester c'est exactement la même chose.
    Je n'avais jamais fait comme ca.

    Désolé.

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    delphim veut tu bien repréciser le contenu de la table, les différents résultats obtenus avec les requêtes proposées et finalement le résultat que tu veux et que représente ce résultat en français

    PS : merci de penser au balise code, j'en ai marre d'éditer tes messages.

  14. #14
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut explications
    Cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT(adhe_no_adher), adhe_cod_cons, adhe_cod_agen
    FROM adhesions t1
    WHERE EXISTS
    (
    SELECT DISTINCT(ADHE_NO_ADHER) FROM adhesions t2
    WHERE t1.adhe_no_adher = t2.adhe_no_adher
    and ((t1.adhe_cod_cons <> t2.adhe_cod_cons) OR (t1.adhe_cod_agen <> t2.adhe_cod_agen))
    )
    Me permet d'avoir tous les enregistrements de ma requête sur l'adhésion t1, pour lesquels il existe des codes conseillers (adhe_cod_cons) ou des codes agents (adhe_cod_agen) différents pour un même numéro d'adhérent (adhe_no_adher)


    En clair sur un exemple :
    adhe_no_adher adhe_cod_cons adhe_cod_agen

    1 50 100
    1 55 100
    1 50 101

    2 50 100
    3 50 101

    Ce qui m'intéresse, c'est les différences, pour un même adhérent, entre les champs adhe_cod_cons et adhe_cod_agen, ici je ne veux récupérer que les 3 premiers enregistrements.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/12/2013, 19h50
  2. [RegEx] Ne garder que certaines phrases avec preg_match_all
    Par bigs3232 dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2011, 22h27
  3. Réponses: 8
    Dernier message: 15/06/2009, 13h36
  4. condition: ne garder que certains alpha-numerique
    Par bibi5883 dans le forum Débuter
    Réponses: 8
    Dernier message: 12/09/2007, 16h30
  5. Undo / Redo. Peut-on enregistrer que certaines actions ?
    Par Peewee dans le forum Général Java
    Réponses: 2
    Dernier message: 03/04/2006, 11h33

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