将一列的多个结果行连接为一个,按另一列连接

时间:2013-04-06 05:00:27

标签: sql postgresql aggregate-functions

我有一张这样的桌子

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

我想获得电影的名称以及该电影中的所有演员,我希望结果的格式如下:

Movie   ActorList
 A       1, 2, 3

我该怎么做?

3 个答案:

答案 0 :(得分:164)

使用聚合函数string_agg()(Postgres 9.0或更高版本)更简单:

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

1中的GROUP BY 1是位置参考,在这种情况下是GROUP BY movie的快捷方式。

string_agg()期望数据类型text作为输入。其他类型需要显式转换(actor::text) - ,除非定义了对text的隐式转换 - 所有其他字符类型都是如此(varcharcharacter"char")和其他一些类型。

作为isapir commented,您可以在聚合调用中添加ORDER BY子句以获取排序列表 - 如果需要,可以。像:

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

但是在子查询中对行进行排序通常会更快。参见:

答案 1 :(得分:34)

您可以使用array_agg功能:

SELECT "Movie",
array_to_string(array_agg(distinct "Actor"),',') AS Actor
FROM Table1
GROUP BY "Movie";

结果:

| MOVIE | ACTOR |
-----------------
|     A | 1,2,3 |
|     B |     4 |

请参阅this SQLFiddle

更多信息,请参阅9.18. Aggregate Functions

答案 2 :(得分:-4)

 select movie,GROUP_CONCAT(DISTINCT Actor) as ActorList from toyr_table group by movie 

你可以在这里阅读http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php