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

Sql 如何获取GROUP_BY子句中的值列表?,sql,group-by,sybase,Sql,Group By,Sybase,如果我在表格中有这样的数据 id data -- ---- 1 1 1 2 1 3 2 4 2 5 3 6 3 4 如何在查询中获得这样的结果(在sybase server上) 在普通的SQL中,不能在直接的分组中执行此操作。您必须使用游标(或类似构造)手动连接每个组中的值 Oracle允许您定义一个自定义聚合器,该聚合器将在PL/SQL中执行此连接 SQL Server允许您在.NET中定义一个自定义聚合器,该聚合器也可以这样做 不过,我不

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

id   data
--   ----
1    1
1    2
1    3
2    4
2    5
3    6
3    4
如何在查询中获得这样的结果(在sybase server上)


在普通的SQL中,不能在直接的分组中执行此操作。您必须使用游标(或类似构造)手动连接每个组中的值

  • Oracle允许您定义一个自定义聚合器,该聚合器将在PL/SQL中执行此连接
  • SQL Server允许您在.NET中定义一个自定义聚合器,该聚合器也可以这样做
  • 不过,我不确定Sybase有哪些定义自定义聚合器的选项

我认为您将不得不使用游标()

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

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

在MsSQL中,您可以使用函数(不知道SyBase中是否有类似的功能)

然后:

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

我知道在MySQL中有,而在Sybase中,我认为这正如另一个答案所述:

SELECT id, LIST(data||', ')
FROM yourtable
GROUP BY id
试试这个:

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

对于PostgreSQL,使用类似的函数


在PL/SQL中,可以通过以下方式实现:

SELECT id, LISTAGG(data, ',') WITHIN GROUP(ORDER BY 0) "data"
  FROM yourtable
 GROUP BY id
在mysql中,使用

SELECT id, GROUP_CONCAT(data)
 FROM yourtable
 GROUP BY id
或者使用自定义分隔符:

SELECT id, GROUP_CONCAT(data SEPARATOR ', ')
 FROM yourtable
 GROUP BY id
请参见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
对于Presto,使用

对于SQL server:

SELECT id, STRING_AGG(data, ',')
FROM your_table
GROUP BY id;
对于SparkSQL(例如,查询AWS Athena时):

选择id,数组连接(数组聚合(数据),',')
从你的桌子上
按id分组;

Sybase允许您在C/C++中定义用户定义的聚合函数。SQL Server 2008 R2(10.50.2500)似乎不支持它(“LIST”不是可识别的内置函数名。”)这是针对MySql的,而不是问题中指定的Sybase。对于HiveQL,请参阅。我认为OP将其标记为Sybase SQL问题谢谢,我在presto sql中需要这个,但不知道mysql的group_concat name的等效名称。group_concat上的链接已移动:
SELECT id, GROUP_CONCAT(data SEPARATOR ', ')
 FROM yourtable
 GROUP BY id
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
SELECT id, array_agg(data)
FROM yourtable
GROUP BY id
SELECT id, STRING_AGG(data, ',')
FROM your_table
GROUP BY id;