Prueba algo asi :)
Código SQL:
Ver originalCREATE TABLE #articulos
(
id INT,
articulo VARCHAR(20),
stock INT)
CREATE TABLE #movimientos
(
id INT,
articulo VARCHAR(20),
tipo_mov CHAR(1),
cantidad INT
)
CREATE TABLE #habilitados
(
id INT,
articulo VARCHAR(20),
perfil bit
)
INSERT INTO #articulos VALUES (1,'zapallo',10)
INSERT INTO #articulos VALUES (2,'peras',20)
INSERT INTO #articulos VALUES (3,'tomate',12)
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)
INSERT INTO #habilitados VALUES (1,'zapallo',1)
INSERT INTO #habilitados VALUES (2,'peras',1)
INSERT INTO #habilitados VALUES (3,'tomate',0)
UPDATE #articulos
SET stock=stock+t2.total
FROM
(
SELECT SUM(total) total, articulo
FROM
(
SELECT
CASE
WHEN M.tipo_mov='E' THEN SUM(cantidad) ELSE SUM(-cantidad) END AS total, M.articulo
FROM #movimientos M
INNER JOIN #habilitados H ON (M.articulo=h.articulo AND h.perfil=1)
GROUP BY M.articulo,M.tipo_mov
)t1
GROUP BY articulo
) t2 WHERE #articulos.articulo=t2.articulo
SELECT * FROM #articulos
id articulo stock
1 zapallo 60
2 peras 25
3 tomate 12
Saludos!