views:

287

answers:

5

If I have data like this in a table

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

how do I get results like this in a query (on sybase server)?

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

+2  A: 

You can't do this in a straight GROUP BY in plain-vanilla SQL. You have to use a cursor (or a similar construct) to concatenate the values in each group manually.

  • Oracle lets you define a custom aggregator which would do this concatenation in PL/SQL.
  • SQL Server lets you define a custom aggregator in .NET which would do this, as well.
  • I'm not sure about what options Sybase has for defining custom aggregators, though.
Dave Markle
Thanks, that was the only way I had heard of.
Jagmal
+2  A: 

I think you're going to have to use a cursor (http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/50501;pt=50305)

Dan Williams
A: 

It's been a few years since I've tried using the syntax and I no longer have access to an iAnywhere instance, but there was an aggregate function (list) to do such a task. I cannot confirm if LIST() is still supported.

SELECT id,
       LIST(data)
FROM   table
GROUP BY id
KDrewiske
A: 

In MsSQL you can use a function (Don't know if there is somenthing similar in 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

And then:

SELECT ID, dbo.GetDataForID(ID) as Data
FROM Table
GROUP BY ID
Eduardo Molteni
A: 

I know that in MySQL there is GROUP_CONCAT and in Sybase I think it's LIST as stated in another answer:

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