Tablas pivote

30/05/2009 - 23:46 por Rosa Mendoza | Informe spam
Hola les quiero pedir esta ayuda:

Tengo esta tabla:

Codigo Sitio cantidad
1 1 230
1 2 34
1 3 20
2 1 10

Y deseo hacer un selkect que los muestre:

Codigo Sitio1 Sitio2 Sitio3
1 230 34 20
2 10 0 0

El problema es que pueden haber n Sitios...

Por favor les pido su ayuda.

Gracias


Rosa Mendoza
edberlith@gmail.com
 

Leer las respuestas

#1 Alejandro Mesa
31/05/2009 - 17:00 | Informe spam
Rosa Mendoza,

Cual version de SQL Server usas?

Es un poco, bastante diria yo, hacer pivoting dinamico en SS 2000, pero en
2005/2008 se hace un poquito mas facil si usamos el nuevo operador PIVOT y la
funcionalidad de agregar cadenas mediante el uso de la clausula "FOR XML
PATH('')".

Ejemplo:

use tempdb;
go

create table #t (
Codigo int,
Sitio int,
Cantidad int
);

insert into #t values(1, 1, 230);
insert into #t values(1, 2, 34);
insert into #t values(1, 3, 20);
insert into #t values(2, 1, 10);
go

declare @columns nvarchar(max);
declare @sql nvarchar(max);

set @columns = STUFF(
(
select cast(',' as varchar(max)) + quotename([Sitio])
from (select distinct Sitio from #t) as t
order by Sitio
for xml path('')
), 1, 1, '');

set @sql = N'
select
*
from
#t as t
pivot
(
min(Cantidad)
for Sitio in (' + @columns + N')
) as pvt;
';

print @sql;

exec sp_executesql @sql;
go

drop table #t;
go

Si quieres reemplazar los valores NULL por "0" en el resultado final,
entonces habra que usar una cadena mas donde dinamicamente se tenga:

isnull([1], 0) as [1], ..., isnull([n], 0) as [n]

y concatenarla a la lista de columnas de la sentencia select final.


AMB



"Rosa Mendoza" wrote:

Hola les quiero pedir esta ayuda:

Tengo esta tabla:

Codigo Sitio cantidad
1 1 230
1 2 34
1 3 20
2 1 10

Y deseo hacer un selkect que los muestre:

Codigo Sitio1 Sitio2 Sitio3
1 230 34 20
2 10 0 0

El problema es que pueden haber n Sitios...

Por favor les pido su ayuda.

Gracias


Rosa Mendoza


Preguntas similares