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

SQL Oracle Discussion :

Concaténation de colonnes de tuples


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 31
    Points : 57
    Points
    57
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    je pense que la réponse se trouve ici : http://www.developpez.net/forums/d58.../pivot-oracle/

  3. #3
    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 820
    Points
    17 820
    Par défaut
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 31
    Points : 57
    Points
    57
    Par défaut
    Waldar, merci pour le tuyau... une petite adaptation (distinct) et ça fonctionne bien.

    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
    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.

  5. #5
    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 820
    Points
    17 820
    Par défaut
    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 : 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
    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

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

Discussions similaires

  1. concaténer deux colonnes avec séparateur ', '
    Par briceg dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 23/10/2009, 11h33
  2. Concaténer 2 colonnes de 2 tables différentes ?…
    Par Mister Paul dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/10/2008, 11h19
  3. [MySQL] Concaténer plusieurs colonnes d'une table temporaire
    Par kryogen dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/08/2008, 10h56
  4. Concaténer une colonne
    Par aigleborgne dans le forum Développement
    Réponses: 3
    Dernier message: 07/05/2008, 15h02
  5. Réponses: 10
    Dernier message: 29/08/2006, 16h47

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