1. ホーム
  2. sql

[解決済み] 1つのカラムの複数の結果行を1つにまとめ、別のカラムでグループ化する[重複]。

2022-04-21 13:18:56

質問

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

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

ある映画の名前と、その映画に出演しているすべての俳優を取得したいのですが、結果はこのような形式にしたいのです。

Movie   ActorList
 A       1, 2, 3

どうすればいいのでしょうか?

どのように解決するのですか?

集計機能でより簡単に string_agg() (Postgres 9.0 以降)。

SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

1GROUP BY 1 は位置参照で、ショートカットは GROUP BY movie この場合

string_agg() はデータ型を期待します。 text を入力とします。その他の型は明示的にキャストする必要があります ( actor::text ) - ただし への暗黙のキャストです。 text が定義されている場合 - これは他のすべての文字型 ( varchar , character , "char" )、その他いくつかのタイプがあります。

として isapirのコメント を追加することができます。 ORDER BY 節を使用して、ソートされたリストを取得することができます。のように。

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

しかし、一般的にはサブクエリで行をソートする方が高速です。見てください。