transponer - pivot y unpivot sql server
Cómo pivotar datos desde una tabla con SQL Server 2005 (1)
Esto realmente se puede hacer bastante fácilmente con una función PIVOT
. Como la otra respuesta no muestra el código asociado con la forma de realizarla, aquí hay dos formas de PIVOT
los datos.
Primero es con un pivote estático . Un pivote estático es cuando conoce los datos antes de tiempo para convertirlos en columnas.
select *
from
(
select name, id, convert(char(5), dt, 101) dt, jobid, amount
from test
) x
pivot
(
sum(amount)
for dt in ([01/02], [02/02], [03/02], [04/05], [05/05])
)p
order by jobid, name
Ver SQL Fiddle con demostración
La segunda forma es usar un Dynamic PIVOT para identificar en tiempo de ejecución los valores para convertirlos en columnas.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct '','' + QUOTENAME(convert(char(5), dt, 101))
from test
FOR XML PATH(''''), TYPE
).value(''.'', ''NVARCHAR(MAX)'')
,1,1,'''')
set @query = ''SELECT name, id, '' + @cols + '', jobid from
(
select name, id, convert(char(5), dt, 101) dt, jobid, amount
from test
) x
pivot
(
sum(amount)
for dt in ('' + @cols + '')
) p
order by jobid, name''
execute(@query)
Ver SQL Fiddle con demostración
Ambos producirán los mismos resultados. La dinámica funciona muy bien cuando no se conocen los valores antes de tiempo para convertir a columnas.
Me gustaría crear una consulta desde una sola tabla con las siguientes columnas.
SEQNO es una clave única
Name ID Amount Date JOBID SEQNO
Mark 9 200 1/2/09 1001 1
Peter 3 300 1/2/09 1001 2
Steve 1 200 2/2/09 1001 3
Mark 9 200 3/2/09 1001 4
Peter 3 300 4/2/09 1001 5
Steve 1 200 5/2/09 1001 6
Hally 1 200 5/2/09 1002 7
La consulta debe salir en este formato por SUBJOBID y un rango de fechas:
**NAME ID 1/2 2/2 3/2 4/2 5/2 JOBID**<br>
Mark 9 200 NULL 200 NULL NULL 1001
Peter 3 300 NULL NULL 300 NULL 1001
Steve 1 NULL 200 NULL NULL 200 1001
He estado revisando las consultas pivote para esto. Pero no parece llegar a ningún lado. ¿Podría alguien ayudar?