Agrupar cadenas en un solo campo

03/11/2009 - 13:37 por DT | Informe spam
Hola grupo!
Tengo lo siguiente:

CodCli Tipo Pais
1 B CO
1 A EC
2 B CO
3 C PE
3 B BR

Necesito obtener este resultado:
CodCli Tipo Pais
1 A,B CO,EC
2 B CO
3 C,B PE,BR

Muchas gracias por su ayuda!
Tengo SQL 2005

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
03/11/2009 - 13:52 | Informe spam
Hay varias opciones, pero una de las más típicas es usando FOR XML PATH:


DECLARE @t TABLE ( codcli int ,
tipo char(1) ,
pais char(2) )

INSERT @t
SELECT 1 , 'B' , 'CO'
UNION
SELECT 1 , 'A' , 'EC'
UNION
SELECT 2 , 'B' , 'CO'
UNION
SELECT 3 , 'C' , 'PE'
UNION
SELECT 3 , 'B' , 'BR'

SELECT DISTINCT codcli , stuff ( t.tipos , 1 , 1 , '' ) tipos , stuff (
p.paises , 1 , 1 , '' ) paises
FROM @t cli
CROSS apply ( SELECT ',' + tipo
FROM @t
WHERE cli.codcli = codcli
FOR XML PATH ( '' ) ) t ( tipos )
CROSS apply ( SELECT ',' + pais
FROM @t
WHERE cli.codcli = codcli
FOR XML PATH ( '' ) ) p ( paises )

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"DT" wrote in message
news:
Hola grupo!
Tengo lo siguiente:

CodCli Tipo Pais
1 B CO
1 A EC
2 B CO
3 C PE
3 B BR

Necesito obtener este resultado:
CodCli Tipo Pais
1 A,B CO,EC
2 B CO
3 C,B PE,BR

Muchas gracias por su ayuda!
Tengo SQL 2005
Respuesta Responder a este mensaje
#2 DT
03/11/2009 - 14:36 | Informe spam
Funciona de maravilla!
Gracias!

"Carlos Sacristan" wrote in message
news:%
Hay varias opciones, pero una de las más típicas es usando FOR XML PATH:


DECLARE @t TABLE ( codcli int ,
tipo char(1) ,
pais char(2) )

INSERT @t
SELECT 1 , 'B' , 'CO'
UNION
SELECT 1 , 'A' , 'EC'
UNION
SELECT 2 , 'B' , 'CO'
UNION
SELECT 3 , 'C' , 'PE'
UNION
SELECT 3 , 'B' , 'BR'

SELECT DISTINCT codcli , stuff ( t.tipos , 1 , 1 , '' ) tipos , stuff (
p.paises , 1 , 1 , '' ) paises
FROM @t cli
CROSS apply ( SELECT ',' + tipo
FROM @t
WHERE cli.codcli = codcli
FOR XML PATH ( '' ) ) t ( tipos )
CROSS apply ( SELECT ',' + pais
FROM @t
WHERE cli.codcli = codcli
FOR XML PATH ( '' ) ) p ( paises )

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"DT" wrote in message
news:
Hola grupo!
Tengo lo siguiente:

CodCli Tipo Pais
1 B CO
1 A EC
2 B CO
3 C PE
3 B BR

Necesito obtener este resultado:
CodCli Tipo Pais
1 A,B CO,EC
2 B CO
3 C,B PE,BR

Muchas gracias por su ayuda!
Tengo SQL 2005



Respuesta Responder a este mensaje
#3 Alejandro Mesa
03/11/2009 - 14:52 | Informe spam
DT,

Si usas SS 2005 / 2008, entonces puedes usar la facilidad "for xml" de la
sentencia "select".

Ejemplo:

select
A.CodCli,
stuff((
select cast(',' as varchar(max)) + B.Tipo
from T as B
where B.CodCli = A.CodCli
order by B.Tipo
for xml path('')
), 1, 1, '') as Tipos,
stuff((
select cast(',' as varchar(max)) + B.Pais
from T as B
where B.CodCli = A.CodCli
order by B.Pais
for xml path('')
), 1, 1, '') as Paises
from
(select distinct CodCli from T) as A;
GO

Aqui tienes un articulo donde se explica unos cuantos metodos de obtener esto.

Concatenating row values in Transact-SQL
http://www.projectdmx.com/tsql/rowconcatenate.aspx

AMB


"DT" wrote:

Hola grupo!
Tengo lo siguiente:

CodCli Tipo Pais
1 B CO
1 A EC
2 B CO
3 C PE
3 B BR

Necesito obtener este resultado:
CodCli Tipo Pais
1 A,B CO,EC
2 B CO
3 C,B PE,BR

Muchas gracias por su ayuda!
Tengo SQL 2005
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida