Registros Horizontalmente

22/04/2004 - 18:30 por José G. Díaz U. | Informe spam
Saludos.

La idea básicamente es esta:

El resultado de la consulta es:

12910333 20
12910333 16
12910333 15
12910333 19
12910333 17
12910333 18
12910333 18
12910333 19

La cantidad de registros no siempre es la misma.

Cómo podría hacer para que apareciera:

12910333 20 16 15 19 17 18 18 19

Gracias de antemano!

Joe
 

Leer las respuestas

#1 Liliana Sorrentino
22/04/2004 - 21:40 | Informe spam
Hola Jo,
Mi sugerencia, que no es simple, pero es lo único que se me ocurre:
- Hacer salir el resultado en una tabla con INTO (yo generé la tabla #test
para que pruebes).
- Numerar las filas dentro de cada grupo, porque imagino que podrías tener
otro dato además de 12910333, entonces cada uno de ellos sería un grupo.
- Correr un SP de referencias cruzadas con ocurrencias variables.
Espero que sirva, Liliana.

drop table #test
go
create table #test
(clave smallint,
orden smallint null,
dato smallint)
insert #test select 1, null, 10
insert #test select 1, null, 11
insert #test select 1, null, 12
insert #test select 1, null, 13
insert #test select 2, null, 20
insert #test select 2, null, 21

update #test
set orden = (SELECT COUNT(*)
FROM #test
WHERE clave = S.clave AND dato <= S.dato)
FROM #test AS S
select * from #test

complicado, pero vale la pena mirarlo detenidamente)

CREATE Procedure proc_Query_Pivot_1
@Base_Data_SQL varchar(2000), -- Table to use as recordsource to build
final crosstab qry
@Row_Headings varchar(200), -- Comma-separated list of rows to use as
groupings of data
@Column_Heading varchar(200), -- Column to use as heading
@Column_Head_SQL varchar(2000), -- SQL that returns set of possible
column headings
@Operation varchar(10), -- SUM, PRODUCT, etc
@Op_Argument varchar(200), -- Column to use as argument in operation
@Add_Row_Summary char(1) -- 'S' to include summary, 'N' to omit

AS

Declare @SQL varchar(2000),
@Summary_SQL varchar(2000) -- to summarize each row

Set @SQL = 'SELECT ' + @Row_Headings + ', '
Set @Summary_SQL = ''

CREATE TABLE #Col_Heads
(
Col_ID int identity(1,1),
Col_Head varchar(200) NULL
)
Exec ('INSERT INTO #Col_Heads(Col_Head) ' + @Column_Head_SQL)

DECLARE @Col_ID_Curr int, -- column being checked
@Col_ID_Old int,
@Curr_Col_Head varchar(200),
@Pivot_SQL varchar(200) -- pivot SQL for current column


SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Head = Col_Head
FROM #Col_Heads ORDER BY Col_ID

IF (@Col_ID_Curr IS NOT NULL )
BEGIN

Set @Col_ID_Old = @Col_ID_Curr - 1

WHILE (@Col_ID_Old <> @Col_ID_Curr)
BEGIN

Set @Pivot_SQL = char(13) + @Operation
+ '(CASE ' + @Column_Heading
+ ' WHEN ''' + @Curr_Col_Head + ''' THEN ' + @Op_Argument
+ ' ELSE SPACE(2) END) ' --AS ' + @Curr_Col_Head

Set @SQL = @SQL + ' ' + @Pivot_SQL

If (@Add_Row_Summary='S')
Set @Summary_SQL = @Summary_SQL + 'Pivot_Data.' + @Curr_Col_Head

Set @Col_ID_Old = @Col_ID_Curr
SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Head = Col_Head
FROM #Col_Heads
WHERE Col_ID > @Col_ID_Curr
ORDER BY Col_ID

IF (@Col_ID_Old <> @Col_ID_Curr)
Begin
Set @SQL = @SQL + ', '
Set @Summary_SQL = @Summary_SQL + ' + '
End
END
END

DROP TABLE #Col_Heads

Set @SQL = @SQL + char(13) + 'FROM (' + @Base_Data_SQL + ') AS Base_Data '
+ char(13) + 'GROUP BY ' + @Row_Headings

If (@Add_Row_Summary='S')
Begin
Set @SQL = 'SELECT Pivot_Data.*, ' + char(13)
+ ' (' + @Summary_SQL + ') AS RowTotal ' + char(13)
+ 'FROM (' + @SQL + ') AS Pivot_Data'
End


Print @SQL
Exec (@SQL)
go

exec proc_Query_Pivot_1
micondicion"
'SELECT clave, dato, orden FROM #test',
'clave',
'orden',
'SELECT distinct(orden) FROM #test',
'MAX',
quiero mostrar 'Si'
"dato",
'N'



"José G. Díaz U." escribió en el mensaje
news:
Saludos.

La idea básicamente es esta:

El resultado de la consulta es:

12910333 20
12910333 16
12910333 15
12910333 19
12910333 17
12910333 18
12910333 18
12910333 19

La cantidad de registros no siempre es la misma.

Cómo podría hacer para que apareciera:

12910333 20 16 15 19 17 18 18 19

Gracias de antemano!

Joe


Preguntas similares