web-dev-qa-db-ja.com

SQLは行を1つのフィールドに連結します(DB2)

DB2データベースからデータを抽出する必要があります。 1つのテーブルにキーワードがあり、各キーワードは個別の行です。抽出では、すべてのIDのすべてのキーワードを、コンマで区切られた1つのストリングにしたいと考えています。

だから、説明する:私はそのようなデータを持っています

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

そして、ここに私が達成したいもののサンプルがあります:

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

私はconcatで試しました:

SELECT concat(keyword) FROM table.keywordTbl

私はいくつかのDB2固有のコマンドを試してみました:

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

PIVOTはこれには適していませんが、私もチェックしました。 GROUP_CONCATも機能していません。

もちろん、これらのどれも動作しません...

私に何かヒントはありますか?

9
Karolina

以下のスクリプトに従ってクエリを変更してみてください

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

_DB2 v9.7+_がある場合は、LISTAGG()関数も使用できます。最初のパラメーターは列、2番目のパラメーターはセパレーターです。

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