5

重複の可能性:
Oracle で複数の行をカンマ区切りのリストに結合するにはどうすればよいですか?

次のことを達成する方法を教えてください。

テーブル:

efforts_id        cycle_name      release_name 
123               quarter         march 
123               half            april 
123               full            april
124               quarter         may

私の期待される出力:

efforts_id        cycle_name            release_name 
123               quarter,half,full     march,april
124               quarter               may

私はオラクルの初心者なので、これを行う方法がわかりません。どんな助けでも大歓迎です。

ありがとう

4

4 に答える 4

7

必要なのは「文字列集約」です。Tim Hall の優れたサイトには、使用している Oracle の正確なバージョンに応じた代替手段が示されています

11gR2 (執筆時点) では、listagg 関数を使用する必要があります。

select
  efforts_id,
  listagg(cycle_name, ',') within group (order by cycle_name) as cycle_name,
  listagg(release_name, ',') within group (order by release_name) as release_name
from my_table
group by efforts_id;

wm_concat 関数の使用は、Oracle ではサポートされていないことに注意してください...

于 2012-10-30T15:45:42.783 に答える
6

LISTAGG()このタスクを実行するために使用します。他の回答では、重複した値は削除されません。重複を削除するには、次のようなものを使用できます。

select c.efforts_id, 
  c.cycle_name,
  listagg(r.release_name, ', ') within group (order by c.efforts_id) as release_name
from
(
  select efforts_id,
    listagg(cycle_name, ', ') within group (order by efforts_id) as cycle_name
  from yourtable
  group by efforts_id
) c
inner join
(
  select distinct efforts_id, release_name
  from yourtable
) r
  on c.efforts_id = r.efforts_id
group by c.efforts_id, c.cycle_name

デモで SQL Fiddle を参照してください

于 2012-10-30T16:06:54.473 に答える
2

Oracle 11g R2 を使用している場合は、LISTAGG を使用することをお勧めします。

SELECT efforts_id,
    LISTAGG(cycle_name) WITHIN GROUP(ORDER BY cycle_name),
    LISTAGG(release_name) WITHIN GROUP(ORDER BY cycle_name)
FROM MY_TABLE
GROUP BY efforts_id

そうでない場合、この記事では別の方法を示します。

于 2012-10-30T15:48:03.867 に答える
0

WM_concat関数を介して(そしてGROUP BYもちろん)

SELECT efforts_id, wm_concat(cycle_name), wm_concat(release_name)
FROM MY_TABLE
GROUP BY efforts_id

うーん、これを見つけた:

WM_CONCATはドキュメント化されておらず、Oracle によってサポートされていないことに注意してください。つまり、本番システムでは使用しないでください。 WM_CONCATと同じ出力を生成できるLISTAGG関数は、ドキュメント化されており、Oracle によってサポートされています。

于 2012-10-30T15:42:48.680 に答える