Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Calculando el Acumulado

Estas en el tema de Calculando el Acumulado en el foro de SQL Server en Foros del Web. Hola a Todos ! soy nueva en esto ojala me puedan ayudar Necesito calcular el la cantidad acumulada de productos en base al DOC que ...
  #1 (permalink)  
Antiguo 01/07/2014, 23:47
 
Fecha de Ingreso: julio-2014
Mensajes: 2
Antigüedad: 9 años, 9 meses
Puntos: 0
Calculando el Acumulado

Hola a Todos !


soy nueva en esto ojala me puedan ayudar
Necesito calcular el la cantidad acumulada de productos en base al DOC que son los diferentes movimientos del inventario algunos se restan, se suman o se quedan igual es decir con el acumulado anterior.

Debería quedar la columna del acumulado Así :

Código BASH:
Ver original
  1. Codigo      Quantity   DOC    FECHADOC   SUMAN   RESTAN   IGUAL   ACUMULADO
  2. 301262519   32        SUM    2012-12-31     32           0           0                   32
  3. 301262519   52        SUM    2012-12-31     52           0           0                   84
  4. 301262519    5          RES    2013-01-28     0             5           0                  79
  5. 301262519    2         RES     2013-04-01     0             2           0                  77
  6. 301262519   10        IGU      2013-04-18    0             0          10                 77
  7. 301262519   10        RES     2013-05-02     0           10          0                   67
  8. 301262519   6          IGU     2013-06-21     0             0          6                    67
  9. 301262519   6          IGU      2013-06-28    0             0          6                   67


mi consulta es esta



Código SQL:
Ver original
  1. SELECT A.Codigo, A.Quantity, DOC, FECHADOC,
  2.  
  3.     CASE WHEN  A.DOC = 'SUM' THEN A.Quantity ELSE 0 END  AS SUMAN  ,
  4.     CASE WHEN  A.DOC = 'RES' THEN A.Quantity ELSE 0 END  AS RESTAN ,
  5.      CASE WHEN  A.DOC = 'IGU' THEN A.Quantity ELSE 0 END AS IGUAL ,
  6. (
  7.  
  8. SELECT  
  9.     SUM( CASE WHEN  B.DOC = 'SUM' THEN 1 ELSE -1 END * B.Quantity )
  10.    
  11.          
  12.     FROM
  13.           dbo.Inventario_Total AS B
  14.          
  15.       WHERE
  16.         B.Codigo = A.Codigo
  17.         AND (
  18.         B.FECHADOC < A.FECHADOC
  19.         OR
  20.         (B.FECHADOC = A.FECHADOC )
  21.         )
  22.    
  23.  
  24.     ) AS ACUMULADO
  25.    
  26.  
  27. FROM         dbo.Inventario_Total  AS A
  28.  
  29. ORDER BY  A.Codigo,  A.FECHADOC
el problema es que no se como puedo hacer para que cuando el DOC = IGU tome el acumulado anterior

Gracias !!

Última edición por gnzsoloyo; 02/07/2014 a las 07:19
  #2 (permalink)  
Antiguo 02/07/2014, 08:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Calculando el Acumulado

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. codigo VARCHAR(20),
  4. quantity INT,
  5. doc VARCHAR(20)
  6. )
  7.  
  8.  
  9. CREATE TABLE #resultado
  10. (
  11. codigo VARCHAR(20),
  12. quantity INT,
  13. doc VARCHAR(20),
  14. acumulado INT
  15. )
  16.  
  17. INSERT INTO #temp VALUES ('301262519',32,'SUM')
  18. INSERT INTO #temp VALUES ('301262519',52,'SUM')
  19. INSERT INTO #temp VALUES ('301262519',5,'RES')
  20. INSERT INTO #temp VALUES ('301262519',2,'RES')
  21. INSERT INTO #temp VALUES ('301262519',10,'IGU')
  22. INSERT INTO #temp VALUES ('301262519',10,'RES')
  23. INSERT INTO #temp VALUES ('301262519',6,'IGU')
  24. INSERT INTO #temp VALUES ('301262519',6,'IGU')
  25.  
  26.  
  27. SELECT *,ROW_NUMBER() OVER(partition BY codigo ORDER BY codigo) AS rn INTO #temp2 FROM #temp
  28.  
  29. DECLARE @x INT
  30. DECLARE @doc VARCHAR(20)
  31. DECLARE @acumulado INT
  32. DECLARE @cantidad INT
  33.  
  34. SET @x=1
  35. SET @cantidad=0
  36. SET @acumulado=0
  37.  
  38.  
  39. while @x<=(SELECT COUNT(*) FROM #temp2)
  40. BEGIN
  41.     SELECT @doc=doc,@cantidad=quantity FROM #temp2 WHERE rn=@x
  42.     IF(@doc='sum')
  43.         SET @acumulado=@acumulado+@cantidad
  44.     IF(@doc='res')
  45.         SET @acumulado=@acumulado-@cantidad
  46.     IF(@doc='igu')
  47.         SET @acumulado=@acumulado
  48.  
  49.     INSERT INTO #resultado
  50.     SELECT codigo,@cantidad,@doc,@acumulado FROM #temp2 WHERE rn=@x
  51. SET @x=@x+1
  52. END
  53.  
  54. SELECT * FROM #resultado

Como tus datos se restan, se suman y se dejan igual no es tan facil poner todo eso en un solo query por lo que te recomiendo hacer un procedure o funcion donde pongas el codigo que te envio :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 02/07/2014, 15:41
 
Fecha de Ingreso: julio-2014
Mensajes: 2
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Calculando el Acumulado

Gracias por tu gran Ayuda Libras :D!

Etiquetas: select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:49.