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.

Preguntas similare

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.



Respuesta Responder a este mensaje
#2 Jose Mariano Alvarez
26/02/2007 - 18:11 | Informe spam
Puedes revisar esto.

http://www.sqlteam.com/item.asp?ItemID)55




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"Ricardo Uribe" wrote in message
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.



Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
26/02/2007 - 18:25 | Informe spam
On 26 feb, 16:17, "Ricardo Uribe"
wrote:
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



Hola Ricardo,

Yo hubiera hecho esto:

select S.CodigoArticulo, A.Descripcion
sum(case S.CodigoAlmacen when 'A' then S.Cantidad else 0 end)
as 'Almacen A',
sum(case S.CodigoAlmacen when 'B' then S.Cantidad else 0 end)
as 'Almacen B',
...
...
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.






Algo así:?

declare @sums varchar(4096), @almacen varchar(100)

declare cursor_almacenes cursor for
select distinct CodigoAlmacen from ArticulosSaldos order by
CodigoAlmacen

set @sums = ''

open cursor_almacenes

fetch next from cursor_almacenes into @almacen
while @@fetch_status = 0
begin

set @sums = @sums + ', SUM(CASE CodigoAlmacen WHEN ''' +
RTRIM(@almacen) + ''' THEN Cantidad ELSE 0 END) AS ''Almacen ' +
RTRIM(@almacen) + ''''

fetch next from cursor_almacenes into @almacen
end

close cursor_almacenes
deallocate cursor_almacenes


EXEC ('select S.CodigoArticulo, A.Descripcion'
+ @sums
+ ' from ArticulosSaldos S inner join Articulo A on S.CodigoArticulo
= A.CodigoArticulo
group by S.CodigoArticulo, A.Descripcion
order by S.CodigoArticulo')

Saludos,
Carlos
Respuesta Responder a este mensaje
#4 Ricardo Uribe
27/02/2007 - 03:57 | Informe spam
Ante todo, Gracias.

Sus respuestas salvan vidas.



"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.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida