Rows en una sola Col

19/05/2004 - 19:37 por Luis Cejas | Informe spam
Buenas, a ver si se entiende
Tengo una Tabla con éstos valores:
Col1 Col2
AAA A
AAA B
AAA E
AAA R
CCC R
BBB A
BBB R
BBB N
FFF C
FFF A

Y necesito sacar un listado así:
Col1 Col2
AAA ABER
CCC R
BBB ARN
FFF CA

Se podrá llegar a eso?

Preguntas similare

Leer las respuestas

#1 poker
19/05/2004 - 19:51 | Informe spam
Si tienes un número limitado de apariciones de la columna Col2 por cada
dato de la columna Col1, puedes probar algo parecido lo siguiente:

select a.Col1, isnull(b.Col2, '') + isnull(c.Col2, '') + isnull(c.Col2,
'') + isnull(d.Col2, '')
from TABLA a
left join TABLA b on a.Col1 < b.Col2
left join TABLA c on b.Col1 < c.Col2
left join TABLA d on c.Col1 < d.Col2

Aunque creo que te podrían salir cosas como ( con los datos de tu
ejemplo ):
AAA AER
AAA ABR

Pero es un inicio y puedes seguir perfeccionando la consulta


"Luis Cejas" escribió en el mensaje
news:
Buenas, a ver si se entiende
Tengo una Tabla con éstos valores:
Col1 Col2
AAA A
AAA B
AAA E
AAA R
CCC R
BBB A
BBB R
BBB N
FFF C
FFF A

Y necesito sacar un listado así:
Col1 Col2
AAA ABER
CCC R
BBB ARN
FFF CA

Se podrá llegar a eso?


Respuesta Responder a este mensaje
#2 poker
19/05/2004 - 20:04 | Informe spam
Otra posibilidad es crear un procedimiento almacenado con un cursor que te
rellene una tabla temporal y al final devuelves esa tabla temporal:

create procedure prueba as

create table #prueba (
Col1 varchar(3)
Col2 varchar(100)
)

declare cur cursor for
select Col1, Col2
from TABLA
order by Col1, Col2

set nocount on

declare @col1 varchar(3)
declare @col2 char
declare @ultimacol1 varchar(3) -- para saber cuando cambiamos de dato de la
columna 1
declare @cadena varchar(100) -- Para la columna 2 compuesta

open cur

fetch cur into @col1, @col2

set @ultimacol1 = @col1
set @cadena = ''

while @@fetch_status = 0
begin
set @cadena = @cadena + @col2
if @ultimacol1 <> @col1
begin
insert into #prueba (Col1, Col2) values (@col1, @cadena)
set @cadena = ''
end
fetch cur into @col1, @col2
end
insert into #prueba (Col1, Col2) values (@col1, @cadena)

close cur
deallocate cur

select Col1, Col2 from #prueba

print 'Te lo he dao mascao ¿eh?'

set nocount off
Respuesta Responder a este mensaje
#3 Luis Cejas
19/05/2004 - 20:06 | Informe spam
Aclaro que Col2 es Char(1) y pueden haber hasta 27 variables diferentes (A -
Z)
por eso no utilizo tu solución,
Gracias Poker igual por tu respuesta,
Luis


"poker" escribió en el mensaje
news:
Si tienes un número limitado de apariciones de la columna Col2 por


cada
dato de la columna Col1, puedes probar algo parecido lo siguiente:

select a.Col1, isnull(b.Col2, '') + isnull(c.Col2, '') +


isnull(c.Col2,
'') + isnull(d.Col2, '')
from TABLA a
left join TABLA b on a.Col1 < b.Col2
left join TABLA c on b.Col1 < c.Col2
left join TABLA d on c.Col1 < d.Col2

Aunque creo que te podrían salir cosas como ( con los datos de tu
ejemplo ):
AAA AER
AAA ABR

Pero es un inicio y puedes seguir perfeccionando la consulta


"Luis Cejas" escribió en el mensaje
news:
> Buenas, a ver si se entiende
> Tengo una Tabla con éstos valores:
> Col1 Col2
> AAA A
> AAA B
> AAA E
> AAA R
> CCC R
> BBB A
> BBB R
> BBB N
> FFF C
> FFF A
>
> Y necesito sacar un listado así:
> Col1 Col2
> AAA ABER
> CCC R
> BBB ARN
> FFF CA
>
> Se podrá llegar a eso?
>
>


Respuesta Responder a este mensaje
#4 Luis Cejas
19/05/2004 - 20:35 | Informe spam
Mi abuelo decía "Las cosas claras y el chocolate espeso"
Poker, lo tuyo es magestuoso,

Desde argentina te saluda y agradece,
Luis

"poker" escribió en el mensaje
news:%
Otra posibilidad es crear un procedimiento almacenado con un cursor que te
rellene una tabla temporal y al final devuelves esa tabla temporal:

create procedure prueba as

create table #prueba (
Col1 varchar(3)
Col2 varchar(100)
)

declare cur cursor for
select Col1, Col2
from TABLA
order by Col1, Col2

set nocount on

declare @col1 varchar(3)
declare @col2 char
declare @ultimacol1 varchar(3) -- para saber cuando cambiamos de dato de


la
columna 1
declare @cadena varchar(100) -- Para la columna 2 compuesta

open cur

fetch cur into @col1, @col2

set @ultimacol1 = @col1
set @cadena = ''

while @@fetch_status = 0
begin
set @cadena = @cadena + @col2
if @ultimacol1 <> @col1
begin
insert into #prueba (Col1, Col2) values (@col1, @cadena)
set @cadena = ''
end
fetch cur into @col1, @col2
end
insert into #prueba (Col1, Col2) values (@col1, @cadena)

close cur
deallocate cur

select Col1, Col2 from #prueba

print 'Te lo he dao mascao ¿eh?'

set nocount off


Respuesta Responder a este mensaje
#5 ulises
19/05/2004 - 21:37 | Informe spam
También lo puedes resolver creando una función y sin
cursores ni tablas temporales:

create function dbo.obtienesecuencia ( @col1 char(3) )
returns varchar(1000)
as
begin
declare @cadena varchar(1000)
set @cadena = ''
select @cadena = @cadena + col2 from tempo2 where col1 =
@col1
return(@cadena)
end

select distinct col1, dbo.obtienesecuencia(col1)
from tempo2
order by col1

resultado :

col1
-
AAA ABER
BBB ARN
CCC R
FFF CA

(4 row(s) affected)

Saludos,
Ulises

Otra posibilidad es crear un procedimiento almacenado con


un cursor que te
rellene una tabla temporal y al final devuelves esa tabla


temporal:

create procedure prueba as

create table #prueba (
Col1 varchar(3)
Col2 varchar(100)
)

declare cur cursor for
select Col1, Col2
from TABLA
order by Col1, Col2

set nocount on

declare @col1 varchar(3)
declare @col2 char
declare @ultimacol1 varchar(3) -- para saber cuando


cambiamos de dato de la
columna 1
declare @cadena varchar(100) -- Para la columna 2


compuesta

open cur

fetch cur into @col1, @col2

set @ultimacol1 = @col1
set @cadena = ''

while @@fetch_status = 0
begin
set @cadena = @cadena + @col2
if @ultimacol1 <> @col1
begin
insert into #prueba (Col1, Col2) values


(@col1, @cadena)
siguiente
set @cadena = ''
end
fetch cur into @col1, @col2
end
insert into #prueba (Col1, Col2) values (@col1, @cadena)

close cur
deallocate cur

select Col1, Col2 from #prueba

print 'Te lo he dao mascao ¿eh?'

set nocount off


.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida