MySQL: actualizar un campo con la suma de unos registros de otra tabla

Si tenemos una tabla que queremos actualizar con la suma de valores de otra tabla podemos hacerlo vía programación (lo he visto en un programa que he tenido que modificar recientemente) o lo podemos hacer directamente usando una consulta MySQL.

En este ejemplo en concreto que me encontré había dos tablas:

facturas:

  • num_factura
  • base_imponible

factura_detalle:

  • num_factura
  • articulo
  • precio

La tabla factura_detalle contiene, como el nombre indica, el detalle de las facturas. Cada línea es un artículo y su precio.

La tabla facturas tenía un campo base_imponible que era necesario actualizar con el precio de los artículos de la factura en la tabla factura_detalle.

Esto se puede hacer directamente usando una subconsulta:

UPDATE facturas SET base_imponible =
     ( SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')
     WHERE num_factura = '30';

La subconsulta se encarga de buscar todos los registros de la tabla de detalle y sumar los precios:

SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')

y la consulta principal lo que hace es asignar ese valor, que sería algo así suponiendo que la anterior hubiese devuelto el valor ‘300’:

UPDATE facturas SET base_imponible = '300'
     WHERE num_factura = '30';