p
u
b
l
i
c
i
t
é
publicité

Discussion: Faire un tri

  1. #1
    Invité de passage
    Inscrit en
    mai 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mai 2007
    Messages : 3
    Points : 1
    Points
    1

    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 Expert

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

    Informations forums :
    Inscription : mars 2010
    Messages : 491
    Points : 1 220
    Points
    1 220

    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

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 167
    Points : 15 029
    Points
    15 029

    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 Outils pour C & C++
    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 XML
    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