Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 25/01/2011, 10h03   #1
Membre du Club
 
AC
Inscription : octobre 2010
Messages : 28
Détails du profil
Informations personnelles :
Nom : AC
Âge : 43
Localisation : Suisse

Informations forums :
Inscription : octobre 2010
Messages : 28
Points : 48
Points : 48
Par défaut Concaténation de colonnes de tuples

Bonjour,

J'ai besoin d'une piste pour résoudre le cas suivant (Oracle 10g) :

A partir de la table suivante :

Code :
1
2
3
4
5
6
TABLE test
 Name                                      NULL?    Type                        
 ----------------------------------------- -------- ----------------------------
 KEY_ID                                             NUMBER                      
 NO_SEQ                                             NUMBER                      
 VAL                                                VARCHAR2(4000)
populée ainsi

KEY_ID NO_SEQ VAL

1 1 a
1 2 b
1 3 c


Y'a-t-il un moyen d'obtenir avec une requête le résultat suivant :

Code :
1
2
3
4
 
KEY_ID   NEW
 
1        a,b,c
La colonne new étant la concaténation des n séquences, séparées par le caractère , (virgule).

Merci de votre aide précieuse.
wahnfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 10h19   #2
Membre régulier
 
Inscription : septembre 2008
Messages : 84
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 84
Points : 88
Points : 88
Bonjour,

je pense que la réponse se trouve ici : http://www.developpez.net/forums/d58.../pivot-oracle/
spdev666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 11h21   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Faites une recherche sur STRING AGGREGATION sur ce forum.
Il y a une fonction built-in à partir de 11gR2, avant il faut faire autrement.

J'ai un faible pour la solution XML.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h09   #4
Membre du Club
 
AC
Inscription : octobre 2010
Messages : 28
Détails du profil
Informations personnelles :
Nom : AC
Âge : 43
Localisation : Suisse

Informations forums :
Inscription : octobre 2010
Messages : 28
Points : 48
Points : 48
Waldar, merci pour le tuyau... une petite adaptation (distinct) et ça fonctionne bien.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH MaTable AS
(
SELECT 1 AS key_id, 1 AS seq , 'Addidas' AS key_val FROM dual union ALL
SELECT 1          , 2        , 'Nike'               FROM dual union ALL
SELECT 1          , 3        , 'Reebok'             FROM dual union ALL
SELECT 2          , 1        , 'a'                  FROM dual union ALL
SELECT 2          , 2        , 'b'                  FROM dual union ALL
SELECT 2          , 3        , 'c'                  FROM dual 
)
  SELECT DISTINCT mt1.key_id,
         rtrim(REPLACE(REPLACE(xmlagg(xmlelement("x", mt2.key_val) ORDER BY mt2.key_val ASC), '<x>', ''), '</x>', ','), ',') AS agg
    FROM MaTable MT1
         INNER JOIN MaTable MT2
           ON MT2.key_id = MT1.key_id
GROUP BY MT1.key_id, MT1.seq
ORDER BY MT1.key_id ASC;
Super, merci à tous.
wahnfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h59   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je ne sais pas pourquoi vous faites la jointure, elle ne me paraît pas nécessaire dans ce cas, et du coup le distinct non plus :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH MaTable AS
(
SELECT 1 AS key_id, 1 AS seq , 'Addidas' AS key_val FROM dual union ALL
SELECT 1          , 2        , 'Nike'               FROM dual union ALL
SELECT 1          , 3        , 'Reebok'             FROM dual union ALL
SELECT 2          , 1        , 'a'                  FROM dual union ALL
SELECT 2          , 2        , 'b'                  FROM dual union ALL
SELECT 2          , 3        , 'c'                  FROM dual 
)
  SELECT mt1.key_id,
         rtrim(REPLACE(REPLACE(xmlagg(xmlelement("x", MT1.key_val) ORDER BY MT1.seq ASC), '<x>', ''), '</x>', ','), ',') AS agg
    FROM MaTable MT1
GROUP BY MT1.key_id
ORDER BY MT1.key_id ASC;
 
    KEY_ID AGG                 
---------- --------------------
         1 Addidas,Nike,Reebok 
         2 a,b,c
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h49.


 
 
 
 
Partenaires

Hébergement Web