2009-01-29 17 views
19

Si tengo los datos de este tipo en una mesa¿Cómo obtener la lista de valores en la cláusula GROUP_BY?

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

¿Cómo puedo obtener resultados como este en una consulta (en el servidor Sybase)?

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

Lo sentimos, no entiendo la pregunta. . . en absoluto –

+0

@Binary Worrier, Ups, el formateo se estropeó. Editándolo – Jagmal

+0

No se preocupe, Jagmal, está arreglado. – paxdiablo

Respuesta

2

No se puede hacer esto en un GROUP BY directo en SQL simple. Debe usar un cursor (o una construcción similar) para concatenar manualmente los valores de cada grupo.

  • Oracle le permite definir un agregador personalizado que haría esta concatenación en PL/SQL.
  • SQL Server le permite definir un agregador personalizado en .NET que también lo haría.
  • No estoy seguro de qué opciones tiene Sybase para definir agregadores personalizados.
+0

Gracias, esa era la única forma en que había oído hablar. – Jagmal

+0

Sybase le permite definir funciones de agregación definidas por el usuario en C/C++. – cwills

0

Ha sido un par de años desde que he intentado usar la sintaxis y ya no tienen acceso a una instancia iAnywhere, pero había una función agregada (lista) para hacer tal tarea. No puedo confirmar si LIST() todavía es compatible.

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

Parece que no es compatible con SQL Server 2008 R2 (10.50.2500) ("'LIST' no es un nombre de función incorporado reconocido.") –

4

En MsSQL puede utilizar una función (No sé si hay somenthing similar en 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 

Y luego:

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

sé que existe en MySQL es GROUP_CONCAT y en Sybase creo que es LIST como se indica en otra respuesta:

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

¡esa es la cuestión! gracias –

0

prueba este:

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

Eso es para MySql, no para Sybase como se especifica en la pregunta. –

+0

intente leer las respuestas existentes ... – Yura

0

Para PostgreSQL, utilizando una función similar string_agg.

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

En PL/SQL puede hacerlo por:

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