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 :

Passer de lignes multiples à des colonnes


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut Passer de lignes multiples à des colonnes
    Bonjour,

    Mon problème est le suivant:

    Je dispose d'une requete qui me renvoie une "table" A composée de trois colonnes :
    Akey la clef,
    Acontenu le contenu interressant ("métier") de A,
    Aordre un numero d'ordre du contenu Acontenu pour la clef Akey. (Minimum : 1, maximum: 3)

    On pourra donc avoir par exemple:

    1 | Blabla | 1
    1 | Blibli | 2
    2 | Bloblo | 1
    2 | Blibli | 2
    2 | Blabla | 3
    3 | Bleble | 1

    Je veux ensuite passer toutes les lignes "contenu" d'une même clef sur une seule ligne de type:

    Akey | Acontenu où Aordre = 1 | Acontenu où Aordre = 2 | Acontenu où Aordre = 3 soit Akey | Acontenu1 | Acontenu2 | Acontenu3

    Si il n'y a pas de lignes correspondant au numOrdre, la colonne de résult reste nulle, avec l'exemple précédant, on doit donc avoir:

    1 | Blabla | Blibli | null
    2 | Bloblo | Blibli | Blabla
    3 | Blabla | null | null

    Je peux faire ça avec un double join sur la première requête, mais c'est pas très propre et si la volumétrie augmente, ça devient moche...

    Quelqu'un connait une solution élégante à ce problème? (En oracle 11g)

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez vous en sortir avec pivot.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous pouvez vous en sortir avec pivot.
    Merci pour cette réponse, je vais regarder comment cela fonctionne. J'ai pour l'instant adopté une solution un peu plus artisanale mais qui a le mérite de fonctionner et d'être relativement rapide:

    Je commence par un select avec des blocs select case::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select Akey, 
             case when Aordre = 1 then Acontenu else null end as Acontenu1
             case when Aordre = 2 then Acontenu else null end as Acontenu2
             case when Aordre = 3 then Acontenu else null end as Acontenu3
    from (requête initiale)

    là dessus je fait une aggregation par Akey:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select Akey,max(Acontenu1),max(Acontenu2),max(Acontenu3)
    from
    (requête précedante)
    et j'obtiens bien le résultat souhaité. Le tout repose sur le fait que max considère que tout champ est supérieur à null...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Tout-à-fait, c'est la syntaxe pré-pivot que vous avez utilisé, c'est ni meilleur ni moins bon.

    Le else null est implicite dans un case.
    Vous pouvez directement faire le max dessus, vous gagnerez un niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT Akey, 
             max(case Aordre when 1 then Acontenu end) AS Acontenu1,
             max(case Aordre when 2 then Acontenu end) AS Acontenu2,
             max(case Aordre when 3 then Acontenu end) AS Acontenu3
        FROM (requête initiale)
    GROUP BY Akey

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Tout-à-fait, c'est la syntaxe pré-pivot que vous avez utilisé, c'est ni meilleur ni moins bon.

    Le else null est implicite dans un case.
    Vous pouvez directement faire le max dessus, vous gagnerez un niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT Akey, 
             max(case Aordre when 1 then Acontenu end) AS Acontenu1,
             max(case Aordre when 2 then Acontenu end) AS Acontenu2,
             max(case Aordre when 3 then Acontenu end) AS Acontenu3
        FROM (requête initiale)
    GROUP BY Akey

    Merci beaucoup pour ces précisions supplémentaires, je marque le topic comme résolu.

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

Discussions similaires

  1. Accéder à des lignes ou des colonnes de tableau ?
    Par Loïc B. dans le forum Général Python
    Réponses: 4
    Dernier message: 21/01/2010, 12h52
  2. multiplication des colonne dans un DBGrid
    Par info_sara dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/02/2009, 10h55
  3. supprimer des lignes et des colonnes
    Par gawgab dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/09/2008, 19h22
  4. comment comparer des lignes ou des colonnes
    Par juldace dans le forum SQL
    Réponses: 3
    Dernier message: 29/05/2007, 12h43
  5. Figer des lignes et des colonnes dans un tableau
    Par Opo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 15/11/2006, 16h10

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