次のようなテーブルがあります。
A 1
A 2
B 1
B 2
そして、次のような結果セットを生成したいと考えています。
A 1 2
B 1 2
これを行うSQLステートメントはありますか?オラクルを使用しています。
関連する質問:
- 単一の行から複数の行を返す 私の質問は、この質問の反対に近いものです。
- LINQ を使用して連結する これはまさに私がやりたいことですが、LINQ は使用しません。
次のようなテーブルがあります。
A 1
A 2
B 1
B 2
そして、次のような結果セットを生成したいと考えています。
A 1 2
B 1 2
これを行うSQLステートメントはありますか?オラクルを使用しています。
関連する質問:
(警告-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の文字列集計ページでいくつかの手順を見つけることができます。
かなり古いトピックですが、Oracleがその間に改善されたため、他の人に役立つ可能性があります.
LISTAGG関数はあなたが探しているものです(少なくとも 11g では)
で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
説明については、私のブログのこの記事を参照してください。
次のようなものを試してください:
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 が提案したように、これをカスタム集計関数に置き換えることになりました。
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
ユーザー定義の集計関数: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html
コピー&ペーストして使用するだけです。9iで動作します。
SELECT a , COLLECT(b) FROM foo GROUP BY a
pl/sql で使用すると非常に便利です。ユーザー定義のコレクションにキャストできます。