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

Restar campos de diferentes tablas por fechas

Estas en el tema de Restar campos de diferentes tablas por fechas en el foro de Mysql en Foros del Web. Hola compañeros, vengo con una duda de como restar la suma de unos campos de diferentes tablas, tengo una tabla ingresos donde se ingresan cierta ...
  #1 (permalink)  
Antiguo 11/01/2016, 15:53
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Restar campos de diferentes tablas por fechas

Hola compañeros, vengo con una duda de como restar la suma de unos campos de diferentes tablas, tengo una tabla ingresos donde se ingresan cierta cantidad de dinero y otra de egresos, lo que necesito es sumar los ingresos segun mes y restarlos con la suma de egresos segun el mismo mes y año, algo asi:

Mes: sum(ingresos) - sum(egresos) = saldo

Ese saldo se vaya al otro mes y me sume con algun ingreso si es que los hay y le reste el egreso de ese mes y el saldo vaya al otro mes y asi sucesivamente

mes - ingresos - egreso - saldo

enero - 800 - 500 - 300
febrero - 300 - 200 - 100
marzo - 100 (aqui le agregamos dinero digamos 500 tendriamos 600)
- 600 - 200 - 400

de estas 2 maneras me hace la resta pero total y los quiero separar por meses
Código MySQL:
Ver original
  1. SELECT Sum(t2.monto) - (SELECT sum(t1.importe)
  2. FROM cajachica t1) As Total
  3. FROM cajamonto t2
  4.  
  5.  
  6.  (
  7.   select Sum(t2.monto) as total1
  8.   from cajamonto t2
  9.  ) - (
  10.   select Sum(t1.importe) as total2
  11.   from cajachica t1
  12.  )

Espero me puedan ayudar, gracias de antemano
  #2 (permalink)  
Antiguo 12/01/2016, 10:44
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

De esta manera casi lo logro, solo necesito que el saldo del primer mes o del mes anterior se sume al siguiente mes

Código SQL:
Ver original
  1. SELECT YEAR(fecha) anio, MONTH(fecha) mes, SUM(t2.monto) - (SELECT SUM(t1.importe)
  2. FROM cajachica t1 WHERE YEAR(fecha)= anio AND MONTH(fecha) = mes) AS Total
  3. FROM cajamonto t2 GROUP BY anio, mes ORDER BY anio, mes DESC;

Alguna idea de como completarlo u otra forma de resolver este problema?
  #3 (permalink)  
Antiguo 13/01/2016, 12:18
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

Alguien me pude ayudar a como sumarle el saldo al mes siguiente o hacer algo como esto pero por mes

Código MySQL:
Ver original
  1. (select sum(campo1) from tabla1)-
  2. (select sum(campo2) from tabla2)+
  3. (select sum(campo3) from tabla3)
  4. ) as total;
  #4 (permalink)  
Antiguo 13/01/2016, 12:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Restar campos de diferentes tablas por fechas

Empecemos desde el principio de nuevo, porque me parece que hay metodos mejores y más precisos para hacer lo que necesitas...

Comencemos por un detalle: ¿las tablas cajachica y cajamonto, poseen un campo de fecha?
Postea la estructura de ambas y partamos de ese punto, ten en cuenta que las queries que has posteado no contienen información suficiente para inferir eso. Y en BBDD trabajamos con cosas concretas.
__________________
¿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 13/01/2016, 12:55
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

La tabla cajamonto tiene los campos id, monto y fecha y la tabla cajachica tiene id, importe y fecha. y lo que necesito es que se sume los montos por mes y los reste a la suma de los importes por mes de ese mismo mes.

Digamos la suma de monto del mes de enero fue 1000 lo reste a la suma de importe del mismo mes, y ese resultado se sume al monto del siguiente mes y lo reste con la suma del importe de ese mes y así los demás meses.

algo así como lo presente el el primer mensaje

mes - ingresos - egreso - saldo

Enero - 800 - 500 - 300
Febrero - 300 - 200 - 100
Marzo - 100 (aquí por ejemplo le agregamos digamos 500 tendríamos 600)
- 600 - 200 - 400
Abril- 400 - etc, etc..

espero haberme dejado entender. :(
  #6 (permalink)  
Antiguo 13/01/2016, 12: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Restar campos de diferentes tablas por fechas

No me has entendido...
Necesitamos la estructura REAL de la tabla. No descripciones.
Es decir, el resultado de ejecutar esto:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE cajamonto;
y esto:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE cajachica;

Cuando te menciono que en BBDD se trabaja con cosas concretas, es eso: El CREATE TABLE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 13/01/2016, 13:42
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

ok disculpa


caja monto


cajachica

Código MySQL:
Ver original
  1. CREATE TABLE `cajachica` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `importe` decimal(14,2) DEFAULT NULL,
  4.   `descripcion` varchar(255) DEFAULT NULL,
  5.   PRIMARY KEY (`id`)
  #8 (permalink)  
Antiguo 13/01/2016, 14:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Restar campos de diferentes tablas por fechas

Genial.
Ahora veamos si se entiende la lógica que te propongo, y también si se entiende.

Tablas:
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS cajamonto;
  2. Query OK, 0 rows affected (0.07 sec)
  3.  
  4. mysql> DROP TABLE IF EXISTS cajachica;
  5. Query OK, 0 rows affected (0.03 sec)
  6.  
  7. mysql> CREATE TABLE IF NOT EXISTS `cajamonto` (
  8.     ->   `id` INT(11) NOT NULL AUTO_INCREMENT,
  9.     ->   `monto` DECIMAL(7,2) DEFAULT NULL,
  10.     ->   PRIMARY KEY (`id`)
  11.     -> ) ENGINE=INNODB DEFAULT CHARSET=UTF8;
  12. Query OK, 0 rows affected (0.07 sec)
  13.  
  14. mysql>
  15. mysql> CREATE TABLE IF NOT EXISTS  `cajachica` (
  16.     ->   `id` INT(11) NOT NULL AUTO_INCREMENT,
  17.     ->   `importe` DECIMAL(14,2) DEFAULT NULL,
  18.     ->   `descripcion` VARCHAR(255) DEFAULT NULL,
  19.     ->   PRIMARY KEY (`id`)
  20.     -> ) ENGINE=INNODB DEFAULT CHARSET=UTF8;
  21. Query OK, 0 rows affected (0.06 sec)

Datos imaginarios:
Código MySQL:
Ver original
  1. mysql> INSERT INTO cajamonto(monto, fecha)
  2.     -> VALUES (800, '2016-01-10'), (660, '2016-01-15'), (365, '2016-02-18'), (524, '2016-02-21'),
  3.     ->  (330, '2016-03-10'), (123, '2016-03-15'), (450, '2016-04-18'), (500, '2016-04-21');
  4. Query OK, 8 rows affected (0.03 sec)
  5. Records: 8  Duplicates: 0  Warnings: 0
  6.  
  7. mysql>
  8. mysql> INSERT INTO cajachica(importe, fecha)
  9.     -> VALUES (250, '2016-01-10'), (300, '2016-01-15'), (121, '2016-02-18'), (320, '2016-02-21'),
  10.     ->  (320, '2016-03-10'), (200, '2016-03-15'), (150, '2016-04-18'), (190, '2016-04-21');
  11. Query OK, 8 rows affected (0.02 sec)
  12. Records: 8  Duplicates: 0  Warnings: 0

Consulta:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     ing.Mes, ing.Anio, Ingresos, Gastos, (ingresos - gastos) saldo
  3.     -> FROM
  4.     ->     (SELECT
  5.     ->         MONTH(fecha) mes, YEAR(fecha) anio, SUM(monto) ingresos
  6.     ->     FROM
  7.     ->         cajamonto
  8.     ->     GROUP BY MONTH(fecha) , YEAR(fecha)) ING
  9.     ->         INNER JOIN
  10.     ->     (SELECT
  11.     ->         MONTH(fecha) mes, YEAR(fecha) anio, SUM(importe) gastos
  12.     ->     FROM
  13.     ->         cajachica
  14.     ->     GROUP BY MONTH(fecha) , YEAR(fecha)) GTS ON ing.mes = gts.mes
  15.     ->         AND ing.anio = gts.anio
  16.     -> ORDER BY 2, 1;
  17. +------+------+----------+--------+--------+
  18. | Mes  | Anio | Ingresos | Gastos | saldo  |
  19. +------+------+----------+--------+--------+
  20. |    1 | 2016 |  1460.00 | 550.00 | 910.00 |
  21. |    2 | 2016 |   889.00 | 441.00 | 448.00 |
  22. |    3 | 2016 |   453.00 | 520.00 | -67.00 |
  23. |    4 | 2016 |   950.00 | 340.00 | 610.00 |
  24. +------+------+----------+--------+--------+
  25. 4 rows in set (0.00 sec)

¿Estamos más cerca?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 13/01/2016, 15:16
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

así es hasta ahí esta todo bien ahora el saldo del mes 1 debe sumarse al ingreso de mes que sigue y así sucecivamente

ese saldo de 910 se debe sumar al ingreso de 889 y ahí recién hacer la resta con 441 y sacar el nuevo saldo
  #10 (permalink)  
Antiguo 13/01/2016, 20:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Restar campos de diferentes tablas por fechas

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     ing.Mes, ing.Anio, Ingresos, Gastos, (ingresos - gastos) saldo,  SUM(ingresos - gastos) Acumulado
  3.     -> FROM
  4.     ->     (SELECT
  5.     ->         MONTH(fecha) mes, YEAR(fecha) anio, SUM(monto) ingresos
  6.     ->     FROM
  7.     ->         cajamonto
  8.     ->     GROUP BY MONTH(fecha) , YEAR(fecha)) ING
  9.     ->         INNER JOIN
  10.     ->     (SELECT
  11.     ->         MONTH(fecha) mes, YEAR(fecha) anio, SUM(importe) gastos
  12.     ->     FROM
  13.     ->         cajachica
  14.     ->     GROUP BY MONTH(fecha) , YEAR(fecha)) GTS ON ing.mes = gts.mes
  15.     ->         AND ing.anio = gts.anio
  16.     -> GROUP BY ing.Mes WITH ROLLUP;
  17. +------+------+----------+--------+--------+-----------+
  18. | Mes  | Anio | Ingresos | Gastos | saldo  | Acumulado |
  19. +------+------+----------+--------+--------+-----------+
  20. |    1 | 2016 |  1460.00 | 550.00 | 910.00 |    910.00 |
  21. |    2 | 2016 |   889.00 | 441.00 | 448.00 |    448.00 |
  22. |    3 | 2016 |   453.00 | 520.00 | -67.00 |    -67.00 |
  23. |    4 | 2016 |   950.00 | 340.00 | 610.00 |    610.00 |
  24. | NULL | 2016 |   950.00 | 340.00 | 610.00 |   1901.00 |
  25. +------+------+----------+--------+--------+-----------+
  26. 5 rows in set (0.00 sec)
La repetición de datos en la última linea es inevitable para lo que quieres hacer, al menos desde el SQL.

Para evitar eso hay que utilizar variables de sesion de usuario, que necesitan mucha práctica.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 13/01/2016, 20:17
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

ese acumulado del primer pes deberia sumarlo al ingreso del segundo mes, el acumulado del segundo mes al ingreso del tercer mes y asi sucesivamente estuve intentando hacer algo pero me lo agrega al mismo mes nose como poddria agregarlo al mes que sigue

Código MySQL:
Ver original
  1. SELECT ing.Mes, ing.Anio, (Ingresos + Saldo2), Gastos, (ingresos - gastos) saldo
  2. MONTH(fecha) mes, YEAR(fecha) anio, SUM(monto) ingresos
  3. FROM cajamonto where MONTH(fecha) = MONTH(fecha)
  4. GROUP BY MONTH(fecha), YEAR(fecha)) ING
  5. (SELECT MONTH(fecha) mes, YEAR(fecha) anio, SUM(importe) gastos
  6. FROM cajachica
  7. GROUP BY MONTH(fecha), YEAR(fecha)) GTS ON ing.mes = gts.mes
  8. AND ing.anio = gts.anio
  9. (SELECT YEAR(fecha) anio, MONTH(fecha) mes, Sum(t2.monto) - (SELECT sum(t1.importe)
  10. FROM cajachica t1 WHERE YEAR(fecha)= anio AND MONTH(fecha) = mes) As Saldo2
  11. FROM cajamonto t2 GROUP BY anio, mes) as SAL ON sal.mes = gts.mes
  12. AND sal.anio = gts.anio
  13. ORDER BY 2, 1;
  #12 (permalink)  
Antiguo 13/01/2016, 21:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Restar campos de diferentes tablas por fechas

Ya te dije. Es el método que te muestro, o variables de usuario propias de MySQL. Y para esas hay que tener mucha práctica, porque se puede cometer errores con mucha facilidad.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 13/01/2016, 21:40
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Restar campos de diferentes tablas por fechas

El ultimo código que colocaste no cumple con el propósito que necesito, ahí solo suma el el saldo al final, tal ves no me entendiste o yo no a ti, gracias de todas maneras por toda la ayuda y si tienes alguna idea encantado de leerte igual seguiré investigando.

Etiquetas: campo, campos, restar, select, tabla, tablas
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 01:14.