カンマ区切りの列値の組み込み関数はありますDB2 SQL
か?
例:が付いたID
列があり、同じID
で3つの異なる役割を持つ3つの行がある場合、データはコンマで連結する必要があります。
ID | Role
------------
4555 | 2
4555 | 3
4555 | 4
行ごとに、出力は次のようになります。
4555 2,3,4
この小さなクエリで、やりたいことができると思います。これは、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
DB2 9.7.5 以降、そのための関数があります。
LISTAGG(colname, separator)
詳細については、これを確認してください: Using LISTAGG to Turn Rows of Data into a Comma Separated List
私の問題は、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 にキャストしてから、ここで呼び出していることを確認してください。
これを試して:
SELECT GROUP_CONCAT( field1, field2, field3 ,field4 SEPARATOR ', ')