73

ストアドプロシージャを作成せずに、Oracleで次のことを実現するにはどうすればよいですか?

データセット:

question_id    element_id
1              7
1              8
2              9
3              10
3              11
3              12

望ましい結果:

question_id    element_id
1              7,8
2              9
3              10,11,12
4

4 に答える 4

133

Oracle 11gR2から、LISTAGG句は次のトリックを実行する必要があります。

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;

結果の文字列が大きすぎる場合(たとえば、VARCHAR2の場合は4000文字を超える場合)に注意してください。バージョン12cR2から、ON OVERFLOW TRUNCATE/ERRORを使用してこの問題に対処できます。

于 2012-09-14T09:14:33.830 に答える
44

警告-WM_CONCATバージョン12cで削除されたサポートされていない関数です。非常に古いデータベースを使用している場合を除き、この関数は使用しないでください。)


簡単:

SELECT question_id, wm_concat(element_id) as elements
FROM   questions
GROUP BY question_id;

10gで個人的にテスト済み;-)

http://www.oracle-base.com/articles/10g/StringAggregationTechniques.phpから

于 2009-07-02T19:28:41.357 に答える
33

文字列の集計を行う方法はたくさんありますが、最も簡単なのはユーザー定義関数です。 関数を必要としない方法でこれを試してください。 注意として、関数なしで簡単な方法はありません。

これは、カスタム関数を使用しない最短ルートです:(ROW_NUMBER()およびSYS_CONNECT_BY_PATH関数を使用します)

SELECT questionid,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,','))
       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements
FROM   (SELECT questionid,
               elementid,
               ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr,
               ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) -1 AS prev
        FROM   emp)
GROUP BY questionid
CONNECT BY prev = PRIOR curr AND questionid = PRIOR questionid
START WITH curr = 1;
于 2009-07-02T18:54:19.273 に答える
0

このOTNスレッドには、パフォーマンスの比較など、文字列の集計を行うためのいくつかの方法が含まれています。http: //forums.oracle.com/forums/message.jspa?messageID= 1819487#1819487

于 2009-07-02T19:37:10.763 に答える