Actualizar columna en funcion a los datos de otra columna de una misma tabla MYSQL

publicado por: Anonymous

Tengo una base de datos que lleva la cuenta del material que se ingresa y se egresa, haciendo la resta de lo ingresado menos lo egresado el resultado es el stock actual que hay de "X" producto.

UPDATE `stock de materias primas` SET `Unidades netas` = 
(SELECT `Ingresados en unidades` FROM `stock de materias primas` WHERE Codigo = 
(SELECT `Codigo` FROM `stock de materias primas`)) - 
(SELECT `Egresados en unidades` FROM `stock de materias primas` WHERE Codigo = 
(SELECT `Codigo` FROM `stock de materias primas`));

Estructura de datos de la tabla

Estructura de datos.

esto me trae un claro error diciéndome que el problema esta en que no le estoy asignando un target al cual actualizar, realice una busqueda en foros y documentacion de Sql y por lo que entendi se debe conseguir el ID pero no consigo dar con la manera correcta.

Siempre hice consultas y manipulación de datos desde el programa con C# pero al ser una mala practica estoy intentando crear procedimientos y funciones en la base de datos y como aca no puedo recorrer con un for código por código no entiendo la forma que Sql comprenda que lo que requiero es que actualice cada y uno de los datos en funciones de la resta de ingresos con los egresos.
Espero haber sido lo suficientemente claro.

solución

Si no he entendido mal lo que buscas, la consulta que necesitas es la siguiente:

UPDATE `stock de materias primas` S1 SET `Unidades netas` = 
    (SELECT `Ingresados en unidades` FROM `stock de materias primas` S2 WHERE S2.Codigo = S1.Codigo) - 
    (SELECT `Egresados en unidades` FROM `stock de materias primas` S3 WHERE S3.Codigo = S1.Codigo)

Que biene siendo lo mismo que ha comentado @OscarGarcia:

UPDATE `stock de materias primas` SET `Unidades netas` = `Ingresados en unidades` - `Egresados en unidades`

De esta manera te actualiza el valor Unidades netas con la resta de Ingresados en unidadesEgresados en unidades de la línea del código.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *