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

sumar 2 valores

Estas en el tema de sumar 2 valores en el foro de Mysql en Foros del Web. ahora si que me la he craneado toda la tarde y no logro entender como hacer, resulta que tengo una tabla con 3 campos:ID,FECHA,VALOR el ...
  #1 (permalink)  
Antiguo 22/06/2009, 19:12
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
sumar 2 valores

ahora si que me la he craneado toda la tarde y no logro entender como hacer, resulta que tengo una tabla con 3 campos:ID,FECHA,VALOR
el problema pasa por que tengo que hacer una resta entre 2 valores del campo VALOR, me explico un poco mas: son lecturas electricas, entonces necesito restar la lectura del mes anterior con el acutual...ojalas alguien me pudiera ayudar gracias
  #2 (permalink)  
Antiguo 22/06/2009, 19:17
Avatar de p3rikl3s  
Fecha de Ingreso: febrero-2009
Ubicación: Valencia
Mensajes: 216
Antigüedad: 15 años, 2 meses
Puntos: 9
Respuesta: sumar 2 valores

Mmm y exactamente donde tienes problemas ? en el momento de hacer la resta ?
__________________
También me hago llamar Tropiburguer. Sígueme en twitter: @tropiburguer
  #3 (permalink)  
Antiguo 22/06/2009, 19:23
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

si es que no se me ocurre como hacerlo, ejemplo si tengo que mostrar la energia , tengo qure restar el valor del consumo actual menos el anterior, no seria problema si fuera una lectura pero son como 300, gracias
  #4 (permalink)  
Antiguo 22/06/2009, 20:04
Avatar de p3rikl3s  
Fecha de Ingreso: febrero-2009
Ubicación: Valencia
Mensajes: 216
Antigüedad: 15 años, 2 meses
Puntos: 9
Respuesta: sumar 2 valores

Bueno haces un ciclo (puede ser un while) y dentro de el vas restando el campo de la base de dato que contiene la lectura actual con el campo que contiene la lectura anterior, el resultado lo puedes ir guardando en un arreglo para luego guardarlo en la base de datos o imprimirlo en pantalla.

Esa sería la lógica de como pudiese solucionar tu problema. Si tienes percances con el desarrollo no dudes en comentar.

Saludos.
__________________
También me hago llamar Tropiburguer. Sígueme en twitter: @tropiburguer
  #5 (permalink)  
Antiguo 22/06/2009, 22:00
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: sumar 2 valores

Mira este ejemplo y dinos si es lo que necesitas.

Código mysql:
Ver original
  1. mysql> select *from factura;
  2. +----+------------+-------+
  3. | id | fecha      | valor |
  4. +----+------------+-------+
  5. |  1 | 2009-06-22 |  1200 |
  6. |  2 | 2009-05-22 |  1100 |
  7. |  3 | 2009-04-22 |  1000 |
  8. +----+------------+-------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> select (t1.valor1-t1.valor2)valor_r from (select sum(if(date_format(fecha
  12. ,'%Y-%m')=date_format(now(),'%Y-%m'),valor,''))valor1,sum(if(date_format(fecha,'
  13. %Y-%m')='2009-05',valor,''))valor2 from factura)t1;
  14. +---------+
  15. | valor_r |
  16. +---------+
  17. |     100 |
  18. +---------+
  19. 1 row in set (0.00 sec)
  20.  
  21. mysql>

Resta el valor del mes actual, con el mes anterior.
1200-1100=100
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 22/06/2009, 23:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: sumar 2 valores

Si realmente quieres restar el mes anterior con el siguiente (no el actual como decías) y obtener esos 29 valores y asegurarte de que resta bien los meses, debes hacer un autojoin de la tabla consigo misma, restando el valor de un mes con el del siguiente:

Código sql:
Ver original
  1. SELECT f1.fecha inicio_lectura, f2.fecha final_lectura, (f2.valor-f1.valor)gasto
  2.   FROM factura f1 INNER JOIN factura f2
  3.     ON (DATE_FORMAT(DATE_ADD(f1.fecha, INTERVAL 1 MONTH),'%Y-%m')= DATE_FORMAT(f2.fecha,'%Y-%m'))

He puesto DATE_FORMAT, por si en algún caso el día de lectura no fuera el 22, pero si siempre es el 22 no haría falta el date_format.

Última edición por jurena; 23/06/2009 a las 08:29
  #7 (permalink)  
Antiguo 23/06/2009, 08:15
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

gracias por las respuestas , voy a probar y les aviso gracias de verdad
  #8 (permalink)  
Antiguo 24/06/2009, 08:18
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

Cita:
Iniciado por huesos52 Ver Mensaje
Mira este ejemplo y dinos si es lo que necesitas.

Código mysql:
Ver original
  1. mysql> select *from factura;
  2. +----+------------+-------+
  3. | id | fecha      | valor |
  4. +----+------------+-------+
  5. |  1 | 2009-06-22 |  1200 |
  6. |  2 | 2009-05-22 |  1100 |
  7. |  3 | 2009-04-22 |  1000 |
  8. +----+------------+-------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> select (t1.valor1-t1.valor2)valor_r from (select sum(if(date_format(fecha
  12. ,'%Y-%m')=date_format(now(),'%Y-%m'),valor,''))valor1,sum(if(date_format(fecha,'
  13. %Y-%m')='2009-05',valor,''))valor2 from factura)t1;
  14. +---------+
  15. | valor_r |
  16. +---------+
  17. |     100 |
  18. +---------+
  19. 1 row in set (0.00 sec)
  20.  
  21. mysql>

Resta el valor del mes actual, con el mes anterior.
1200-1100=100
saludos HUESOS52 , gracias por tu respuesta estoy tratando de implementarla pero me gustaria saber de donde sacas : (t1.valor1-t1.valor2)

gracias
  #9 (permalink)  
Antiguo 24/06/2009, 08:25
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: sumar 2 valores

mysql> SELECT (t1.valor1-t1.valor2)valor_r FROM (SELECT sum(if(DATE_FORMAT(fecha
,'%Y-%m')=DATE_FORMAT(NOW(),'%Y-%m'),valor,''))valor1,sum(if(DATE_FORMAT(fecha,'
%Y-%m')='2009-05',valor,''))valor2 FROM factura)t1;

Fijate que t1 es la tabla resultante de todo lo que se hace dentro del parentesis. y valor1 y valor2 son alias que le doy a los campos que están dentro de esa tabla.
Es por eso, que desde afuera de la consulta, puedo hacer referencia a la tabla, poniendo t1.valor1.

Para un ejemplo sencillo, es lo mismo que decir:
select tabla.campo1,tabla2.campo2 from tabla,tabla2;

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 24/06/2009, 10:20
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

mira no logro poder realizarlo......mira mis campos son:

nombre fecha lectura

local1 2009-01-01 6789
local1 2009-02-01 7000
local1 2009-03-01 7500

la tabla se llama locales

osea el resultado seria 711 si es que tomara desde el 2009-01-01 al 2009-03-01 ademas el rsultado seria

nombre fecha lectura

local1 2009-01-01 al 2009-03-01 6789

y asi para abajo con 200 locales


gracias y disculpa tantas molestias
  #11 (permalink)  
Antiguo 24/06/2009, 13:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: sumar 2 valores

De todos, creo que jurena fue quien mejor entendió el problema.

prueba esto:
Código sql:
Ver original
  1. SELECT date_format(f2.fecha,'%Y-%m')fecha1, date_format(f1.fecha,'%Y-%m') fecha2, (f2.lec2-f1.lec1)gasto
  2. FROM (SELECT fecha,SUM(lectura)lec1 FROM locales GROUP BY date_format(fecha,'%Y-%m'))f1 INNER JOIN
  3. (SELECT fecha,SUM(lectura)lec2 FROM locales GROUP BY date_format(fecha,'%Y-%m')) f2
  4. ON (DATE_FORMAT(f1.fecha,'%Y-%m') = DATE_FORMAT(DATE_sub(f2.fecha, INTERVAL 1 MONTH),'%Y-%m'))
  5. ORDER BY fecha1;

Nos cuentas como te va.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 24/06/2009, 14:08
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

Cita:
Iniciado por jurena Ver Mensaje
Si realmente quieres restar el mes anterior con el siguiente (no el actual como decías) y obtener esos 29 valores y asegurarte de que resta bien los meses, debes hacer un autojoin de la tabla consigo misma, restando el valor de un mes con el del siguiente:

Código sql:
Ver original
  1. SELECT f1.fecha inicio_lectura, f2.fecha final_lectura, (f2.valor-f1.valor)gasto
  2.   FROM factura f1 INNER JOIN factura f2
  3.     ON (DATE_FORMAT(DATE_ADD(f1.fecha, INTERVAL 1 MONTH),'%Y-%m')= DATE_FORMAT(f2.fecha,'%Y-%m'))

He puesto DATE_FORMAT, por si en algún caso el día de lectura no fuera el 22, pero si siempre es el 22 no haría falta el date_format.
JURENA, te consulto tu dices hacer un join con la misma tabla simulando qeu son 2 diferentes


gracias
  #13 (permalink)  
Antiguo 24/06/2009, 14:22
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: sumar 2 valores

jalh1977

Ahora entiendo un poco ms, y lo creo que necesitas, es la resta de totales entre un mes y otro. La consulta de jurena es fundamental para mostrar todos los valores entre los meses, pero creo que le falta realizar la suma agrupada por mes.

La que yo te pasé, creo que hace lo que necesitas. Te dejo un ejemplo de lo que hice.

Código mysql:
Ver original
  1. mysql> select *from locales;
  2. +--------+------------+---------+
  3. | nombre | fecha      | lectura |
  4. +--------+------------+---------+
  5. | local1 | 2009-01-01 |    6789 |
  6. | local1 | 2009-02-01 |    7000 |
  7. | local1 | 2009-03-01 |    7500 |
  8. | local1 | 2009-04-01 |    7550 |
  9. | local1 | 2009-05-01 |    8000 |
  10. | local1 | 2009-06-01 |    9000 |
  11. | local1 | 2009-06-01 |    9200 |
  12. | local1 | 2009-06-04 |     200 |
  13. | local1 | 2009-05-04 |    1200 |
  14. | local1 | 2009-06-09 |     400 |
  15. +--------+------------+---------+
  16. 10 rows in set (0.00 sec)
  17.  
  18. mysql> SELECT date_format(f2.fecha,'%Y-%m')fecha1, date_format(f1.fecha,'%Y-%m') fecha2, (f2.lec2-f1.lec1)gasto
  19.     -> FROM (select fecha,sum(lectura)lec1 from locales group by date_format(fecha,'%Y-%m'))f1 INNER JOIN
  20.     -> (select fecha,sum(lectura)lec2 from locales group by date_format(fecha,'%Y-%m')) f2
  21.     -> ON (DATE_FORMAT(f1.fecha,'%Y-%m') = DATE_FORMAT(DATE_sub(f2.fecha, INTERVAL 1 MONTH),'%Y-%m'))
  22.     -> order by fecha1 desc;
  23. +---------+---------+-------+
  24. | fecha1  | fecha2  | gasto |
  25. +---------+---------+-------+
  26. | 2009-06 | 2009-05 |  9600 |
  27. | 2009-05 | 2009-04 |  1650 |
  28. | 2009-04 | 2009-03 |    50 |
  29. | 2009-03 | 2009-02 |   500 |
  30. | 2009-02 | 2009-01 |   211 |
  31. +---------+---------+-------+
  32. 5 rows in set (0.00 sec)

Si te fijas es un autojoin, pero no con la tabla directamente como lo hace jurena, sino con la sumatoria por mes de locales.
Mira la sumatoria de lectura para el mes de junio (18800) si le restas el total de mayo (9200) te da 9600.

Según los resultados, si restamos el total de junio (2009-06) con el total de mayo (2009-05)
obtendrás el valor en la consulta. Igual para todos los meses. Acabo de hacer la prueba de escritorio y funciona.

A no ser, siga entendiendo mal.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #14 (permalink)  
Antiguo 24/06/2009, 23:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: sumar 2 valores

Cita:
nombre fecha lectura

local1 2009-01-01 6789
local1 2009-02-01 7000
local1 2009-03-01 7500

la tabla se llama locales

osea el resultado seria 711 si es que tomara desde el 2009-01-01 al 2009-03-01 ademas el resultado seria

nombre fecha lectura

local1 2009-01-01 al 2009-03-01 6789

y asi para abajo con 200 locales
Para hacer una búsqueda concreta de meses que pueden ser más de uno, creo que así:
Para el local1 desde enero a marzo de 2009.
Código sql:
Ver original
  1. SELECT f1.nombre, f1.fecha inicio_lectura, f2.fecha final_lectura, (f2.valor-f1.valor)gasto
  2.   FROM factura f1 INNER JOIN factura f2
  3.     ON (f1.nombre = f2.nombre) WHERE f1.nombre = 'local1' AND (DATE_FORMAT(f1.fecha,'%Y-%m') = '2009-01' AND DATE_FORMAT(f2.fecha,'%Y-%m')='2009-03' )

Naturalmente, si quieres los datos de los doscientos locales de enero a marzo
Código sql:
Ver original
  1. SELECT f1.nombre, f1.fecha inicio_lectura, f2.fecha final_lectura, (f2.valor-f1.valor)gasto
  2.   FROM factura f1 INNER JOIN factura f2
  3.     ON (f1.nombre = f2.nombre) WHERE (DATE_FORMAT(f1.fecha,'%Y-%m') = '2009-01' AND DATE_FORMAT(f2.fecha,'%Y-%m')='2009-03' )
  #15 (permalink)  
Antiguo 25/06/2009, 02:07
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: sumar 2 valores

Buenas,
te serviria algo asi?, segun dices solo necesitas el valor de la operacion:

Código mysql:
Ver original
  1. SELECT SUM(valor) FROM factura
  2. ) - (
  3. SELECT SUM(valor) FROM factura
  4. WHERE DATE_FORMAT(fecha,'%m-%Y') = DATE_FORMAT(CURRENT_DATE,'%m-%Y')) AS valor

Saludos!
  #16 (permalink)  
Antiguo 25/06/2009, 10:32
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

SELECT f1.nombre, f1.fecha inicio_lectura, f2.fecha final_lectura, (f2.valor-f1.valor)gasto FROM factura f1 INNER JOIN factura f2 ON (f1.nombre = f2.nombre) WHERE (DATE_FORMAT(f1.fecha,'%Y-%m') = '2009-01' AND DATE_FORMAT(f2.fecha,'%Y-%m')='2009-03' )


al final me sirvio este codigo, modificandolo un poco con la realidad de mi tabla, se los agradezco muchos a todos los que me ayudaron , lo que si ahora tengo otro problema referente a esto mismo........

"SELECT z1.id,z1.nombre,z1.factor, z1.tarifa, z1.fecha inicio_lectura, z2.fecha final_lectura, (z2.lectura-z1.lectura)consumo FROM locales_anto z1 INNER JOIN locales_anto z2 ON (z1.nombre = z2.nombre) WHERE (DATE_FORMAT(z1.fecha,'%Y-%m') = '"&fecha2&"' AND DATE_FORMAT(z2.fecha,'%Y-%m')='"&fecha1&"' )"

puse este codigo ya que estoy trabajando en asp, el tema esque ahora quiero pasarle las variables fecha1 y fecha 2 que son los que me pasan los clientes que consultan la aplicacion para consultar los meses que quieren generar el informe, pero no me muestra nada , no se donde estoy haciendo mal, gracias
  #17 (permalink)  
Antiguo 25/06/2009, 10:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: sumar 2 valores

jalh1977,
primero prueba con datos absolutos para ver que la consulta es correcta. Luego mira cómo se pasan desde el formulario. Controla la fecha inicio y la fecha fin (no deben ser iguales y tampoco la segunda anterior a la primera, y comprueba cómo la introducen (piensa que sólo valdrá año y mes con este formato: 2009-01)
  #18 (permalink)  
Antiguo 25/06/2009, 11:07
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

saludos, mira le ingreso valores reales directo a la consulta y la genera sin problemas, el tema es cuando le pongo las variables

las recojo desde el formulario de inicio y las guardado en variables y luego las construyo de esta forma

fecha1=ano1+"-"+mes
fecha2=ano1+"-"+mes1

y ya comprobe cambiando de posicion las variables y nada me arroja un error
  #19 (permalink)  
Antiguo 25/06/2009, 11:09
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: sumar 2 valores

Buenas,
no me queda del todo claro o no esta bien planteada la consigna, pero porque en la consulta muestras fecha, lecturas, etc.?, hasta donde tenia entendido necesitabas la diferencia entre la sumatoria del mes anterior a la del actual.

Lo mas importante antes de tirar codigo, el que sea, es tener bien planteada la consigna, y despues ver las alternativas mas convenientes.

Como dice jurena, prueba con pocos valores, faciles de seguir.

Saludos y suerte
  #20 (permalink)  
Antiguo 25/06/2009, 11:15
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

Cita:
Iniciado por Tx Ver Mensaje
Buenas,
no me queda del todo claro o no esta bien planteada la consigna, pero porque en la consulta muestras fecha, lecturas, etc.?, hasta donde tenia entendido necesitabas la diferencia entre la sumatoria del mes anterior a la del actual.

Lo mas importante antes de tirar codigo, el que sea, es tener bien planteada la consigna, y despues ver las alternativas mas convenientes.

Como dice jurena, prueba con pocos valores, faciles de seguir.

Saludos y suerte
HOLA , mira la pregunta de un comienzo estubo mal planteada , por eso despues la plantie nuevamnete, ahora solo tengo dramas con pasarle las variables a la consulta, y como dijo jurena estoy probando de diferentes maneras para ver que resulta gracias
  #21 (permalink)  
Antiguo 25/06/2009, 11:39
 
Fecha de Ingreso: septiembre-2008
Mensajes: 242
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: sumar 2 valores

bueno ya lo arregle, estaba pasando mal un valor de la fecha , gracias a todos los que me ayudaron y se dieron la molestia de responder, de verdad gracias
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 00:19.