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

PL/SQL Oracle Discussion :

Alias de colonne et decode


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut Alias de colonne et decode
    bonjour tout le monde
    je voudrais savoir s' il est possible (sous Oracle 11g) d' attribuer un alias à une colonne grâce à la fonction decode.
    Je m'explique: j' ai une table avec la structure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    matable  :
    id   |filiere1 |filiere2 |  periode
    id1 | f_11   | f_21   |  p1
    id1 | f_12   | f_22   |  p2
    id2 | f_11   | null    |  p1
    un
    me donne le résultat que nous connaissons tous à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id   |filiere1 |filiere2 |  periode
    id1 | f_11   | f_21   |  p1
    id1 | f_12   | f_22   |  p2
    id2 | f_11   | null    |  p1
    seulement ce que je recherche est ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    id   |filiere1_P1 |filiere1_P2 |filiere2_P1 | filiere2_P2
    id1 | f_11        |f_12         | f_21       |f_22 
    id2 | f_11        |null          |null          |  null
    le but est de pouvoir sous cette présentation exporter les données dans un fichier excel.
    merci pour votre aide

  2. #2
    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 814
    Points
    17 814
    Par défaut
    Oui, faites une recherche sur le mot-clef PIVOT.
    Vous aurez soit une solution à base de CASE / DECODE, soit une solution avec l'opérateur PIVOT qui est apparu en 11g.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut Merci
    merci Waldar.
    je m' execute

  4. #4
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    les recherches me font savoir que la fonction PIVOT a toujours besoin d' une fonction d' aggregat.

    je ne vois donc pas comment l' appliquer à mon problème.
    Je pensais effet à quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id, 
    filiere1 as filiere1||decode(periode, 'p1','periode', null), 
    filiere2 as filiere2||decode(periode, 'p1','periode', null)

    par contre la solution avec case me paraît pas forcément être ce qu' il faut car elle aurait une influence sur les données à l' interieur des colonnes.
    Tout ce que je voudrais c' est simplement adapter l' alias des colonne.

    C' est encore très peu claire dans mon esprit

    merci

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Comme ceci par exemple (sans le mot clé PIVOT) :
    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 t as (
      2  select 'id1' as id, 'f_11' as filiere1, 'f_21' as filiere2, 'p1' as periode from dual union all
      3  select 'id1'      , 'f_12'            , 'f_22'            , 'p2' from dual union all
      4  select 'id2'      , 'f_11'            , NULL              , 'p1' from dual
      5  )
      6  select id,
      7         max(case when periode = 'p1' then filiere1 end) as filiere1_P1,
      8         max(case when periode = 'p2' then filiere1 end) as filiere1_P2,
      9         max(case when periode = 'p1' then filiere2 end) as filiere2_P1,
     10         max(case when periode = 'p2' then filiere2 end) as filiere2_P2
     11    from t
     12   group by id
     13   order by id;
     
    ID  FILI FILI FILI FILI
    --- ---- ---- ---- ----
    id1 f_11 f_12 f_21 f_22
    id2 f_11
     
    SQL>

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Merci à toi skuatamad!
    C´est bien ce que j' ai spécifié dans mon post précédent(je le réeditais au moment ou tu postais).
    le case me change les valeurs à l' interieur des colonnes.

    merci encore une fois.

    J' essaie au moins la partie de ta solution avec WITH

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    par contre la solution avec case me paraît pas forcément être ce qu' il faut car elle aurait une influence sur les données à l' interieur des colonnes.
    Je ne comprends pas ce que vous voulez dire, pouvez vous améliorer votre jeu de test pour préciser.
    Tout ce que je voudrais c' est simplement adapter l' alias des colonne.
    Non vous voulez faire un regroupement, votre table contient 2 id1 et votre requête ne vous en renvoie qu'un seul.
    Lorsque vous exécuter une requête SQL elle comporte un nombre définit et fixe de colonne nommée.
    Si vous avez un grand nombre de période, il faut générer la requête dans un langage de programation comme le PL/SQL par exemple.

    Pour info le WITH ne sert qu'à simuler la table décrite dans le 1er post.

    Ci-dessous le résultat reposté où on voit mieux les alias, au cas où :
    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 t AS (
      2  SELECT 'id1' AS id, 'f_11' AS filiere1, 'f_21' AS filiere2, 'p1' AS periode FROM dual union ALL
      3  SELECT 'id1'      , 'f_12'            , 'f_22'            , 'p2' FROM dual union ALL
      4  SELECT 'id2'      , 'f_11'            , NULL              , 'p1' FROM dual
      5  )
      6  SELECT id,
      7         max(case when periode = 'p1' then filiere1 end) AS filiere1_P1,
      8         max(case when periode = 'p2' then filiere1 end) AS filiere1_P2,
      9         max(case when periode = 'p1' then filiere2 end) AS filiere2_P1,
     10         max(case when periode = 'p2' then filiere2 end) AS filiere2_P2
     11    FROM t
     12   GROUP BY id
     13   ORDER BY id;
     
    ID  FILIERE1_P1          FILIERE1_P2          FILIERE2_P1          FILIERE2_P2
    --- -------------------- -------------------- -------------------- --------------------
    id1 f_11                 f_12                 f_21                 f_22
    id2 f_11
     
    SQL>

  8. #8
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    juste une autre petite question dans le but d' essayer le WITH.

    dans ta solution
    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 t AS (
      2  SELECT 'id1' AS id, 'f_11' AS filiere1, 'f_21' AS filiere2, 'p1' AS periode FROM dual union ALL
      3  SELECT 'id1'      , 'f_12'            , 'f_22'            , 'p2' FROM dual union ALL
      4  SELECT 'id2'      , 'f_11'            , NULL              , 'p1' FROM dual
      5  )
      6  SELECT id,
      7         max(case when periode = 'p1' then filiere1 end) AS filiere1_P1,
      8         max(case when periode = 'p2' then filiere1 end) AS filiere1_P2,
      9         max(case when periode = 'p1' then filiere2 end) AS filiere2_P1,
     10         max(case when periode = 'p2' then filiere2 end) AS filiere2_P2
     11    FROM t
     12   GROUP BY id
     13   ORDER BY id;
     
    ID  FILI FILI FILI FILI
    --- ---- ---- ---- ----
    id1 f_11 f_12 f_21 f_22
    id2 f_11
    je ne vois pas à quelle niveau tu utilises ma table de base car les selects tu les fais uniquement sur dual.

    tout à l' heure j' ai simplifié le problème pour qu' il soit facilement percevable.
    Les colonnse: filiere1, filiere2 et période n´étant que trois colonnes d' une requête plus complexe ayant la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     select distinct (t1.id), t2.col1, t2.col2, t3.filiere1, t3.filiere2,t3.periode 
            from 
      (select distinct (y.id)
            from table y) t1,
    table2 t2,
    matable t3
    where t1.id = t2.id
       and t1.id = t3.id
       and t2.id= t3.id

  9. #9
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Salut
    @skuatamad
    Si vous avez un grand nombre de période, il faut générer la requête dans un langage de programation comme le PL/SQL par exemple..
    je n' ai que 3 périodes.
    votre table contient 2 id1
    c'est bien ca. et ce que je voudrais c' est obtenir toutes les informations de id1 sur une seule ligne.
    exactement tel que vous l'avez démontré.

    voici ce que je viens d' essayer conformément aux suggestions de skuatamad
    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
     
    WITH x AS 
     
    (SELECT DISTINCT (t1.id), t2.col1, t2.col2, t3.filiere1, t3.filiere2,t3.periode 
            FROM 
      (SELECT DISTINCT (y.id) FROM TABLE y) t1,
      table2 t2,
      matable t3
      WHERE t1.id = t2.id
       AND t1.id = t3.id
       AND t2.id= t3.id)
     
    SELECT x.id,x.col1, x.col2, x.filiere1, x.filiere2, x.periode 
              max(case when x.periode = 'p1' then x.filiere1 end) AS filiere1_P1,
             max(case when x.periode = 'p2' then x.filiere1 end) AS filiere1_P2,
               max(case when x.periode = 'p1' then x.filiere2 end) AS filiere2_P1,
              max(case when x.periode = 'p2' then x.filiere2 end) AS filiere2_P2
        FROM x
    malheureusement l' erreur oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (ORA 00937: not a single-group group function)
    est générée.

    merci

  10. #10
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    un grand merci à tous
    j' ai beaucoup avancé depuis et je ne suis pas loin de la solution.

    Tout d' abord pour corriger l' erreur générée par oracle il me fallait ajouter un group by. @skuatamad
    désolée je ne l'avais pas lu dans ton post. C' est ma faute!!

    Soit
    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
    WITH x AS 
     
    (SELECT DISTINCT (t1.id), t2.col1, t2.col2, t3.filiere1, t3.filiere2,t3.periode 
            FROM 
      (SELECT DISTINCT (y.id) FROM TABLE y) t1,
      table2 t2,
      matable t3
      WHERE t1.id = t2.id
       AND t1.id = t3.id
       AND t2.id= t3.id)
     
    SELECT x.id,x.col1, x.col2, x.filiere1, x.filiere2, x.periode 
              max(case when x.periode = 'p1' then x.filiere1 end) AS filiere1_P1,
             max(case when x.periode = 'p2' then x.filiere1 end) AS filiere1_P2,
               max(case when x.periode = 'p1' then x.filiere2 end) AS filiere2_P1,
              max(case when x.periode = 'p2' then x.filiere2 end) AS filiere2_P2
        FROM x 
    group by  x.id,x.col1, x.col2, x.filiere1, x.filiere2, x.periode
    ma table se présente donc sous la forme
    [code]
    ID FILIERE1_P1 FILIERE1_P2 FILIERE2_P1 FILIERE2_P2 periode
    --- ------------- -------------------- --------------------------- -------
    id1 f_11 null f_21 null P1
    id1 f_11 f_12 f_21 f_22 P2

    id2 f_11

    pour ceux que ca pourrait éventuellement aider.

    Le dernier point que je n' arrive pas à résoudre c' est justement le regrpement de id.
    @skuatamad j' ai bien compris que ca se passe ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH t AS (
      2  SELECT 'id1' AS id, 'f_11' AS filiere1, 'f_21' AS filiere2, 'p1' AS periode FROM dual union ALL
      3  SELECT 'id1'      , 'f_12'            , 'f_22'            , 'p2' FROM dual union ALL
      4  SELECT 'id2'      , 'f_11'            , NULL              , 'p1' FROM dual
      5  )
    mais je ne sais pas trop comment formuler la requête à ce niveau (tout au début) étant donné qu' en dessous à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT id,
               max(case when periode = 'p1' then filiere1 end) AS filiere1_P1,
              max(case when periode = 'p2' then filiere1 end) AS filiere1_P2,
              max(case when periode = 'p1' then filiere2 end) AS filiere2_P1,
              max(case when periode = 'p2' then filiere2 end) AS filiere2_P2
         FROM t
    j' ai une requête.

    merci pour votre aide

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Le WITH ne me sert qu'à simuler votre table, vous n'avez pas à l'utiliser dans votre requête et T correspond au nom de votre table.
    Ma requête telle quelle vous intéresse est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT id,
           max(case when periode = 'p1' then filiere1 end) AS filiere1_P1,
           max(case when periode = 'p2' then filiere1 end) AS filiere1_P2,
           max(case when periode = 'p1' then filiere2 end) AS filiere2_P1,
           max(case when periode = 'p2' then filiere2 end) AS filiere2_P2
      FROM votre_table (ou votre_vue)
     GROUP BY id
     ORDER BY id;

  12. #12
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    merci skuatamad

Discussions similaires

  1. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 10h31
  2. recuperer la Valeur d'un alias de colonne
    Par backdraf dans le forum Développement
    Réponses: 3
    Dernier message: 28/05/2009, 19h27
  3. Utiliser des ALIAS de colonnes dans une jointure
    Par mbzhackers dans le forum SQL
    Réponses: 4
    Dernier message: 31/03/2008, 11h27
  4. Comment utiliser les alias de colonnes ?
    Par Someonelse dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/10/2006, 17h37
  5. Alias de colonne
    Par plochert dans le forum Oracle
    Réponses: 2
    Dernier message: 18/04/2006, 14h53

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