如果我在表格中有这样的数据
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
我知道在 MySQL 中有GROUP_CONCAT而在 Sybase 我认为它是LIST,如另一个答案中所述:
SELECT id, LIST(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
对于 PostgreSQL,使用类似的函数string_agg。
SELECT id, string_agg(data, ',')
FROM yourtable
GROUP BY id
在 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
在 PL/SQL 中,您可以通过以下方式完成:
SELECT id, LISTAGG(data, ',') WITHIN GROUP(ORDER BY 0) "data"
FROM yourtable
GROUP BY id
您不能在普通 SQL 中的直接 GROUP BY 中执行此操作。您必须使用游标(或类似结构)手动连接每个组中的值。
对于 SQL 服务器:
SELECT id, STRING_AGG(data, ',')
FROM your_table
GROUP BY id;
试试这个:
SELECT id,
GROUP_CONCAT(data)
FROM table
GROUP BY id
我认为您将不得不使用光标(http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/50501;pt=50305)
对于 Presto,使用array_agg
SELECT id, array_agg(data)
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
自从我尝试使用该语法已经有几年了,我不再可以访问 iAnywhere 实例,但是有一个聚合函数(列表)可以完成这样的任务。我无法确认 LIST() 是否仍受支持。
SELECT id,
LIST(data)
FROM table
GROUP BY id
对于 SparkSQL(例如查询 AWS Athena 时):
SELECT id, ARRAY_JOIN(ARRAY_AGG(data), ',')
FROM your_table
GROUP BY id;