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

SQL Oracle Discussion :

Probléme Group By "pseudo" hiérarchique


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Probléme Group By "pseudo" hiérarchique
    Bonjour,

    J’ai une table du style :

    IDEnt NOM FONCTION
    ---------------------------------------
    1 ' Dupuis ' Signataire
    1 ' Daturt ' Décisionnaire
    1 ' Nobel ' (Null)
    2 ' Karl ' Décisionnaire
    2 ' Titi ' (Null)
    3 ' Girofle ' (Null)
    3 ' Cardigan ' (Null)

    Je veux sortir les personnes les plus "importante" selon une hiérarchie pré établie (Signataire>Décisionnaire>(Null))
    Donc le résultat attendu est :

    IDEnt NOM FONCTION
    ---------------------------------------
    1 ' Dupuis ' Signataire
    2 ' Karl ' Décisionnaire
    3 ' Cardigan ' (Null)

    Pour le 3éme, la personne sélectionner importe peu.

    Je travaille sous Oracle avec des droit extrêmement limiter, je ne peux faire que des SELECT (et ça c'est ch****).

    J'ai bien une solution de contournement mais elle est extrêmement moche et ne me satisfait pas :
    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
     (
    SELECT "IDEnt", max (NOM), max(FONCTION)
    FROM table
    WHERE FONCTION='Signataire'
    GROUP BY "IDEnt"
    )
    UNION
    (
    SELECT "IDEnt", max (NOM), max(FONCTION)
    FROM table
    WHERE FONCTION='Décisionnaire'
    AND "IDEnt" not in (SELECT "IDEnt" FROM table WHERE FONCTION='Signataire')
    GROUP BY "ID Ent"
    )
    UNION
    (
    SELECT "IDEnt", max (NOM), max(FONCTION)
    FROM table
    WHERE FONCTION='Décisionnaire'
    AND "IDEnt" not in (SELECT "IDEnt" FROM table WHERE FONCTION in ('Signataire','Décisionnaire'))
    GROUP BY "ID Ent"
    );
    Bref c'est moche et lourd, avez-vous une solution plus propre à me proposer?


    P.S: Par avance, dsl pour les fautes, je suis une catastrophe en Français

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous pouvez faire comme ceci :

    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
     
    WITH CTE AS (
        SELECT 
          IDEnt,
          NOM,
          FONCTION ,
           ROW_NUMBER() OVER(
              PARTITION BY IDEnt
              ORDER BY 
                CASE FONCTION
                  WHEN 'Signataire' THEN 1
                  WHEN 'Décisionnaire' THEN 2
                  ELSE 3
                END
            ) AS Rn    
       FROM LaTable
      )
    SELECT 
          IDEnt,
          NOM,
          FONCTION
    FROM CTE
    WHERE Rn = 1

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    J'ai posé la question sur un site anglophone en paralléle , ils m'ont donné cette requête qui marche très bien.
    Merci à toi, aieeeuuuuu , de m'avoir répondu. Je Cloture le sujet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    I would approach this using analytic functions:
    select t.Id, t.Name, t.Function
    from (select t.*,
                 row_number() over (partition by id
                                    order by (case when function = 'Signatory' then 1
                                                   when function = 'Decision Maker' then 2
                                                   else 3
                                              end)
                                   ) as seqnum
          from table t
         ) t
    where seqnum = 1;

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

Discussions similaires

  1. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 12h47

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