Agrupar valores en un campo

11/05/2005 - 00:23 por Lixus | Informe spam
Hola a todos,

Mi pregunta es, ¿cómo puedo agrupar valores de varios registros en un solo
campo?. Por ejemplo:

Una tabla que tenga dos campos con los valores

Id_ReferenciaFK Autor

001 Autor1
002 Autor2
002 Autor3
002 Autor1
003 Autor4
003 Autor5

Cómo puedo hacer una vista que muestre los campos

Id_ReferenciaFK Autor

001 Autor1
002 Autor2; Autor3; Autor1
003 Autor4; Autor5

Muchas gracias por todo

Preguntas similare

Leer las respuestas

#1 Patarroxa
11/05/2005 - 11:52 | Informe spam
Hola,

Pues unha manera de hacerlo es con Coalesce, como en este artículo que
explica cómo construir listas de valores separadas por comas a partir
de columnas [http://www.sqlteam.com/item.asp?ItemID#68]. Lo malo es
que es necesario un cursor.

Saúdos, Xosé Antonio Rubal.
Respuesta Responder a este mensaje
#2 Angel J. Hernández M.
11/05/2005 - 11:53 | Informe spam
Podrías conseguir lo que quieres haciendo uso de una función definida por
usuario. A continuación te muestro como sería

create table Tabla (Id_ReferenciaFK char(3), Autor varchar(10))
go

insert into tabla values('001','Autor1')
insert into tabla values('002','Autor2')
insert into tabla values('002','Autor3')
insert into tabla values('002','Autor1')
insert into tabla values('003','Autor4')
insert into tabla values('003','Autor5')
go


Create function fn_Prueba(@id_referencia char(3))
returns varchar(50) As
Begin
Declare @temp varchar(50),
@temp2 varchar(10)

set @temp = ''
set @temp2 = ''

Declare cTemp Cursor Scroll
For Select Autor
From tabla
Where id_referenciafk = @id_referencia

open cTemp
Fetch First From cTemp Into @temp2

while (@@fetch_status = 0) Begin
set @temp = @temp + ';' + @temp2
Fetch Next From cTemp Into @temp2
end

set @temp = substring(@temp, 2, len(@temp) - 1)

close cTemp
Deallocate cTemp

Return @temp
End
go


Create View MiVista
as select tabla.*, 'Agrupado'=dbo.fn_Prueba(tabla.Id_ReferenciaFK)
from tabla
go

select * from MiVista
go

Los resultados serían los siguientes

Id_ReferenciaFK Autor Agrupado
001 Autor1 Autor1
002 Autor2 Autor2;Autor3;Autor1
002 Autor3 Autor2;Autor3;Autor1
002 Autor1 Autor2;Autor3;Autor1
003 Autor4 Autor4;Autor5
003 Autor5 Autor4;Autor5

(6 row(s) affected)

Espero te sirva,

Saludos



Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda



"Lixus" escribió en el mensaje
news:
Hola a todos,

Mi pregunta es, ¿cómo puedo agrupar valores de varios registros en un solo
campo?. Por ejemplo:

Una tabla que tenga dos campos con los valores

Id_ReferenciaFK Autor

001 Autor1
002 Autor2
002 Autor3
002 Autor1
003 Autor4
003 Autor5

Cómo puedo hacer una vista que muestre los campos

Id_ReferenciaFK Autor

001 Autor1
002 Autor2; Autor3; Autor1
003 Autor4; Autor5

Muchas gracias por todo


Respuesta Responder a este mensaje
#3 Liliana Sorrentino
11/05/2005 - 13:32 | Informe spam
Hola,
Una propuesta sin cursores, tomando de base la misma tabla:

CREATE FUNCTION agrupa (@clave char(3))
RETURNS varchar(50)

AS

BEGIN
DECLARE @autor VARCHAR(50)
SET @autor = ''
SELECT @autor = @autor + rtrim(ltrim(autor)) + ', ' FROM tabla WHERE clave
= @clave
RETURN @autor
END
GO

SELECT DISTINCT clave, agrupa(clave)
FROM tabla



"Angel J. Hernández M." escribió en el mensaje
news:
Podrías conseguir lo que quieres haciendo uso de una función definida por
usuario. A continuación te muestro como sería

create table Tabla (Id_ReferenciaFK char(3), Autor varchar(10))
go

insert into tabla values('001','Autor1')
insert into tabla values('002','Autor2')
insert into tabla values('002','Autor3')
insert into tabla values('002','Autor1')
insert into tabla values('003','Autor4')
insert into tabla values('003','Autor5')
go


Create function fn_Prueba(@id_referencia char(3))
returns varchar(50) As
Begin
Declare @temp varchar(50),
@temp2 varchar(10)

set @temp = ''
set @temp2 = ''

Declare cTemp Cursor Scroll
For Select Autor
From tabla
Where id_referenciafk = @id_referencia

open cTemp
Fetch First From cTemp Into @temp2

while (@@fetch_status = 0) Begin
set @temp = @temp + ';' + @temp2
Fetch Next From cTemp Into @temp2
end

set @temp = substring(@temp, 2, len(@temp) - 1)

close cTemp
Deallocate cTemp

Return @temp
End
go


Create View MiVista
as select tabla.*, 'Agrupado'=dbo.fn_Prueba(tabla.Id_ReferenciaFK)
from tabla
go

select * from MiVista
go

Los resultados serían los siguientes

Id_ReferenciaFK Autor Agrupado

001 Autor1 Autor1
002 Autor2 Autor2;Autor3;Autor1
002 Autor3 Autor2;Autor3;Autor1
002 Autor1 Autor2;Autor3;Autor1
003 Autor4 Autor4;Autor5
003 Autor5 Autor4;Autor5

(6 row(s) affected)

Espero te sirva,

Saludos



Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda



"Lixus" escribió en el mensaje
news:
> Hola a todos,
>
> Mi pregunta es, ¿cómo puedo agrupar valores de varios registros en un


solo
> campo?. Por ejemplo:
>
> Una tabla que tenga dos campos con los valores
>
> Id_ReferenciaFK Autor
>
> 001 Autor1
> 002 Autor2
> 002 Autor3
> 002 Autor1
> 003 Autor4
> 003 Autor5
>
> Cómo puedo hacer una vista que muestre los campos
>
> Id_ReferenciaFK Autor
>
> 001 Autor1
> 002 Autor2; Autor3; Autor1
> 003 Autor4; Autor5
>
> Muchas gracias por todo
>
>


Respuesta Responder a este mensaje
#4 Lixus
11/05/2005 - 13:52 | Informe spam
Perfecto, muchísimas gracias, eso era lo que buscaba. He probado a crear la
función y la vista y ha salido perfecto.

Sabía que había que utilizar cursores, pero no sabía cómo meterlos en las
vistas y no había caído en lo de las funciones.

Gracias de nuevo y un saludo
Respuesta Responder a este mensaje
#5 Patarroxa
11/05/2005 - 18:32 | Informe spam
Hola,

Perfecto, no sabía que @var = @var + 'algo' funcionara en un select,
acumulando todas las filas. Ahora lo ideal sería que pudieramos
definir una funcion tipo:

Create Function Agrupa(@tabla varchar(256), @columna varchar(256),
@separador varchar(256))

pero la única manera que se me ocurre es usuando sql dinámico
(Exec(@SQL)) para construír la sentencia SQL a medida, según los
parámetros de entrada, y resulta que las UDF no soportan ese uso del
Execute, sniff,...

Saúdos. Xosé Antonio Rubal.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida