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 originalDECLARE @Articulos TABLE (id INT, Articulo VARCHAR(10), Stock INT)
INSERT INTO @Articulos VALUES (1, 'zapallo', 10)
INSERT INTO @Articulos VALUES (2, 'peras', 20)
INSERT INTO @Articulos VALUES (3, 'Tomate', 12)
DECLARE @Movimientos TABLE (id INT, Articulo VARCHAR(10), Tipo_Mov VARCHAR, Cantidad INT)
INSERT INTO @Movimientos VALUES (1, 'zapallo', 'E', 20)
INSERT INTO @Movimientos VALUES (2, 'zapallo', 'E', 30)
INSERT INTO @Movimientos VALUES (3, 'peras', 'S', 5)
INSERT INTO @Movimientos VALUES (4, 'peras', 'E', 10)
DECLARE @Habilitados TABLE (id INT, articulo VARCHAR(10), perfil INT)
INSERT INTO @Habilitados VALUES (1, 'zapallo', 1)
INSERT INTO @Habilitados VALUES (2, 'peras', 1)
INSERT INTO @Habilitados VALUES (3, 'tomate', 0)
SELECT * FROM @Articulos
/*
id Articulo Stock
----------- ---------- -----------
1 zapallo 10
2 peras 20
3 Tomate 12
*/
UPDATE @Articulos SET stock = calculo.cantidad
FROM @Articulos a INNER JOIN
(
SELECT m.articulo, SUM(CASE WHEN tipo_mov = 'E' THEN cantidad ELSE -cantidad END) cantidad
FROM @Movimientos m INNER JOIN
@Habilitados h ON h.articulo = m.articulo
WHERE h.perfil = 1
GROUP BY m.articulo
) calculo ON calculo.articulo = a.articulo
SELECT * FROM @Articulos
/*
id Articulo Stock
----------- ---------- -----------
1 zapallo 50
2 peras 5
3 Tomate 12
*/
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.