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

Preguntas similare

Leer las respuestas

#6 Carlos M. Calvelo
20/07/2008 - 23:54 | Informe spam
Hola,

On 20 jul, 14:48, wrote:
Hola Carlos, gracias por tu apreciación.
Esta es la tabla donde registro los movimientos ingresos a almacen,
cada movimiento como llave primaria es el Nro_Movimiento
(1,2,3,4,5...). La query, gracias a tu ayuda lo he tenido que colocar
un SUM(Cantidad) porque puede darse el caso que haya ingresos para el
mismo articulo y misma empresa en el mismo día.

Movimiento Empresa Articulo Fecha Cantidad Importe
1 is M07033 29/06/2007 9,00 90
2 is M07033 13/07/2007 4,00 40
3 is M07033 03/08/2007 3,00 30
4 is M07033 31/12/2007 5,00 50
5 is M07033 29/02/2008 12,00 120
6 is M07033 06/03/2008 20,00 200
7 is M07033 24/04/2008 9,00 90
8 is M07033 24/04/2008 4,00 40
9 as M07033 13/07/2007 4,00 40
10 as M07033 03/08/2007 7,00 70
11 as M07033 31/12/2007 7,00 70
12 is M07033 29/02/2008 7,00 70

Teniendo en cuanta estos datos, por ejemplo para el conjunto
(M07033,is, 200805039 tendria como cantidad 13 que esw la suma del
inmediato inferior al 200805039, que es la suma de los movimientos de
las fechas 20080424.

M07033 is 2008-05-03 00:00:00.000 13.000000000000

Me parece que con el SUM se peude solucionar el problema, lo que tengo
que tomar si no hay movimientos para esa fecha dada es el inmediato
inferior y si hay varios movimientos a esa fecha los tengo que suma.

Este es el codigo con el SUM con el cual me ayudaste. Mi pregunta
ahora es, como incluyo la suma del importe, no se donde incluir el
EXISTS????.




Pues no hace falta la clave primaria entonces. Yo no sabía
que querías sumar todo por {articulo,empresa,fecha}.

A ver si ahora he entendido bien y prueba esto:

DECLARE @fecha_inicio DATETIME, @fecha_final DATETIME

SET @fecha_inicio = '20080503'
SET @fecha_final = '20080505'

SELECT
Empresa, Articulo, F.Fecha, Stock_Fecha, Importe_Fecha
FROM
(
SELECT
Empresa,
Articulo,
CAST(DATEDIFF(day,0,Fecha) AS DATETIME) AS Fecha,
ISNULL(SUM(Cantidad),0) AS Stock_Fecha,
ISNULL(SUM(Importe),0) AS Importe_Fecha
FROM
Movimientos
WHERE
Fecha < @Fecha_final + 1
GROUP BY
Empresa,
Articulo,
CAST(DATEDIFF(day,0,Fecha) AS DATETIME)
) M
RIGHT JOIN dbo.Fechas(@fecha_inicio, @fecha_final) F
ON M.Fecha <= F.Fecha
WHERE
F.Fecha >= @fecha_inicio AND
M.Fecha = (SELECT MAX(Fecha)
FROM Movimientos
WHERE Empresa=M.Empresa AND
Articulo=M.Articulo AND
Fecha <= F.Fecha)
ORDER BY
Empresa, Articulo, F.Fecha
-

Saludos,
Carlos
Respuesta Responder a este mensaje
#7 Carlos M. Calvelo
21/07/2008 - 00:38 | Informe spam
Hola,

WHERE
F.Fecha >= @fecha_inicio AND
M.Fecha = (SELECT MAX(Fecha)
FROM Movimientos
WHERE Empresa=M.Empresa AND
Articulo=M.Articulo AND
Fecha <= F.Fecha)



Este where no funciona si las fechas en la tabla Movimientos tienen
valores distintos a 0 depués de la fecha (horas, minutos, etc)

Esta irá mejor:


DECLARE @fecha_inicio DATETIME, @fecha_final DATETIME

SET @fecha_inicio = '20080503'
SET @fecha_final = '20080505'

SELECT
Empresa, Articulo, F.Fecha, Stock_Fecha, Importe_Fecha
FROM
(
SELECT
Empresa,
Articulo,
CAST(DATEDIFF(day,0,Fecha) AS DATETIME) AS Fecha,
ISNULL(SUM(Cantidad),0) AS Stock_Fecha,
ISNULL(SUM(Importe),0) AS Importe_Fecha
FROM
Movimientos
WHERE
Fecha < @Fecha_final + 1
GROUP BY
Empresa,
Articulo,
CAST(DATEDIFF(day,0,Fecha) AS DATETIME)
) M
RIGHT JOIN dbo.Fechas(@fecha_inicio, @fecha_final) F
ON M.Fecha <= F.Fecha
WHERE
F.Fecha >= @fecha_inicio AND
M.Fecha = (SELECT MAX(DATEDIFF(day,0,Fecha))
FROM Movimientos
WHERE Empresa=M.Empresa AND
Articulo=M.Articulo AND
DATEDIFF(day,0,Fecha) <= F.Fecha)
ORDER BY
Empresa, Articulo, F.Fecha
-

Saludos,
Carlos
Respuesta Responder a este mensaje
#8 hamil1978
21/07/2008 - 23:55 | Informe spam
Perfecta la ayuda Carlos, bueno esto ya lo tengo, mañana probare con
Reporting Services y veremos como va quedando todo.

Si necesito ayuda ya me veras por el foro.

Saludos Carlos y gracias nuevamente.



-
On 21 jul, 00:38, "Carlos M. Calvelo" wrote:
Hola,

> WHERE
>    F.Fecha >= @fecha_inicio AND
>    M.Fecha = (SELECT MAX(Fecha)
>               FROM   Movimientos
>               WHERE  Empresa=M.Empresa AND
>                      Articulo=M.Articulo AND
>                      Fecha <= F.Fecha)

Este where no funciona si las fechas en la tabla Movimientos tienen
valores distintos a 0 depués de la fecha (horas, minutos, etc)

Esta irá mejor:


DECLARE @fecha_inicio DATETIME, @fecha_final DATETIME

SET @fecha_inicio = '20080503'
SET @fecha_final =  '20080505'

SELECT
   Empresa, Articulo, F.Fecha, Stock_Fecha, Importe_Fecha
FROM
   (
   SELECT
      Empresa,
      Articulo,
      CAST(DATEDIFF(day,0,Fecha) AS DATETIME) AS Fecha,
      ISNULL(SUM(Cantidad),0) AS Stock_Fecha,
      ISNULL(SUM(Importe),0) AS Importe_Fecha
   FROM
      Movimientos
   WHERE
      Fecha < @Fecha_final + 1
   GROUP BY
      Empresa,
      Articulo,
      CAST(DATEDIFF(day,0,Fecha) AS DATETIME)
   ) M
   RIGHT JOIN dbo.Fechas(@fecha_inicio, @fecha_final) F
   ON M.Fecha <= F.Fecha
WHERE
   F.Fecha >= @fecha_inicio AND
   M.Fecha = (SELECT MAX(DATEDIFF(day,0,Fecha))
              FROM   Movimientos
              WHERE  Empresa=M.Empresa AND
                     Articulo=M.Articulo AND
                     DATEDIFF(day,0,Fecha) <= F.Fecha)
ORDER BY
   Empresa, Articulo, F.Fecha
-

Saludos,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida