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 :

Faire un tri


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Faire un tri
    Bonjour

    Je suis débutant en oracle et je suis confronté à un soucis.
    Je vous explique mon problème :
    J'ai en base :
    AGE  VILLE REGION NOM  PRENOM SEXE
    ---- ----- ------ ---- ------ ----
      12 LENS      62 Jim  Jam    H   
      13 LENS      62 Jim  Jam    H   
    null LENS      62 John Doe    H   
      13 LENS      62 Jane Maj    F   
    Mon objectif est d'avoir pour un couple unique ville<>région le nom et le prénom dont l'age est le plus grand
    Pour l'exemple il faudrait ramener la 2nd ligne ( age 13 ) et la 4 ème.
    Hors une 2ème condition vient s'ajouter : si il existe 2 entrées pour le champs SEXE, on sélectionne l'entrée dont la valeur est H.


    J'imaginais créer une contrainte primary key sur ville et région mais mon sgbd refuse et je ne pense pas que ce soit la bonne méthode.
    J'ai alors imaginé des requêtes pour gérer ce scénario sauf que je bute sur la gestion de la contrainte couple ville région.
    Mon objectif est de selectionner seulement cette ligne :
    AGE  VILLE REGION NOM  PRENOM SEXE
    ---- ----- ------ ---- ------ ----
      13 LENS      62 Jim  Jam    H   
    Je suis sur oracle 11g.
    Merci d'avance !

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    drop table t_ville purge;
     
    create table t_ville (age number, ville varchar2(10), region number, nom varchar2(10), prenom varchar2(10), sexe varchar2(1));
     
    insert into t_ville values (12,  'LENS', 62, 'Jim','Jam','H');
    insert into t_ville values (13,  'LENS', 62, 'Jim','Jam','H');
    insert into t_ville values (null,'LENS', 62, 'John','Doe','H');
    insert into t_ville values (13,  'LENS', 62, 'Jane','Maj','F');
    commit;
    solution 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select
              min(nom) keep (dense_rank first order by age desc nulls last, sexe desc) nom 
            , min(prenom) keep (dense_rank first order by age desc nulls last, sexe desc) prenom 
            , ville                                                      
            , region
            , min(age) keep (dense_rank first  order by age desc nulls last, sexe desc) age
            , min(sexe) keep (dense_rank first order by age desc nulls last, sexe desc) sexe
        from   t_ville
        group by
              ville
            , region
        ;
    solution 2:
    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
    21
    22
    23
    24
     
    select 
         age
        ,nom
        ,prenom
        ,ville
        ,region
        ,sexe
    from
        (select 
              a.*
             ,dense_rank() over(partition by ville, region order by age desc nulls last, sexe desc) rank
         from
             (select
                     age
                    ,nom
                    ,prenom
                    ,ville
                    ,region
                    ,sexe
              from t_ville
              ) a
          ) a
     where a.rank = 1;
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  3. #3
    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
    Citation Envoyé par JeromeTheH Voir le message
    J'imaginais créer une contrainte primary key sur ville et région mais mon sgbd refuse et je ne pense pas que ce soit la bonne méthode.
    Je ne vois pas bien le lien entre une requête que vous essayez d'écrire et le positionnement d'une contrainte.
    Cette dernière donne des règles aux données que vous insérez dans une table.
    Votre besoin n'a rien à voir, vous avez déjà des données mais vous voulez seulement en sélectionner certaines.

    Je le ferai ainsi :
    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
    With MaTable as
    (
    select   12 as age, 'LENS' as ville, 62 as region, 'Jim' as nom, 'Jam' as prenom, 'H' as sexe from dual union all
    select   13       , 'LENS'         , 62          , 'Jim'       , 'Jam'          , 'H'         from dual union all  
    select null       , 'LENS'         , 62          , 'John'      , 'Doe'          , 'H'         from dual union all
    select   13       , 'LENS'         , 62          , 'Jane'      , 'Maj'          , 'F'         from dual
    )
      ,  sr as
    (
    select age, ville, region, nom, prenom, sexe
         , row_number() over(partition by ville, region order by age desc nulls last, sexe desc) as rn
      from MaTable
    )
    select age, ville, region, nom, prenom, sexe
      from sr
     where rn = 1;
     
    AGE  VILLE REGION NOM  PRENOM SEXE
    ---- ----- ------ ---- ------ ----  
      13 LENS      62 Jim  Jam    H

    @Mohamed.Houri, on peut raccourcir légèrement votre première solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT max(age)                                                                    as age
           , ville                                                      
           , region
           , min(nom)    keep (dense_rank first ORDER BY age DESC nulls last, sexe DESC) as nom 
           , min(prenom) keep (dense_rank first ORDER BY age DESC nulls last, sexe DESC) as prenom 
           , max(sexe)   keep (dense_rank first ORDER BY age DESC nulls last, sexe DESC) as sexe
        FROM t_ville
    GROUP BY ville
           , region;

Discussions similaires

  1. déclaratiion des dossiersen c et faire le tri de ces dossiers
    Par Le Lion dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 30/06/2006, 17h06
  2. [VBA-E]Faire un tri sans activer la feuille
    Par Lahax dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/05/2006, 12h05
  3. [XPATH] XPath dû mal de faire le tri des API
    Par tralloc dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 27/04/2006, 00h07
  4. Faire un tri avant un group by
    Par Igarpoor dans le forum Requêtes
    Réponses: 10
    Dernier message: 17/03/2006, 15h27
  5. Comment faire le tri d'un array of array ?
    Par Tchouffy dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2005, 20h55

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