24

カンマ区切りの列値の組み込み関数はありますDB2 SQLか?

例:が付いたID列があり、同じIDで3つの異なる役割を持つ3つの行がある場合、データはコンマで連結する必要があります。

ID   | Role
------------
4555 | 2
4555 | 3
4555 | 4

行ごとに、出力は次のようになります。

4555 2,3,4

4

7 に答える 7

10

この小さなクエリで、やりたいことができると思います。これは、DB2 における MySQL の GROUP_CONCAT に相当します。

SELECT 
NUM, 
SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ',ROLES))) as VARCHAR(1024)), 3) as ROLES
FROM mytable 
GROUP BY NUM;

これにより、次のような出力が得られます。

NUM   ROLES
----  -------------
1     111, 333, 555
2     222, 444

元の結果が次のようなものであると仮定します。

NUM   ROLES
----  ---------
1     111
2     222
1     333
2     444
1     555
于 2015-02-12T13:02:04.727 に答える
3

DB2 9.7.5 以降、そのための関数があります。

LISTAGG(colname, separator)

詳細については、これを確認してください: Using LISTAGG to Turn Rows of Data into a Comma Separated List

于 2017-12-06T08:41:16.000 に答える
0

私の問題は、CSV を使用して行フィールド (CLOB) を列 (VARCHAR) に転置し、転置されたテーブルをレポートに使用することでした。レポート レイヤーで転置すると、レポートの速度が低下するためです。

1 つの方法は、再帰 SQL を使用することです。これについては多くの記事を見つけることができますが、再帰的に転置されたすべての列を結合したい場合は、困難でリソースを消費します。

1 つのキー識別子を持つ単一の転置列を格納する複数のグローバル一時テーブルを作成しました。最終的に、6 つの列を結合するための一時テーブルが 6 つになりましたが、リソースの割り当てが限られているため、すべての列をまとめることができませんでした。以下の 3 つの数式を選択したため、1 つのクエリを実行するだけで、10 秒で出力が得られました。

XML2CLOB 関数の使用に関するさまざまな記事を見つけ、3 つの異なる方法を見つけました。

REPLACE(VARCHAR(XML2CLOB(XMLAGG(XMLELEMENT(NAME "A",ALIASNAME.ATTRIBUTENAME)))),'', ',') AS TRANSPOSED_OUTPUT
NVL(TRIM(',' FROM REPLACE(REPLACE(REPLACE(CAST(XML2CLOB(XMLAGG(XMLELEMENT(NAME "E", ALIASNAME.ATTRIBUTENAME))) AS VARCHAR(100)),'',' '),'', ','), '', 'Nothing')), 'Nothing') を TRANSPOSED_OUTPUT として
RTRIM(REPLACE(REPLACE(REPLACE(VARCHAR(XMLSERIALIZE(XMLAGG(XMLELEMENT(NAME "A",ALIASNAME.ATTRIBUTENAME) ORDER BY ALIASNAME.ATTRIBUTENAME) AS CLOB))), '',','),'','') ,'','')) AS TRANSPOSED_OUTPUT

サブクエリで「ATTRIBUTENAME」を varchar にキャストしてから、ここで呼び出していることを確認してください。

于 2016-01-29T18:32:07.460 に答える
-2

これを試して:

SELECT GROUP_CONCAT( field1, field2, field3 ,field4 SEPARATOR ', ')
于 2011-08-25T10:50:46.823 に答える