如何获取GROUP_BY子句中的值列表?

时间:2009-01-29 13:25:31

标签: sql group-by sybase

如果我在表格中有这样的数据

id   data
--   ----
1    1
1    2
1    3
2    4
2    5
3    6
3    4

如何在查询中(在sybase服务器上)获得这样的结果?

id   data
--   ----
1    1, 2, 3
2    4, 5
3    6, 4

13 个答案:

答案 0 :(得分:12)

我知道在MySQL中有GROUP_CONCAT,在Sybase中我认为它是LIST,如另一个答案中所述:

SELECT id, LIST(data||', ')
FROM yourtable
GROUP BY id

答案 1 :(得分:5)

在MsSQL中你可以使用一个函数(不知道SyBase中是否有类似的东西)

CREATE FUNCTION [dbo].[GetDataForID]
(
    @ID int
)
RETURNS varchar(max)
AS
BEGIN
    declare @output varchar(max)
    select @output = COALESCE(@output + ', ', '') + data
    from table
    where ID = @ID

    return @output
END
GO

然后:

SELECT ID, dbo.GetDataForID(ID) as Data
FROM Table
GROUP BY ID

答案 2 :(得分:3)

在PL / SQL中,您可以通过以下方式完成:

SELECT id, LISTAGG(data, ',') WITHIN GROUP(ORDER BY 0) "data"
  FROM yourtable
 GROUP BY id

答案 3 :(得分:2)

你不能在普通的SQL中直接使用GROUP BY。您必须使用游标(或类似的构造)手动连接每个组中的值。

  • Oracle允许您定义一个自定义聚合器,它将在PL / SQL中执行此连接。
  • SQL Server允许您在.NET中定义自定义聚合器,以便执行此操作。
  • 我不确定Sybase在定义自定义聚合器方面有哪些选择。

答案 4 :(得分:2)

对于PostgreSQL,使用类似的函数string_agg

SELECT id, string_agg(data, ',')
FROM yourtable
GROUP BY id

答案 5 :(得分:1)

答案 6 :(得分:1)

在mysql中,使用

SELECT id, GROUP_CONCAT(data)
 FROM yourtable
 GROUP BY id

或使用您的自定义分隔符:

SELECT id, GROUP_CONCAT(data SEPARATOR ', ')
 FROM yourtable
 GROUP BY id

请参见GROUP_CONCAT

答案 7 :(得分:0)

自从我尝试使用语法已经过去几年了,我不再能够访问iAnywhere实例,但是有一个聚合函数(list)来执行这样的任务。我无法确认是否仍然支持LIST()。

SELECT id,
       LIST(data)
FROM   table
GROUP BY id

答案 8 :(得分:0)

试试这个:

SELECT id,
       GROUP_CONCAT(data)
FROM   table
GROUP BY id

答案 9 :(得分:0)

在SQL Server中:

select distinct b.id, data=STUFF((select ',' +convert(varchar,id)
from yourtable a
where a.id=b.id
for xml path ('')),1,1,'')
from yourtable b

答案 10 :(得分:0)

对于Presto,请使用array_agg

SELECT id, array_agg(data)
FROM yourtable
GROUP BY id

答案 11 :(得分:0)

对于 SQL 服务器:

SELECT id, STRING_AGG(data, ',')
FROM your_table
GROUP BY id;

答案 12 :(得分:0)

对于 SparkSQL(例如查询 AWS Athena 时):

SELECT id, ARRAY_JOIN(ARRAY_AGG(data), ',')
FROM your_table
GROUP BY id;