Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2007, 16h53   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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 :
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 18h57   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 10h12   #3
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 11h08   #4
Membre éclairé
 
Inscription : novembre 2002
Messages : 533
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 533
Points : 359
Points : 359
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 :
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)
@
__________________
PpPool
PpPool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 12h33   #5
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
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 :
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;
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 14h32   #6
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
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
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h24.


 
 
 
 
Partenaires

Hébergement Web