Columnas dinamicas

26/02/2007 - 16:17 por Ricardo Uribe | Informe spam
Hola grupo, tengo la sgte duda. espero me puedan ayudar.

Tengo una tabla donde reflejo los saldos de mis articulos
por almacen.

CodigoAlmacen | CodigoArticulo | Cantidad
A XXXX1 10
B XXXX1 20
C XXXX1 0
A XXXN1 5
B XXXF1 10

Me pidieron un reporte que me muestre:

CodigoArticulo, Almacen A, Almacen B, Almacen C
XXXX1 10 20 0
XXXN1 5 0 0
XXXF1 0 10 0

Para no tener que convertir, filas en columnas, y como conozco
los codigos de almacen que tengo, hice lo sgte.

SELECT S.CodigoArticulo, A.Descripcion, SUM(Libertadores)Libertadores,
SUM(Merino) Merino,
SUM(Chorrillos) Chorrillos, SUM(Taller) Taller, SUM(Destruccion)
Destruccion
FROM (SELECT Codigoarticulo, CodigoAlmacen,
CASE WHEN CodigoAlmacen='DES' THEN Cantidad ELSE 0 END AS Destruccion,
CASE WHEN CodigoAlmacen='TA' THEN Cantidad ELSE 0 END AS Taller,
CASE WHEN CodigoAlmacen='TC' THEN Cantidad ELSE 0 END AS Chorrillos,
CASE WHEN CodigoAlmacen='TM' THEN Cantidad ELSE 0 END AS Merino,
CASE WHEN CodigoAlmacen='TS' THEN Cantidad ELSE 0 END AS Libertadores
FROM ArticulosSaldos) S INNER JOIN Articulo A ON
S.CodigoArticulo = A.CodigoArticulo
GROUP BY S.CodigoArticulo, A.Descripcion
ORDER BY S.CodigoArticulo

Lo que quiero saber es si hay alguna forma de convertir el SELECT interno en
dinamico,
de forma tal que si aumenta un codigo de almacen aumente tambien un CASE
WHEN
buscando ese codigo. Lo trate de hacer en un store procedure, cambiando el
SELECT interno
por una variable, pero al pasar comillas simple a la variable me sale error.

DECLARE @SubConsulta NVARCHAR(1000)
DECLARE @ConsultaTotal NVARCHAR(1000)
SET @ConsultaTotal = 'SELECT S.CodigoArticulo, A.Descripcion,
SUM(Libertadores)Libertadores, SUM(Merino) Merino,
SUM(Chorrillos) Chorrillos, SUM(Taller) Taller, SUM(Destruccion)
Destruccion
FROM ('+ @SubConsulta + ') S INNER JOIN Articulo A ON
S.CodigoArticulo = A.CodigoArticulo
GROUP BY S.CodigoArticulo, A.Descripcion
ORDER BY S.CodigoArticulo'

EXEC (@ConsultaTotal)

Muchas gracias por su ayuda.
 

Leer las respuestas

#1 Maxi
26/02/2007 - 16:58 | Informe spam
Hola, lo recomendado en estos casos es que si te han pedido un reporte
resuelvas esa presentacion en tal lugar y no en SQLServer, si usas Reporting
Service o Cristal lo podras hacer sin mayores problemas.

De todas maneras si insistes, deberias usar SQL-Dinamico sp_executesql


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Ricardo Uribe" escribió en el mensaje
news:
Hola grupo, tengo la sgte duda. espero me puedan ayudar.

Tengo una tabla donde reflejo los saldos de mis articulos
por almacen.

CodigoAlmacen | CodigoArticulo | Cantidad
A XXXX1 10
B XXXX1 20
C XXXX1 0
A XXXN1 5
B XXXF1 10

Me pidieron un reporte que me muestre:

CodigoArticulo, Almacen A, Almacen B, Almacen C
XXXX1 10 20 0
XXXN1 5 0 0
XXXF1 0 10 0

Para no tener que convertir, filas en columnas, y como conozco
los codigos de almacen que tengo, hice lo sgte.

SELECT S.CodigoArticulo, A.Descripcion, SUM(Libertadores)Libertadores,
SUM(Merino) Merino,
SUM(Chorrillos) Chorrillos, SUM(Taller) Taller, SUM(Destruccion)
Destruccion
FROM (SELECT Codigoarticulo, CodigoAlmacen,
CASE WHEN CodigoAlmacen='DES' THEN Cantidad ELSE 0 END AS Destruccion,
CASE WHEN CodigoAlmacen='TA' THEN Cantidad ELSE 0 END AS Taller,
CASE WHEN CodigoAlmacen='TC' THEN Cantidad ELSE 0 END AS Chorrillos,
CASE WHEN CodigoAlmacen='TM' THEN Cantidad ELSE 0 END AS Merino,
CASE WHEN CodigoAlmacen='TS' THEN Cantidad ELSE 0 END AS Libertadores
FROM ArticulosSaldos) S INNER JOIN Articulo A ON
S.CodigoArticulo = A.CodigoArticulo
GROUP BY S.CodigoArticulo, A.Descripcion
ORDER BY S.CodigoArticulo

Lo que quiero saber es si hay alguna forma de convertir el SELECT interno
en dinamico,
de forma tal que si aumenta un codigo de almacen aumente tambien un CASE
WHEN
buscando ese codigo. Lo trate de hacer en un store procedure, cambiando el
SELECT interno
por una variable, pero al pasar comillas simple a la variable me sale
error.

DECLARE @SubConsulta NVARCHAR(1000)
DECLARE @ConsultaTotal NVARCHAR(1000)
SET @ConsultaTotal = 'SELECT S.CodigoArticulo, A.Descripcion,
SUM(Libertadores)Libertadores, SUM(Merino) Merino,
SUM(Chorrillos) Chorrillos, SUM(Taller) Taller, SUM(Destruccion)
Destruccion
FROM ('+ @SubConsulta + ') S INNER JOIN Articulo A ON
S.CodigoArticulo = A.CodigoArticulo
GROUP BY S.CodigoArticulo, A.Descripcion
ORDER BY S.CodigoArticulo'

EXEC (@ConsultaTotal)

Muchas gracias por su ayuda.



Preguntas similares