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

DB2 Discussion :

Sql sous DB2: Affecter un rang par valeur


Sujet :

DB2

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 104
    Points : 72
    Points
    72
    Par défaut Sql sous DB2: Affecter un rang par valeur
    Bonjour à tous,

    J'ai extrait cette table avec ce résulat (représenter ci-dessous en excel)

    Nom : Screenshot_2.png
Affichages : 147
Taille : 19,2 Ko

    Cela représente une arborescence de menus.
    MENIKOS appelle 2 programmes SPA...et CPP.. (PROG). Dans CODE se trouve les menus appelés par le menu MENIKOS. Ici GDC.
    GDC appelle 7 programmes et un menu ALRTCONG...etc..

    J'aimerai affecté un rang (dans cet ordre) à MENIKOS =1 , GDC=2 et ALRTCONG=3 pour pouvoir ensuite les trier par N° séquence (SEQ)
    Car dans le menu GDC la SEQ300 se trouve derrière la 700 !!!

    Ça doit être très C_N mai je sèche

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 55
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    je ne suis pas sur de comprendre la demande mais il me semble que cet order by fait l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by case men when 'MENIKOS' then 1 when 'GDC' then 2 when 'ALRTCONG' then 3 end, seq

  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 104
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par vazymimil Voir le message
    Bonjour,

    Le fichier la demande mais il me semble que cet order by fait l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by case men when 'MENIKOS' then 1 when 'GDC' then 2 when 'ALRTCONG' then 3 end, seq
    Je me suis mal exprimé. Le fichier est issu d'un SQL et les valeurs CODE et MEN ne me sont pas connues d'avance, donc le CASE n'est pas possible.
    En fait j'ai créé un fichier temporaire QGPL.RANG sur ce fichier qgpl.menu (celui qui a donné l'excel)
    Je récupère le plus petit numéro de ligne par MEN et donc un rang par MEN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace table  QGPL.RANG as(
     WITH f1 AS (
    SELECT MIN(RRN(qgpl.menu)) AS rang,
           MEN
        FROM qgpl.menu
        GROUP BY men
        ORDER BY rang) select * from f1
        ) with no data ;
    cela me donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1	MENIKOS 
    4      GDC 
    12     ALRTCONG
    Après je fait une simple jointure sur menu trié par rang et N°de séquence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT b.rang,
                    a.*
        FROM qgpl.menu a
             LEFT JOIN qgpl.rang b
                 ON a.men = b.men
        ORDER BY b.rang,
                 a.seq
    et le résultat

    Nom : Screenshot_3.png
Affichages : 116
Taille : 24,3 Ko

    Peut être + simple mais ça marche

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 55
    Points : 75
    Points
    75
    Par défaut
    Alors je propose ça :
    sans_parent cherches le menu qui n'a pas de parent (s'il y en a plusieurs ça se complique) et hiérarchie est nue requête récursive qui attribue le rang et va chercher les menus appelés :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    with
    /*
    menu (men, prog, code, seq) as (
      values 
        ('MENIKOS', 'SPA110DJ', '', 100),
        ('MENIKOS', '', 'GDC', 200),
        ('MENIKOS', 'CPP100DJ', '', 300),
        ('GDC', 'GDC110EJ', '', 100),
        ('GDC', 'GDC210EJ', '', 200),
        ('GDC', 'GDC310EJ', '', 300),
        ('GDC', 'GDC410EJ', '', 400),
        ('GDC', 'CTC110EJ', '', 500),
        ('GDC', 'CPP100DJ', '', 600),
        ('GDC', '', 'ALRTCONG', 700),
        ('GDC', 'GDC540EJ', '', 800),
        ('ALRTCONG', 'ALRT101C', '', 10),
        ('ALRTCONG', 'ALRT102C', '', 20),
        ('ALRTCONG', 'ALRT103C', '', 30),
        ('ALRTCONG', 'ALRT104C', '', 40),
        ('ALRTCONG', 'ALRT105C', '', 50),
        ('ALRTCONG', 'ALRT106C', '', 60),
        ('ALRTCONG', 'ALRT107C', '', 70)
    ),
    */
    sans_parent as (
      select distinct men from menu where not exists(select 0 from menu parent where parent.code = menu.men)
    ),
    hierarchie (rang, men, prog, code, seq) as (
      select 1, men, prog, code, seq from menu inner join sans_parent using(men)
      union all
      select rang + 1, menu.men, menu.prog, menu.code, menu.seq from hierarchie inner join menu on menu.men = hierarchie.code
    )
    select * from hierarchie
    order by rang, men, seq

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/05/2021, 16h31
  2. [Requête/SQL]Remplacer champ par valeur autre champ
    Par BORDEAUX4 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/04/2007, 12h05
  3. Réponses: 4
    Dernier message: 24/03/2007, 11h19
  4. Réponses: 5
    Dernier message: 18/09/2006, 15h17

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