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

Oracle Discussion :

[9i, débutant] Clause DISTINCT sur un seul champ


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Points : 33
    Points
    33
    Par défaut [9i, débutant] Clause DISTINCT sur un seul champ
    Bonjour,

    Malgré quelques recherches je ne trouve pas la réponse à mon problème.

    Voila le style de requête que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Col1, Col2, Col3 FROM MaTable
    Je voudrais que la clause DISTINCT ne s'applique qu'à la colonne Col1 et que les colonnes suivantes me renvoient les données de la même ligne.


    Exemple, pour une table aet ses trois colonnes :
    • AA BB CC
    • AA DD EE
    • AA FF GG
    • BB HH II
    • BB JJ KK
    • CC LL MM

    la requête devrait me retourner :
    • AA BB CC
    • BB HH II
    • CC LL MM

    et surtout pas :
    • AA DD CC
    • BB JJ II
    • CC LL MM

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    "DISTINCT" fait un simple dédoublonnage de l'ensemble de tes resultats, toi tu voudrait choisir de ne ramener que cetaine lignes de manière à ce qu'il n'y ai qu'une seule occurence de chacunne de tes premières colonne.
    Il faut que tu définisse laquelle choisir (le max de la 2ieme colonne, le min de la 3ieme etc...) et en fonction il faut faire la requête adaptée à ton besoin.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par JYves
    la requête devrait me retourner :
    • AA BB CC

    et surtout pas :
    • AA DD CC
    et pourquoi pas l'inverse? tu tries par quoi?

    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
    17
    18
    19
    20
     
    SQL> with matable as (
      2  select 'AA' col1,'BB' col2,'CC' col3 from dual union all
      3  select 'AA','DD','EE' from dual union all
      4  select 'AA','FF','GG' from dual union all
      5  select 'BB','HH','II' from dual union all
      6  select 'BB','JJ','KK' from dual union all
      7  select 'CC','LL','MM' from dual)
      8  select col1,
      9      max(col2) keep (dense_rank first order by rownum) col2,
     10      max(col3) keep (dense_rank first order by rownum) col3
     11  from matable
     12  group by col1;
    COL1 COL2 COL3
    ---- ---- ----
    AA   BB   CC
    BB   HH   II
    CC   LL   MM
     
    3 rows selected.
    tu peux remplacer rownum par quelque chose de plus censé, si besoin est

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Points : 33
    Points
    33
    Par défaut
    Merci pour vos suggestions.

    Je trie par col1.

    Laurent, ta solution fait appel à des techniques que je ne connais pas, je vais décortiquer tout ça.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    oui, mais quel est ton argument pour choisir <AA;BB;CC> plutôt que <AA;DD;CC> ?

  6. #6
    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
    une "simple" fonction de regroupement sur les colonnes devrait suffire en groupant par col1 mais comme le dit laurentschneider, nous ne connaissons pas le besoin... tu veux appliquer du MIN, MAX ou autre ?

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Fred_D
    une "simple" fonction de regroupement sur les colonnes devrait suffire en groupant par col1 mais comme le dit laurentschneider, nous ne connaissons pas le besoin... tu veux appliquer du MIN, MAX ou autre ?
    un simple max() ne serait cependant pas pareil, car il créerait de nouvelles lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> with matable as (
      2  select 'AA' col1,'BB' col2,'CC' col3 from dual union all
      3  select 'AA','CC','BB' from dual)
      4  select col1, max(col2), max(col3)
      5  from matable
      6  group by col1;
    CO MA MA
    -- -- --
    AA CC CC

  8. #8
    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
    Ha oui... en effet

    PS : max de la concaténation alors

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par laurentschneider
    oui, mais quel est ton argument pour choisir <AA;BB;CC> plutôt que <AA;DD;CC> ?
    critère alphabétique sur la seconde colonne, puis la troisième

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    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
    17
    18
     
    SQL> with matable as (
      2   select 'AA' col1,'BB' col2,'CC' col3 from dual union all
      3   select 'AA','DD','EE' from dual union all
      4   select 'AA','FF','GG' from dual union all
      5   select 'BB','HH','II' from dual union all
      6   select 'BB','JJ','KK' from dual union all
      7   select 'CC','LL','MM' from dual)
      8   select col1,
      9        max(col2) keep (dense_rank first order by col2,col3) col2,
     10        max(col3) keep (dense_rank first order by col2,col3) col3
     11   from matable
     12  group by col1;
    CO CO CO
    -- -- --
    AA BB CC
    BB HH II
    CC LL MM

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Fred_D
    PS : max de la concaténation alors

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Points : 33
    Points
    33
    Par défaut
    Merci à vous, ça marche nickel. J'ai adapté et testé dans mon programme.

    Je ne connaissais pas toutes ces possibilités, il faut dire que j'utilise le + souvent SQL Server 2000. Va falloir que je regarde un peu la dernière version pour laquelle ces fonctions sont disponibles

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

Discussions similaires

  1. DISTINCT sur un seul champ
    Par justinedr71 dans le forum Développement
    Réponses: 6
    Dernier message: 06/07/2010, 13h27
  2. clause distinct sur un champ
    Par van-bom dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/08/2008, 00h55
  3. Utilisation de Distinct sur un seul champ!
    Par Bils dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/11/2007, 09h31
  4. Distinct sur un seul champ...
    Par Noodles dans le forum Langage SQL
    Réponses: 16
    Dernier message: 04/01/2005, 09h36
  5. [Débutant] DISTINCT sur une seule des colonnes ?
    Par Neilos dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/06/2004, 23h04

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