Query sin cursores...Ayuda!!!!

18/07/2008 - 13:22 por hamil1978 | Informe spam
Hola amigos.

En una tabla tengo la siguiente informacion

Tabla: Movimientos
Articulo Empresa Fecha Cantidad
M07033 is 2007-06-29 9
M07033 is 2007-07-13 4
M07033 is 2007-08-03 3
M07033 is 2007-12-31 5
M07033 is 2008-02-29 12
M07033 is 2008-03-06 20
M07033 is 2008-04-24 19

Para una intervalo de fechas 2008-05-03 y 2008-05-05, por ejemplo
genero una tabla Stock, para lo cual tengo que calcular el Stock a la
Fecha.

Tabla: Stock
Articulo Empresa Fecha Stock_Fecha
M07033 is 2008-05-03 19
M07033 is 2008-05-04 19
M07033 is 2008-05-05 19

De la tabla movimientos tomaría el inmediato inferior a la fecha del
stock, en este caso el valor 19 (2008-04-24).

Con cursores almacenaria los valores de la tabla Stock, y luego al
recorrer realizaría una comparación con la tabla movimientos y
obtendria el valor inferior inmediato a la fecha, pero es demasiado
lento mi cursor por lo que pido su ayuda.

Gracias amigos
 

Leer las respuestas

#1 Carlos M. Calvelo
18/07/2008 - 15:03 | Informe spam
Hola amigo,

On 18 jul, 13:22, wrote:
Hola amigos.

En una tabla tengo la siguiente informacion

Tabla: Movimientos
Articulo Empresa Fecha Cantidad
M07033 is 2007-06-29 9
M07033 is 2007-07-13 4
M07033 is 2007-08-03 3
M07033 is 2007-12-31 5
M07033 is 2008-02-29 12
M07033 is 2008-03-06 20
M07033 is 2008-04-24 19

Para una intervalo de fechas 2008-05-03 y 2008-05-05, por ejemplo
genero una tabla Stock, para lo cual tengo que calcular el Stock a la
Fecha.

Tabla: Stock
Articulo Empresa Fecha Stock_Fecha
M07033 is 2008-05-03 19
M07033 is 2008-05-04 19
M07033 is 2008-05-05 19

De la tabla movimientos tomaría el inmediato inferior a la fecha del
stock, en este caso el valor 19 (2008-04-24).

Con cursores almacenaria los valores de la tabla Stock, y luego al
recorrer realizaría una comparación con la tabla movimientos y
obtendria el valor inferior inmediato a la fecha, pero es demasiado
lento mi cursor por lo que pido su ayuda.




Entiendo que se tiene que hacer un join de todas las combinaciones
(Articulo, Empresa) con todas las fechas en el rango.

Para eso creamos primero esta función que puede generar un
rango de fechas:

-
CREATE function Fechas(@mindate datetime, @maxdate datetime)
returns @fechas TABLE (fecha datetime, diasemana int)
as
begin
while @mindate <= @maxdate
begin
insert into @fechas (fecha,diasemana)
values (@mindate, (datepart(dw, @mindate)+@@datefirst)%7)
set @mindate = @mindate + 1
end
return
end

Suponiendo ahora que tenemos el rango de fechas en las variables
@fecha_inico y @fecha_final, puedes probar esta consulta:


declare @fecha_inicio datetime, @fecha_final datetime

set @fecha_inicio = '20080503'
set @fecha_final = '20080505'
SELECT
M1.Articulo,
M1.Empresa, F.Fecha ,
ISNULL(
(SELECT TOP 1 Cantidad
FROM Movimientos
WHERE Articulo=M1.Articulo AND
Empresa=M1.Empresa AND
Fecha <= F.Fecha
ORDER BY Fecha DESC
),0) AS Stock_Fecha
FROM
(SELECT DISTINCT Articulo, Empresa FROM Movimientos) M1
CROSS JOIN
dbo.Fechas(@fecha_inicio,@fecha_final) F
-

En vez de la función Fechas(...) puedes usar también una tabla
que puedes generar a partir de la función. Eso sería mas
eficiente.

Saludos,
Carlos

Preguntas similares