32

次のようなテーブルがあります。

A 1 
A 2 
B 1 
B 2

そして、次のような結果セットを生成したいと考えています。

A 1 2 
B 1 2

これを行うSQLステートメントはありますか?オラクルを使用しています。

関連する質問:

4

7 に答える 7

28

(警告-WM_CONCATバージョン 12c で削除されたサポートされていない関数です。非常に古いデータベースを使用していない限り、この関数は使用しないでください。おそらくLISTAGG代わりに使用する必要があります。)


使用している Oracle のバージョンによって異なります。wm_concat() 関数をサポートしている場合は、次のように簡単に実行できます。

SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;

wm_concat() は、基本的に MySQL のgroup_concat()と同じように機能します。文書化されていない可能性があるため、古い sqlplus を起動して、そこにあるかどうかを確認してください。

そこにない場合は、同等のものを自分で実装する必要があります。これを行う方法については、oracle-base.comの文字列集計ページでいくつかの手順を見つけることができます。

于 2009-07-13T17:28:07.023 に答える
23

かなり古いトピックですが、Oracleがその間に改善されたため、他の人に役立つ可能性があります.

LISTAGG関数はあなたが探しているものです(少なくとも 11g では)

于 2013-01-12T20:40:33.710 に答える
9

Oracle 10g+

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        MODEL
        PARTITION BY
                (grouper)
        DIMENSION BY
                (ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY id) AS rn)
        MEASURES
                (val, val AS group_concat, 0 AS mark)
        RULES SEQUENTIAL ORDER (
                group_concat[rn > 1] ORDER BY rn = group_concat[CV() - 1] || ', ' || val[CV()],
                mark[ANY] ORDER BY rn = PRESENTV(mark[CV() + 1], 0, 1)
                )
        )
WHERE   mark = 1
ORDER BY
        grouper

説明については、私のブログのこの記事を参照してください。

于 2009-07-29T16:54:54.493 に答える
5

次のようなものを試してください:

SELECT
    field1,
    RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
  FROM yourTable
  GROUP BY field1

この Oracle フォーラム で見つかった回答に自由に触発されました。

編集:このソリューションは、10 5行のようなリクエストで非常にリソースを集中的に使用することが判明しました。John が提案したように、これをカスタム集計関数に置き換えることになりました。

于 2009-07-29T16:47:34.993 に答える
4

10g を取得した場合は、以下の機能を実行する必要があります。

CREATE OR REPLACE FUNCTION get_separated_value (input_val  in  number)
  RETURN VARCHAR2
IS
  return_text  VARCHAR2(10000) := NULL;
BEGIN
  FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP
    return_text := return_text || ' ' || x.col2 ;
  END LOOP;
  RETURN return_text;
END;
/

したがって、次のようにすることができます:

select col1, get_separated_value(col1) from table_name

ここでフィドル

Oracle 11g をお持ちの場合は、listaggを使用できます。

SELECT 
    age,
    LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name) "names"
FROM table_x
GROUP BY age

ここで Listagg をフィドルします

于 2013-05-27T11:28:33.460 に答える
2

ユーザー定義の集計関数: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html

コピー&ペーストして使用するだけです。9iで動作します。

于 2009-07-13T17:13:35.477 に答える
2
SELECT a , COLLECT(b) FROM foo GROUP BY a

pl/sql で使用すると非常に便利です。ユーザー定義のコレクションにキャストできます。

于 2013-02-10T18:21:09.920 に答える