SQL - QUERY SUM - VALOR DE REGISTRO DE OTRA TABLA

 
Vista:

QUERY SUM - VALOR DE REGISTRO DE OTRA TABLA

Publicado por Allan Galaviz de Leon (1 intervención) el 14/09/2012 20:51:29
Hola quisiera consultar este problema que tengo ya que no soy experto en bases de datos, ojala alguien pueda ayudarme con este query que necesito, solo pondre los campos que creo son los importantes para resolver la estructura de mi consulta y no llenar de ruido

Tengo 1 tabla donde tengo mis facturas con sus respectivos importes

FACTURAS
ID | DOCTO | IMPORTE |
1 A1 15000
2 A2 2300
3 A3 6000

y otra tabla donde cargo los abonos

ABONOS

ID | DOCTO | IMPORTE |
1 A1 300
2 A3 200
3 A1 500
4 A2 100
5 A1 300

Ya tengo como hacer la suma de los abonos

SELECT ABONOS.DOCTO, SUM(ABONOS.IMPORTE) AS SALDO FROM ABONOS
GROUP BY ABONOS.DOCTO

pero no deseo la suma de los abonos, sino el saldo restante de la factura, algo asi
SUM(ABONOS.IMPORTE) - FACTURAS.IMPORTE
Obvio una instruccion asi me da error, no se como debo hacer para tener el saldo, de antemano muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

QUERY SUM - VALOR DE REGISTRO DE OTRA TABLA

Publicado por leonardo_josue (1173 intervenciones) el 14/09/2012 22:17:13
Hola Allan Galaviz de Leon:

Olvidaste menciona con qué BD estás trabajando... este dato es muy importante para nosotros, pues aunque la sintaxis entre todos los DBMS es similar, también tienen diferencias importantes. Mucho ojo para la próxima. Por lo pronto para el ejemplo voy a utilizar MySQL, si utilizas algún otro será cuestión de que encuentres una manera semejante de realizar la consulta.

En realidad tienes muchas maneras de resolver la consulta, desde mi punto de vista la solución más sencilla es hacerlo con JOIN's... el primer punto que tienes que considerar es que tu tabla de abonos tiene múltiples registros para cada factura por lo tanto como bien lo infieres en tu post es necesario agrupar primero antes de realizar la unión... entonces podrías primero hacer algo como esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT * FROM abonos;
+------+-------+---------+
| ID   | DOCTO | IMPORTE |
+------+-------+---------+
|    1 | A1    |     300 |
|    2 | A3    |     200 |
|    3 | A1    |     500 |
|    4 | A2    |     100 |
|    5 | A1    |     300 |
+------+-------+---------+
5 rows in set (0.00 sec)
 
mysql> SELECT docto, SUM(importe) total_abonos
    ->   FROM abonos GROUP BY docto;
+-------+--------------+
| docto | total_abonos |
+-------+--------------+
| A1    |         1100 |
| A2    |          100 |
| A3    |          200 |
+-------+--------------+
3 rows in set (0.04 sec)


De esta manera Sumas el total de abonos para cada factura... ahora la relación entre tus tablas sería de uno a uno... ahora bien, supongo que se puede dar el caso de alguna factura que en realidad NO TENGA NINGÚN ABONO. Con esta lógica, DEBES IMPLEMENTAR UN LEFT O UN RIGTH JOIN, pues el INNER JOIN sirve sólo para unir tablas donde existan registros en ambas tablas. la consulta quedaría entonces así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mysql> SELECT * FROM facturas;
+------+-------+---------+
| ID   | DOCTO | IMPORTE |
+------+-------+---------+
|    1 | A1    |   15000 |
|    2 | A2    |    2300 |
|    3 | A3    |    6000 |
+------+-------+---------+
3 rows in set (0.01 sec)
 
mysql> SELECT * FROM abonos;
+------+-------+---------+
| ID   | DOCTO | IMPORTE |
+------+-------+---------+
|    1 | A1    |     300 |
|    2 | A3    |     200 |
|    3 | A1    |     500 |
|    4 | A2    |     100 |
|    5 | A1    |     300 |
+------+-------+---------+
5 rows in set (0.00 sec)
 
mysql> SELECT
    ->   f.importe,
    ->   a.total_abonos saldo,
    ->   f.importe - IFNULL(a.total_abonos, 0) saldo
    -> FROM facturas f
    -> LEFT JOIN
    -> ( SELECT docto, SUM(importe) total_abonos
    ->   FROM abonos GROUP BY docto) a
    -> ON f.docto = a.docto;
+---------+-------+-------+
| importe | saldo | saldo |
+---------+-------+-------+
|   15000 |  1100 | 13900 |
|    2300 |   100 |  2200 |
|    6000 |   200 |  5800 |
+---------+-------+-------+
3 rows in set (0.00 sec)


Observa en primer lugar que el LEFT JOIN lo hago sobre la subconsulta que obtuve en la primer parte... de esta manera PRIMERO SE REALIZA LA SUMA DE LOS ABONOS y el resultado se resta al importe de la factura. Observa también que en la consulta estoy utilizando la función IFNULL esta es propia de MySQL y sirve para sustituir valores nulos... en este caso, cuando una factura no tenga abonos, en realidad restaría un 0.

Dale un vistazo, si tienes alguna duda lo comentas en el foro. Si utilizas otra BD y no encuentras la alternativa para resolver esta consulta dinos con qué estás trabajando y con justo te ayudamos a encontrar una respuesta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

QUERY SUM - VALOR DE REGISTRO DE OTRA TABLA

Publicado por carlos julio (1 intervención) el 23/01/2015 04:02:11
Excelente su explicación, después de tanto tiempo que la ha publicado, hoy me ha servido mucho.
Mil gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar