transponer datos de vertical a horizontal

06/04/2016 - 00:50 por peca | Informe spam
necesito su colaboracion sobre esta consulta de ver datos que tengo en una tabla de forma vertical y quiero mostrarlos horizontalmente como adjunto el cuadrito
codigo fecha descripcion importe
2 022016 LUNES 4991.22
2 022016 MARTES 767.88
2 022016 MIERCOLES 549.03
2 122016 LUNES 1032.63
2 122016 VIERNES 132.63
2 122016 MIERCOLES 519.03
asi se muestran los datos cuando hago el select pero utilice una consulta que vi aqui en el foro y me muestra los datos sin los importes. y lo que quiero es que los muestre asi:
codigo fecha LUNES MARTES MIERCOLES
2 022016 4991.22 767.88 549.03
2 122016 1032.63 132.63 519.03

agradesco sus ayuda por anticipado.
gracias,
 

Leer las respuestas

#1 cpb.sos
08/04/2016 - 21:04 | Informe spam
Utiliza el sp sp_Query_Pivot indicado abajo

EXEC [dbo].[sp_Query_Pivot]
'#TMP', --puedes reemplazarlos por un script. La tabla temporal es más manejable.
'CODIGO, FECHA',
'DESCRIPCION',
'SELECT nombredia from dias order by numerodia', --tambien puedes utilizar select distinct descrpcion from #tmp pero tienes que colocar un case para el orden.
'importe', --pueden ser varios campos
'sum', --igual que lista de campos
1 --para totalizar

CREATE procedure [dbo].[sp_Query_Pivot]
@Base_Data_SQL varchar(8000), -- Tabla o select
@Row_Groups varchar(800), -- Campos separados por comas
@Column_Heading varchar(800), -- Columna cabecera
@Column_Head_SQL varchar(8000), -- SQL que genera las columnas
@Operation varchar(200), -- Lista de funciones agrupamiento
@Op_Argument varchar(800), -- Lista de campos a agrupar
@Row_Headings varchar(800) = '', -- Lista de grupos
@Columns_Order varchar(800) = '', -- Orden de columnas
@Add_Row_Summary bit = 0, -- Adicionar totales
@Tmp bit = 0, -- Utilizar una tabla temporal
@Campos2 varchar(800) = '', -- Lista de campos de la tabla temporal
@Order2 varchar(800) = '', -- Orden de tabla temporal
@Where2 varchar(800) = '', -- Condición de tabla temporal
@tipodato varchar(20) = 'decimal(20,2)' --Tipo de datos de las columnas generadas

AS

if @Row_Headings = '' set @Row_Headings = @Row_Groups
if @Columns_Order <> '' SET @Columns_Order = ' ORDER BY ' + @Columns_Order
if @Order2 <> '' SET @Order2 = ' ORDER BY ' + @Order2
if @Where2 <> '' SET @Where2 = ' WHERE ' + @Where2 + ' '

create table #Summary(id int identity, Aux varchar(400), Summary_SQL varchar(4000))

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

declare @TableTmp varchar(400)
declare @Op_Arg varchar(200)
declare @Op_Aux varchar(20)
declare @sep1 varchar(1)
declare @Multi Bit
declare @Aux varchar(200)
declare @Pos1 int
declare @Pos2 int
declare @Op_Argument_Orig varchar(800)
declare @Operation_Orig varchar(200)
declare @i int
declare @r int


set @Op_Argument_Orig = @Op_Argument
set @Operation_Orig = @Operation

set @pos1 = 1
while @pos1 >0
begin
set @pos1 = charindex(',', @Op_Argument)
set @pos2 = charindex(',', @Operation)
if @pos1 <> 0
begin
set @Op_Arg = left(@Op_Argument, @pos1 - 1)
set @Op_Argument = substring(@Op_Argument, @pos1 + 1, len(@Op_Argument))

set @Op_Aux = left(@Operation, @pos2 - 1)
set @Operation = substring(@Operation, @pos2 + 1, len(@Operation))
set @sep1 = ','
set @multi = 1

end
else
begin
set @Op_Arg = @Op_Argument
set @Op_Aux = @Operation
set @sep1 = ''
set @sep1 = ''
end

if @Add_Row_Summary=1
insert into #Summary values('[Total '+ @Op_Arg + ']', '')

end

set @Op_Argument = @Op_Argument_Orig
set @Operation = @Operation_Orig


SET @SQL = 'SELECT TOP 100 PERCENT ' + @Row_Headings + ', '
Set @Summary_SQL = ''


CREATE TABLE #Col_Heads
(
Col_ID int identity(1,1),
Col_Head varchar(400) 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 @Op_Argument_Orig = @Op_Argument
set @Operation_Orig = @Operation
Set @pos1 = 1
set @aux = ''

set @Pivot_SQL = ''
set @r = 0
while @pos1 >0
begin
set @pos1 = charindex(',', @Op_Argument)
set @pos2 = charindex(',', @Operation)
if @pos1 <> 0
begin
set @Op_Arg = left(@Op_Argument, @pos1 - 1)
set @Op_Argument = substring(@Op_Argument, @pos1 + 1, len(@Op_Argument))

set @Op_Aux = left(@Operation, @pos2 - 1)
set @Operation = substring(@Operation, @pos2 + 1, len(@Operation))
set @sep1 = ','
set @multi = 1

end
else
begin
set @Op_Arg = @Op_Argument
set @Op_Aux = @Operation
set @sep1 = ''
set @sep1 = ''
end
set @r = @r + 1
if @multi = 1
set @aux = '_' + @Op_Arg

Set @Pivot_SQL = char(13) + @Op_Aux
+ '(CASE ' + @Column_Heading
+ ' WHEN ''' + replace(@Curr_Col_Head, char(39), char(39) + char(39)) + ''' THEN ' + @Op_Arg
+ ' ELSE NULL END) AS [' + @Curr_Col_Head + @aux + ']' + @sep1
Set @SQL = @SQL + ' ' + @Pivot_SQL
If (@Add_Row_Summary=1)
update #Summary
Set Summary_SQL = Summary_SQL + 'convert(' + @tipodato + ', isnull(Pivot_Data.[' + @Curr_Col_Head+@aux +'], ''0''))+' where id = @r
end

set @Op_Argument = @Op_Argument_Orig
set @Operation = @Operation_Orig


set @i = 0

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 + ', '
End

END
END



DROP TABLE #Col_Heads


DECLARE @ID INT
SET @ID = OBJECT_ID(case when left(@Base_Data_SQL, 1) = '#' then 'tempdb..' else '' end + @Base_Data_SQL)


IF @ID IS NOT NULL
SET @Base_Data_SQL = 'SELECT * FROM ' + @Base_Data_SQL


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


SET @SQL = @SQL + @Columns_Order
If (@Add_Row_Summary=1)
begin
if (select count(*) from #Summary) = 1
update #Summary set Aux = 'TOTAL'
update #Summary set Summary_SQL = left(Summary_SQL, len(Summary_SQL)-1) + ' AS ' + Aux
while @i < @r
begin
set @i = @i + 1
Set @Summary_SQL = @Summary_SQL + (select Summary_SQL from #Summary where id = @i) + case when @i < @r then ',' else '' end
end
end


If (@Add_Row_Summary=1)
Begin
if @Tmp = 1
begin
Set @SQL = 'SELECT Pivot_Data.*, ' + char(13)
+ ' ' + @Summary_SQL + ' /*AS TOTAL*/ ' + char(13)
+ 'FROM (' + @SQL + ') AS Pivot_Data '
Set @SQL = 'SELECT ' + @Campos2 + char(13)
+ 'INTO #Pivot_Data FROM (' + @SQL + ') AS Pivot_Data ' + char(13)
Set @SQL = @SQL + ' SELECT * FROM #Pivot_Data ' + @Order2

end
else
Set @SQL = 'SELECT Pivot_Data.*, ' + char(13)
+ ' ' + @Summary_SQL + ' /*AS TOTAL*/ ' + char(13)
+ 'FROM (' + @SQL + ') AS Pivot_Data ' + @Columns_Order
End
else
if @Tmp = 1
begin
Set @SQL = 'SELECT ' + @Campos2 + char(13)
+ 'INTO #Pivot_Data FROM (' + @SQL + ') AS Pivot_Data ' + char(13)
Set @SQL = @SQL + ' SELECT * FROM #Pivot_Data ' + @Where2 + @Order2
end


Exec (@SQL)






El martes, 5 de abril de 2016, 17:50:30 (UTC-5), peca escribió:
necesito su colaboracion sobre esta consulta de ver datos que tengo en una tabla
de forma vertical y quiero mostrarlos horizontalmente como adjunto el cuadrito
codigo fecha descripcion importe
2 022016 LUNES 4991.22
2 022016 MARTES 767.88
2 022016 MIERCOLES 549.03
2 122016 LUNES 1032.63
2 122016 VIERNES 132.63
2 122016 MIERCOLES 519.03
asi se muestran los datos cuando hago el select pero utilice una consulta que
vi
aqui en el foro y me muestra los datos sin los importes. y lo que quiero es que
los muestre asi:
codigo fecha LUNES MARTES MIERCOLES
2 022016 4991.22 767.88 549.03
2 122016 1032.63 132.63 519.03

agradesco sus ayuda por anticipado.
gracias,

Preguntas similares