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';

8 thoughts on “MySQL: actualizar un campo con la suma de unos registros de otra tabla

  1. Me sirvió como no te imaginas! Lo busqué en libtros y nada… Mil Gracias por compartir.

  2. Muchisimas gracias!
    lo estaba necesitando

    Ahora te haré otra consulta sin animo de entrar en el abuso, pero no le encuentro la vuelta
    He generado una lista de ventas donde relaciono
    Una Tabla Cabecera de Ventas (bdsgc03) – Con datos como Fecha, Dcto.Nro, Cliente, monto total de venta, etc.
    con Tablas de:
    Detalle de facturas (bdsgc04) – con datos como: cantidad, precio unitario (relacionada con la anterior por Dcto.Nro)
    Tabla de Clientes (bdsgc18), relacionada con la primera por el ID de cliente
    Finalmente relacionando la Tabla de Clientes con una de Ramos (bdsgc33).
    De esta forma obtengo un listado ordenado por Ramos, luego por Clientes y la sumatoria de las Cantidades obtenidas desde el Detalle (se puede sumar cantidades de una misma venta ya que lo que interesa es el total de Kg, se comercializa pescado).
    en cdigo és así:

    SELECT A.FFEVTA01,A.FDOCINT1,A.FCABFA04,A.FCABFA12,A.FCABFA14,A.FCABFA15*100,SUM(D.FDETFA06)
    B.FIDCLI01,B.FRAMO01,C.FRAMO01,C.FRAMO02
    FROM BDSGC03 AS A INNER JOIN BDSGC04 AS D ON A.FDOCINT1=D.FDOCINT1, BDSGC18 AS B, BDSGC33 AS C
    WHERE A.FFEVTA01 BETWEEN ‘”+hDatos[“Desde”]+”‘ AND ‘”+hDatos[“Hasta”]
    AND A.FIDCLI01=B.FIDCLI01 AND B.FRAMO01=C.FRAMO01 AND FCABFA18 AND NOT FCABFA24
    GROUP BY A.FFEVTA01,A.FDOCINT1,A.FCABFA04,A.FCABFA12,A.FCABFA14,A.FCABFA15,B.FIDCLI01,B.FRAMO01,C.FRAMO01,C.FRAMO02
    ORDER BY C.FRAMO02, A.FFEVTA01,A.FCABFA04

    Bueno, disculpas por el exceso. Esto funciona bien (al menos no da error 😉
    Ahora intento generar el mismo informe con la siguiente particularidad
    Se debe ordenar por Cliente, pero, agrupando el total vendido, en monto y kgs, por cada Cliente.
    O se ya he obtenido el total de Kg, de la Tabla de Detalles (con el Inner). Ahora debo volver a sumar ese total de kgs, de cada Venta, pero para un mismo Cliente.

    Si se entiende y me puedes ayudar bienvenido!!

    Saludos y desde ya muchisimas gracias

Deja un comentario