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 :

transposer colonnes en lignes


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut transposer colonnes en lignes
    bonjour,

    je souhaite depuis un petit moemt tranposer le résultat d'une requete en lignes.
    Ma requete fait ce traitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct Nom, Prenom
    from Employes 
    where Age= 25
    Résultat
    ________
    Nom Prenom
    TOTO1 p_toto1
    TOTO2 p_toto2
    TOTO3 p_toto3

    je veux l'affichage de ce résultat sous cette forme
    ________________

    TOTO1 TOTO2 TOTO3
    p_toto1 p_toto1 p_toto1

    sans pour autant avoir besoin de créer une table intermédiaire à chaque fois (car en fait '25' (valeur de Age) est une variable)

    Merci

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    permets moi de te dire que j'ai cherché, et que si t'avais pris la peine de lire ce qui est deja été posté (comme tu me l'as si délicatement recommandé), tu te serais rendu compte que c'est du spécifique (pour 1 seule ligne, pour 1 cas spécial)
    ... qui n'a donc rien à voir avec ce que je demande

    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Citation Envoyé par freestyler
    permets moi de te dire que j'ai cherché, et que si t'avais pris la peine de lire ce qui est deja été posté (comme tu me l'as si délicatement recommandé), tu te serais rendu compte que c'est du spécifique (pour 1 seule ligne, pour 1 cas spécial)
    ... qui n'a donc rien à voir avec ce que je demande

    Merci
    Bonjour freestyler,
    et pourtant McM a bien raison ce post a déjà été traité plusieurs fois.

    Solution 1 : créer sa propre fonction d'agrégation
    Solution 2 : utiliser une fonction CONCAT_LIST que j'avais déjà donné sur le forum

    ci-joint les sources + 2 exemples
    Nota : je te laisse le soin d'adapter les requetes à tes besoins. Je t'ai donné en vrac ce que j'ai retrouvé sur ma paillasse. et je fais vite, j'ai une charmante commerciale à accueillir

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    create or replace type string_agg_type as object
     (
         total varchar2(4000),
     
           static function
              ODCIAggregateInitialize(sctx IN OUT string_agg_type )
               return number,
     
           member function
               ODCIAggregateIterate(self IN OUT string_agg_type ,
                                    value IN varchar2 )
               return number,
     
          member function
               ODCIAggregateTerminate(self IN string_agg_type,
                                     returnValue OUT  varchar2,
                                     flags IN number)
              return number,
     
          member function
             ODCIAggregateMerge(self IN OUT string_agg_type,
                                  ctx2 IN string_agg_type)
               return number
       );
      /
     
    create or replace type body string_agg_type
      is
     
       static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)
       return number
       is
       begin
           sctx := string_agg_type( null );
           return ODCIConst.Success;
       end;
     
      member function ODCIAggregateIterate(self IN OUT string_agg_type,
                                           value IN varchar2 )
       return number
       is
       begin
          self.total := self.total || ';' || value;
           return ODCIConst.Success;
       end;
     
       member function ODCIAggregateTerminate(self IN string_agg_type,
                                              returnValue OUT varchar2,
                                             flags IN number)
       return number
      is
       begin
          returnValue := ltrim(self.total,';');
           return ODCIConst.Success;
       end;
     
       member function ODCIAggregateMerge(self IN OUT string_agg_type,
                                          ctx2 IN string_agg_type)
       return number
       is
       begin
           self.total := self.total || ctx2.total;
           return ODCIConst.Success;
       end;
     
     
       end;
       /
     
       CREATE or replace
       FUNCTION stragg(input varchar2 )
       RETURN varchar2
       PARALLEL_ENABLE AGGREGATE USING string_agg_type;
        /
     
     
    SELECT POINT_ID, stragg(resu_rendu)
    FROM (
         SELECT point_id AS LABO, FLACO_ID AS FLACON,ETIQ_REPLIQUE AS REP,resu_rendu AS RESULTAT
         FROM v_plan1
         ORDER BY POINT_ID, FLACO_ID,ETIQ_REPLIQUE ASC)
    GROUP BY POINT_id
     
    --Solution 2
    CREATE OR REPLACE FUNCTION CONCAT_LIST(cur SYS_REFCURSOR )
      RETURN  VARCHAR2 IS
        ret VARCHAR2(32000); 
        tmp VARCHAR2(4000);
    BEGIN
        LOOP
            FETCH cur INTO tmp;
            EXIT WHEN cur%NOTFOUND;
                ret := ret || ';' || tmp;
        END LOOP;
        RETURN ret;
    END CONCAT_LIST;
     
    SELECT POINT_ID, SUBSTR(VALEURS,2,LENGTH(VALEURS))
    FROM
    (
        SELECT POINT_ID,
            CONCAT_LIST(CURSOR(
                               SELECT (CASE 
                                            WHEN CHECK_NUMBER(resu_rendu) IS NULL THEN resu_rendu 
                                            ELSE CONV_NUMBER_TO_STRING(TO_NUMBER(resu_rendu),2) END)
                               FROM v_plan1 V2
                               WHERE V2.POINT_ID=V1.POINT_ID
                               ORDER BY V2.POINT_ID, V2.FLACO_ID,V2.ETIQ_REPLIQUE ASC
                               )) VALEURS
    FROM V_PLAN1 V1
    GROUP BY POINT_ID
    ORDER BY POINT_ID ASC)
    @

  5. #5
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    On peut aussi s'inspirer de cette solution d'agrégation ( qui ne transpose pas en l'état, mais peut sans doute être adaptée)

    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
     
     
    SELECT id_util,LTRIM(Liste, '; ')
    FROM (
      SELECT id_util, id_prof, Liste, Niveau,
      MAX(niveau) OVER (PARTITION BY id_util) max_niv
      FROM (
         SELECT up.id_util, up.id_prof, PRIOR up.id_prof, LEVEL AS niveau, 
               sys_connect_by_path(up.id_prof, '; ') AS Liste 
         FROM UTILPROF up1
         where up.id_util=3
         CONNECT BY id_util = PRIOR id_util AND up.id_prof > PRIOR up1.id_prof
             )
     )
    WHERE niveau = max_niv;

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    Merci de la réponse PpPool

    mais ce n'est pas du tout clair pour moi!

    la fonction stragg, elle fait quoi au juste?
    c'est une fonction d'agrégation, mais basée sur quoi au juste?

    merci

Discussions similaires

  1. Transposer colonnes en lignes
    Par Frank dans le forum SQL
    Réponses: 4
    Dernier message: 14/10/2011, 17h55
  2. Transposer une colonne en ligne
    Par mouncefdi dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 13/03/2009, 12h03
  3. Transposer les colonnes en lignes
    Par taisherg dans le forum SAS Base
    Réponses: 9
    Dernier message: 03/12/2008, 16h51
  4. Transposer colonne/ligne d'une table
    Par dashblade dans le forum IHM
    Réponses: 2
    Dernier message: 17/06/2008, 15h25
  5. [SQL] Transposer des colonnes en lignes + LIKE et SOUNDEX
    Par Anne1969 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/11/2005, 13h44

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