Como hago consulta sql para restar 2 campos de 2 tablas y actualizar una de ellas con el resultado


28 de Enero del 2021

Buenas tardes talves me puedan ayudar, con esta consulta,lo que quiero hacer es que se actualize la columna stockactual_di de la tabla talmacen pero unicamente se APLIQUE a aquellos productos que coincidan con el mismo idproducto de la tabla almacen con el idarticulo de la tabla detalleingreso

inner join tdetalleingreso on tdetalleingreso.idarticulo=talmacen.idproducto 

de igual forma el idingreso sea igual con las tabla almacen y tabla ingreso

 inner join tingreso on tingreso.idingreso=talmacen.id_ingreso

 tomando en cuenta que el estado sea igual DEV. se es de suponer q solamente tomaria encuente lo siguiente

tingreso tdetalleingreso talmacen
1029 1029 1029

despues
tabla tdetalleingres tabla talmacen

 idingreso idarticulo stockactual idingreso idproducto stockactua_di
1029           999           3            1029       999             4
1029           888           3            1029       888            4
1029            777          3            1029       777           4

se hace la resta y se actualiza y en la tabla talmacen queda asi
stockactua_di
1
1
1

stockactua_di
-6
-6
-6

este es el script
UPDATE talmacen
set
talmacen.stockactual_di=talmacen.stockactual_di - tdetalleingreso.stockactual
from talmacen
inner join tdetalleingreso on tdetalleingreso.idarticulo=talmacen.idproducto
inner join tingreso on tingreso.idingreso=talmacen.id_ingreso
where tingreso.estado='DEV'


Lucia
12 de Agosto del 2026

Hola,

El problema está en que tu JOIN entre talmacen y tdetalleingreso probablemente devuelve varias filas de tdetalleingreso por cada fila de talmacen (varios detalles de ingreso para el mismo artículo). Cuando eso pasa, un UPDATE ... FROM con JOIN en SQL Server no suma ni promedia esas filas repetidas, aplica el valor de una sola de ellas (cuál exactamente no está garantizado, es en gran parte impredecible), y por eso ves el mismo resultado (-6) repetido en todas las filas: probablemente está cogiendo siempre la misma fila de tdetalleingreso para todos los casos, no calculando nada distinto por fila de talmacen.

La solución es agregar primero, en un CTE o subconsulta, y hacer el UPDATE contra ese resultado ya agregado, no contra el JOIN sin agrupar:

;WITH resumen AS (
    SELECT tdetalleingreso.idarticulo, SUM(tdetalleingreso.stockactual) AS total_stock
    FROM tdetalleingreso
    INNER JOIN tingreso ON tingreso.idingreso = tdetalleingreso.idingreso
    WHERE tingreso.estado = 'DEV'
    GROUP BY tdetalleingreso.idarticulo
)
UPDATE talmacen
SET talmacen.stockactual_di = talmacen.stockactual_di - resumen.total_stock
FROM talmacen
INNER JOIN resumen ON resumen.idarticulo = talmacen.idproducto;

Ahora cada fila de talmacen se cruza con una sola fila de resumen (ya sumada por idarticulo), así que el resultado debería variar según el artículo real, en vez de repetir el mismo número en todas las filas.

Regla general para recordar: cuando un UPDATE ... FROM ... JOIN te da resultados que se repiten sospechosamente igual en todas las filas, casi siempre es señal de que el JOIN está multiplicando filas por el lado derecho y hace falta agregar antes de actualizar.

Lucia