Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Update a partir de suma de datos de la misma tabla

Estas en el tema de Update a partir de suma de datos de la misma tabla en el foro de Mysql en Foros del Web. Necesito actualizar determinados registros de una tabla, y el valor a asignarle sería una suma de varios registros del mismo campo de la misma tabla ...
  #1 (permalink)  
Antiguo 24/04/2014, 03:46
Avatar de arunda2  
Fecha de Ingreso: octubre-2008
Ubicación: España
Mensajes: 28
Antigüedad: 16 años, 1 mes
Puntos: 0
Update a partir de suma de datos de la misma tabla

Necesito actualizar determinados registros de una tabla, y el valor a asignarle sería una suma de varios registros del mismo campo de la misma tabla


Como ejemplo, para aislar el problema .... Tenemos esta tabla

Código:
ID    CIUDAD        COMERCIO    INGRESOS

1    Madrid        Hotel        500
2    Madrid        Restaurante    200
3    Madrid        TOTAL        0
4    Barcelona    Hotel        400
5    Barcelona    Restaurante    200
6    Barcelona    Camping        300
7    Barcelona    TOTAL        0
8    Bilbao        Hotel        600
9    Bilbao         Camping        200
10    Bilbao        TOTAL        0
Necesitamos actualizar los ingresos de los registros donde el campo comercio se llame TOTAL, con la suma de los ingresos de los establecimientos de su ciudad (Sumar todos los de esta ciudad, pero que el valor del registro comercio sea distinto de TOTAL para que no haya recursividad)


Esto se aplicaría a una tabla de stocks de Prestashop que funciona así. La lógica sería la misma

Gracias
  #2 (permalink)  
Antiguo 24/04/2014, 04:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Update a partir de suma de datos de la misma tabla

No se puede .... almenos de forma directa en un UPDATE como pides, pero hay alternativas, mucho mejores.

12.15.2 GROUP BY Modifiers



Código MySQL:
Ver original
  1. SELECT IFNULL(CIUDAD,'Total'),IFNULL(COMERCIO,'Total'),SUM(INGRESOS) SINGRESOS
  2. FROM TUTABLA
  3. GROUP BY CIUDAD,COMERCIO WITH ROLLUP;

Esto no te serviria?

Incluso podrias crear una vista

Código MySQL:
Ver original
  1. CREATE VIEW vTotalIngresos AS SELECT IFNULL(CIUDAD,'Total'),IFNULL(COMERCIO,'Total'),SUM(INGRESOS) SINGRESOS
  2. FROM TUTABLA
  3. GROUP BY CIUDAD,COMERCIO WITH ROLLUP;

Y te ahorras guardar datos calculados que siempre implican un grado de riesgo sobre la coherencia de la bbdd.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 24/04/2014, 05:44
Avatar de arunda2  
Fecha de Ingreso: octubre-2008
Ubicación: España
Mensajes: 28
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Update a partir de suma de datos de la misma tabla

Gracias por tu respuesta. Son instrucciones más avanzadas que no conocía


Según veo, estas instrucciones sirven para sacar los resúmenes agrupados, pro no modifican la información en la BD

Pero el problema es que estos registros "Total" ya existen y su valor se queda incorrecto después de actualizar alguno de los otros. Se necesita actualizarlos haciendo la suma correspondiente. No se trata sólo de obtener los resultados, sino de registrarlos en la base de datos.
  #4 (permalink)  
Antiguo 24/04/2014, 05:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Update a partir de suma de datos de la misma tabla

Lo que te plantea @quimfv, es precisamente que ese campo "Total" no debería existir en la tabla.
Por regla general del modelo relacional de bases de datos no se deben jamás almacenar campos calculados. Es decir, totales, subtotales, ninguno de esos debe existir, en especial cuando se trata de valores que pueden cambiar en algún momento por cualquier razón.
Sólo en un DW se almacenan campos así porque es información histórica no modificable. Pero es en el único caso.
Sería preferible que elimines ese tipo de campos, y obtengas ese dato de la forma sugerida. Te ahorrarás muchísimos problemas a futuro, más allá de que te complique corregir los defectos de la aplicaciónn.
Sino, simplemente tendrás que hacer procesos constantes para preservar la consistencia de los datos (cosa que ya est´s teniendo que hacer).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/04/2014, 15:57
Avatar de arunda2  
Fecha de Ingreso: octubre-2008
Ubicación: España
Mensajes: 28
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Update a partir de suma de datos de la misma tabla

Son registros calculados a partir de los otros, así es

La base de datos con la que tengo este problema es de la tienda virtual de Prestashop, y está hecha así. Suapongo que será para hacer búsquedas y dibujar listas de forma más rápida sin tener que estar calculando constantemente.

Tengo un script que actualiza los inventarios de artículos de forma externa a partir de los datos de otro software, y cada vez que algo cambia se pierde la consistencia.
Por eso quisiera encontrar una instrucción SQL que lo haga todo de la vez a toda la tabla, para no tener que usar programación con muchas consultas individuales que sería mucho más lento para los servidores
  #6 (permalink)  
Antiguo 26/04/2014, 16:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Update a partir de suma de datos de la misma tabla

Cita:
Por eso quisiera encontrar una instrucción SQL que lo haga todo de la vez a toda la tabla, para no tener que usar programación con muchas consultas individuales que sería mucho más lento para los servidores
Bueno, empecemos por este tema: NO, no existe una instrucción que pueda hacer eso, y de existir no estaría diseñada para realizar tareas sobre tablas que no respetan el modelo relacional. Eso desde ya.
Sólo te resta intentarlo creando los procesos programados, o bien stored procedures, que realicen esa tarea.
Cita:
La base de datos con la que tengo este problema es de la tienda virtual de Prestashop, y está hecha así. Suapongo que será para hacer búsquedas y dibujar listas de forma más rápida sin tener que estar calculando constantemente.
Ese tipo de bases están diseñadas normalmente por taxonomías, con lo que lo que se hace es crear una base de datos reducida en tablas, de alta flexibilidad, y adaptable a diferentes escenarios.
Eso parece una gran idea, pero no lo es. Para hacer eso sacrifican una gran cantidad de capacidades y beneficios de los sistemas relacionales, y descargan toda la responsabilidad en la aplicación.
Se desarrollaron para aplicaciones livianas, en realidad. Cuando el sistema comercial que se pretende sostener es mas o menso complejo, de alto nivel de transacciones, ese tipo de bases, al menos en los aspectos contables y financieros, simplemente no sirve. Hay que empezar de nuevo y descartar en los subsistemas contables todo lo que sea asi, y diseñar una base correctamente.

Básicamente, no hay soluciones a tu dilema desde el MySQL. Tendrás que poner mucho esfuerzo de programación y ver qué puedes hacer con store procedures y events.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, registro, suma, tabla, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:36.