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

Suma de Movimientos

Estas en el tema de Suma de Movimientos en el foro de SQL Server en Foros del Web. Amigos estoy hace 10 días tratando de sacar esta consulta, a ver si me dan una idea, de porque el error.... Escenario: Tabla 1-Articulos id ...
  #1 (permalink)  
Antiguo 08/08/2011, 14:45
 
Fecha de Ingreso: octubre-2010
Ubicación: Palermo
Mensajes: 55
Antigüedad: 14 años
Puntos: 0
Pregunta Suma de Movimientos

Amigos estoy hace 10 días tratando de sacar esta consulta, a ver si me dan una idea, de porque el error....

Escenario:
Tabla 1-Articulos
id - Articulo - Stock
1 - zapallo - 10
2 - peras - 20
3 - Tomate - 12

Tabla 2-Movimientos
id - Articulo - Tipo_Mov - Cantidad
1 - zapallo - E - 20
2 - zapallo - E - 30
3 - peras - S - 5
4 - peras - E - 10

Tabla 3-Habilitados
id - articulo - perfil
1 - zapallo - 1
2 - peras - 1
3 - tomate - 0

La idea es actualizar el stock de la tabla articulos, sumando las "E" entradas y restando las "S" salidas de los movimientos, tomando como parametro los articulos habilitados "1" de la tabla Habilitados.

Para eso trate de hacer lo siguiente:

UPDATE articulos SET stock=calculo.cantidad
FROM articulos JOIN ( SELECT
sum(case tipo_mov
when 'E' then cantidad
when 'S' then -cantidad
end)
cantidad, tipo_mov, articulo
FROM movimientos
JOIN habilitados ON movimientos.articulo = habilitados.articulo
WHERE habilitados.perfil = 1
GROUP BY articulo, tipo_mov) calculo ON
articulos.articulo = calculo.articulo

Que es lo que me da esto?
Dos resultados por cada articulo. Cuando en realidad me tendria que dar uno solo.

Ideas

Desde ya mil gracias.
Gustavo
  #2 (permalink)  
Antiguo 08/08/2011, 15:25
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Suma de Movimientos

Hola maloboy_2k:

creo que el problema está en el GROUP BY ya que al agrupar también por tipo_movimiento estaría poniendo un registro para las entradas y otro para las salidas:

Checa este script:

Código SQL:
Ver original
  1. DECLARE @Articulos TABLE (id INT, Articulo VARCHAR(10), Stock INT)
  2. INSERT INTO @Articulos VALUES (1, 'zapallo', 10)
  3. INSERT INTO @Articulos VALUES (2, 'peras', 20)
  4. INSERT INTO @Articulos VALUES (3, 'Tomate', 12)
  5.  
  6. DECLARE @Movimientos TABLE (id INT, Articulo VARCHAR(10), Tipo_Mov VARCHAR, Cantidad INT)
  7. INSERT INTO @Movimientos VALUES (1, 'zapallo', 'E', 20)
  8. INSERT INTO @Movimientos VALUES (2, 'zapallo', 'E', 30)
  9. INSERT INTO @Movimientos VALUES (3, 'peras', 'S', 5)
  10. INSERT INTO @Movimientos VALUES (4, 'peras', 'E', 10)
  11.  
  12. DECLARE @Habilitados TABLE (id INT, articulo VARCHAR(10), perfil INT)
  13. INSERT INTO @Habilitados VALUES (1, 'zapallo', 1)
  14. INSERT INTO @Habilitados VALUES (2, 'peras', 1)
  15. INSERT INTO @Habilitados VALUES (3, 'tomate', 0)
  16.  
  17. SELECT * FROM @Articulos
  18.  
  19. /*
  20. id          Articulo   Stock
  21. ----------- ---------- -----------
  22. 1           zapallo    10
  23. 2           peras      20
  24. 3           Tomate     12
  25. */
  26.  
  27. UPDATE @Articulos SET stock = calculo.cantidad
  28. FROM @Articulos a INNER JOIN
  29. (
  30. SELECT m.articulo, SUM(CASE WHEN tipo_mov = 'E' THEN cantidad ELSE -cantidad END) cantidad
  31. FROM @Movimientos m INNER JOIN
  32. @Habilitados h ON h.articulo = m.articulo
  33. WHERE h.perfil = 1
  34. GROUP BY m.articulo
  35. ) calculo ON calculo.articulo = a.articulo
  36.  
  37. SELECT * FROM @Articulos
  38.  
  39. /*
  40. id          Articulo   Stock
  41. ----------- ---------- -----------
  42. 1           zapallo    50
  43. 2           peras      5
  44. 3           Tomate     12
  45. */

Por último, pasar 10 días para resolver una consulta de este tipo es una barbaridad, si te trabas con una consulta más de 1 día es recomendable que pidas ayuda.

Saludos
Leo.

Saludos y espero que te sirva el código.
  #3 (permalink)  
Antiguo 08/08/2011, 15:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Suma de Movimientos

Prueba algo asi :)

Código SQL:
Ver original
  1. CREATE TABLE #articulos
  2. (
  3. id INT,
  4. articulo VARCHAR(20),
  5. stock INT)
  6.  
  7. CREATE TABLE #movimientos
  8. (
  9. id INT,
  10. articulo VARCHAR(20),
  11. tipo_mov CHAR(1),
  12. cantidad INT
  13. )
  14.  
  15. CREATE TABLE #habilitados
  16. (
  17. id INT,
  18. articulo VARCHAR(20),
  19. perfil bit
  20. )
  21.  
  22. INSERT INTO #articulos VALUES (1,'zapallo',10)
  23. INSERT INTO #articulos VALUES (2,'peras',20)
  24. INSERT INTO #articulos VALUES (3,'tomate',12)
  25.  
  26. INSERT INTO #movimientos VALUES (1,'zapallo','E',20)
  27. INSERT INTO #movimientos VALUES (2,'zapallo','E',30)
  28. INSERT INTO #movimientos VALUES (3,'peras','S',5)
  29. INSERT INTO #movimientos VALUES (4,'peras','E',10)
  30.  
  31. INSERT INTO #habilitados VALUES (1,'zapallo',1)
  32. INSERT INTO #habilitados VALUES (2,'peras',1)
  33. INSERT INTO #habilitados VALUES (3,'tomate',0)
  34.  
  35.  
  36. UPDATE #articulos
  37. SET stock=stock+t2.total
  38. FROM
  39. (
  40.  
  41. SELECT SUM(total) total, articulo
  42. FROM
  43. (
  44. SELECT
  45. CASE
  46. WHEN M.tipo_mov='E' THEN SUM(cantidad) ELSE SUM(-cantidad) END AS total, M.articulo
  47. FROM #movimientos M
  48. INNER JOIN #habilitados H ON (M.articulo=h.articulo AND h.perfil=1)
  49. GROUP BY M.articulo,M.tipo_mov
  50. )t1
  51. GROUP BY articulo
  52.  
  53. ) t2 WHERE #articulos.articulo=t2.articulo
  54.  
  55. SELECT * FROM #articulos
  56.  
  57. id  articulo    stock
  58. 1   zapallo 60
  59. 2   peras   25
  60. 3   tomate  12

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 08/08/2011, 16:06
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Suma de Movimientos

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola maloboy_2k:
........
Por último, pasar 10 días para resolver una consulta de este tipo es una barbaridad, si te trabas con una consulta más de 1 día es recomendable que pidas ayuda.

Saludos
Leo.

Saludos y espero que te sirva el código.
Me ganaste Leo en contestar jejeje :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 09/08/2011, 05:34
 
Fecha de Ingreso: octubre-2010
Ubicación: Palermo
Mensajes: 55
Antigüedad: 14 años
Puntos: 0
De acuerdo Respuesta: Suma de Movimientos

Leo y Libras

Esto es lo que yo llamo, comenzar feliz un día....
Gracias y más Gracias.

Trataba de aplicar un poco lo lógica al código, porque entendía que el problema era el group, pero pense que ese campo debía estar.

Bueno me pongo a trabajar.

Gracias y saludos,

Gustavo

Etiquetas: case, group, select, update
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 17:15.