web-dev-qa-db-fra.com

SQL concaténer des lignes dans un champ (DB2)

J'ai besoin d'extraire des données de ma base de données DB2. J'ai des mots clés dans un tableau et chaque mot clé est une ligne distincte. Dans l'extrait, je veux avoir tous les mots clés pour tous les ID dans une chaîne séparée par une virgule.

Donc, pour expliquer: j'ai de telles données

ID         | keyword 
===========================
prd1       | test
---------------------------
prd2       | keywords
---------------------------
prd1       | flower
---------------------------
prd4       | picture
---------------------------
prd7       | 234567
---------------------------
prd9       | reored
---------------------------
prd4       | finland
---------------------------
prd0       | 983y23
---------------------------
prd4       | code
---------------------------
prd9       | tratata

Et voici un exemple de ce que je veux réaliser:

ID         | keyword concatenated
===========================
prd1       | test, flower
---------------------------
prd2       | keywords
---------------------------
prd4       | picture, finland, code
---------------------------
prd7       | 234567
---------------------------
prd9       | reored, tratata
---------------------------
prd0       | 983y23
---------------------------

J'ai essayé avec concat:

SELECT concat(keyword) FROM table.keywordTbl

J'ai essayé avec certaines commandes spécifiques à DB2:

SELECT IDs, Sys_Connect_By_Path(varchar(keyword), ', ') AS "keyword concatenated" FROM table.keywordTbl START WITH ID='prd1' CONNECT BY ID=keyword

PIVOT ne convient pas à cela, mais je l'ai également vérifié. GROUP_CONCAT ne fonctionne pas non plus.

Bien sûr, aucun de ces travaux ...

Avez-vous des indices pour moi?

9
Karolina

Essayez de modifier la requête en fonction du script ci-dessous

 SELECT 
    ID, 
    SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ',keyword))) as VARCHAR(1024)), 3) AS "keyword concatenated"
    FROM table.keywordTbl 
    GROUP BY ID
6
mohan111

Vous pouvez également utiliser la fonction LISTAGG(), si vous avez DB2 v9.7+. Le premier paramètre est la colonne, le second est le séparateur.

SELECT 
  ID
, LISTAGG(keyword, ',') AS "keyword concatenated"
    FROM table.keywordTbl 
GROUP BY ID
13
zlidime