SQL - Suma de columnas en diferentes tablas

 
Vista:
sin imagen de perfil

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 30/06/2018 02:53:18
Hola, actualmente estoy haciendo una consulta en PHP, por un ID, y este mismo, se ha escrito en las tablas
manobra, materiales, maquinaria.

Tengo un problema con esta consulta:

1
2
3
4
5
6
7
8
$consulta = $conexion->query("SELECT round(sum(manobra.resultado + materiales.resultado + maquinaria.precio),2) as total from manobra, materiales, maquinaria where (materiales.idmaterial = '$id') and (manobra.idmanobra = '$id') and (maquinaria.idmaquinaria = '$id')");
    while($f = $consulta->fetch_object()) {
	if($consulta->num_rows>0)
    echo "<table> border='2' align='center'>";
    echo "<td>";
	echo 'Total: ';
    echo $f->total.'</td>';
	echo "</table>";

Necesito redondear la suma total de las tablas y sus columnas:
-manobra -> resultado
-materiales -> resultado
-maquinaria -> precio

Pero me sale un resultado distinto. Como si estuviese multiplicandolo por 4. :/

Agradecería enormemente sus ayudas.
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

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 30/06/2018 09:53:15
MYSQL
He probado con esta consulta:
1
2
3
4
5
6
SELECT manobra.resultado,
              materiales.resultado,
              maquinaria.precio,
              sum(manobra.resultado + materiales.resultado + maquinaria.precio)
FROM manobra, materiales, maquinaria
WHERE (manobra.idmanobra = '5b36bacf47f') and (materiales.idmaterial = '5b36bacf47f') and (maquinaria.idmaquinaria = '5b36bacf47f')
El id es '5b36bacf47f'

Lo que resulta:
Captura

La suma es incorrecta. :/
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Suma de columnas en diferentes tablas

Publicado por leonardo_josue (1173 intervenciones) el 02/07/2018 20:15:21
Hola Phpnewbie:

No nos dices cómo estás relacionadas tus tabla, es decir, si tienes una relación 1 a 1, 1 a muchos o muchos a muchos... y ahí puede haber un problema...

De entrada te comento que la forma en que relacionas tus tablas no es la mejor manera: es mejor usar JOIN's (INNER, LEFT, RIGTH según sea el caso) o en su defecto tienes que agregar en el WHERE una condición que relacione cada una de tus tablas:

checa este caso, supongamos que tienes estas tablas:

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 tabla_a;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla_b;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | one         |
|    1 | un          |
|    2 | two         |
|    2 | deux        |
|    3 | three       |
|    3 | trois       |
+------+-------------+
6 rows in set (0.00 sec)

entonces, tal como estás poniendo tus tablas, se podría estar haciendo un PRODUCTO CARTESIANO:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla_a, tabla_b WHERE tabla_a.id = 1;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    1 | uno         |    1 | un          |
|    1 | uno         |    2 | two         |
|    1 | uno         |    2 | deux        |
|    1 | uno         |    3 | three       |
|    1 | uno         |    3 | trois       |
+------+-------------+------+-------------+
6 rows in set (0.00 sec)

entonces, lo que tienes que haces es agregar la condición que relaciona ambas tablas, en este caso, el campo ID:

1
2
3
4
5
6
7
8
mysql> SELECT * FROM tabla_a, tabla_b WHERE tabla_a.id = tabla_b.id and tabla_a.id = 1;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    1 | uno         |    1 | un          |
+------+-------------+------+-------------+
2 rows in set (0.00 sec)

O como dije al inicio, es mejor usar JOIN's para hacer esto mismo:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla_a
    -> INNER JOIN tabla_b ON tabla_a.id = tabla_b.id
    -> WHERE tabla_a.id = 1;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    1 | uno         |    1 | un          |
+------+-------------+------+-------------+
2 rows in set (0.00 sec)

¿Se entiende?

Puedes darte cuenta de cómo se están relacionando las tablas quitando la condición SUM;

1
2
3
4
5
6
7
8
SELECT manobra.resultado,
              materiales.resultado,
              maquinaria.precio
FROM manobra, materiales, maquinaria
WHERE
  (manobra.idmanobra = '5b36bacf47f') and
  (materiales.idmaterial = '5b36bacf47f') and
  (maquinaria.idmaquinaria = '5b36bacf47f')

Si esto te regresa más de un registro, es la razón de que la suma no coincida con lo que esperas.

Haz la prueba y nos comentas.

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
1
Comentar
sin imagen de perfil

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 02/07/2018 23:10:34
Gracias por ayudarme, Voy a revisar, te cuento si me salió.
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
sin imagen de perfil

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 03/07/2018 00:06:10
Mira amigo, las tablas las relaciono por un ID unico generado por uniqid(); en PHP.

Pasa que tengo un pagina que inserta datos a la tabla, este mismo genera el id. Luego por medio de un enlace (GET) lo envia a un form que añade mas datos con ese mismo ID, lo que quiere decir que los datos ingresados, todos tienen ese ID.
Pero, si vuelves al principio obtienes otro ID distinto.

Por esa razon cuando sumo, sumo solo un ID que deseo, el que ubico en la condición WHERE, para sumar las columnas de las tablas (manobra, materiales, maquinaria) llamadas: (resultado, resultado, precio), como veras aquí, asi son las tablas:

https://www.lawebdelprogramador.com/foros/MySQL/1660192-Totalizacion-SUM-de-columnas-en-distintas-tablas.html
tablas
Y no lo he logrado lamentablemente. Con lo de INNER JOIN estoy quemado en ese asunto, entiendo que sirve para relacionar tablas como en tu ejemplo, pero para armar la consulta, me rallo como disco.

¿Como sería un ejemplo de esa consulta considerando mis tablas? Me ayudaría mucho, ya que me estoy estancando :(
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Suma de columnas en diferentes tablas

Publicado por leonardo_josue (1173 intervenciones) el 03/07/2018 16:59:53
Hola de nuevo Phpnewbie:

Vayamos por partes:

1
2
Por esa razon cuando sumo, sumo solo un ID que deseo, el que ubico en la condición WHERE,
para sumar las columnas de las tablas (manobra, materiales, maquinaria) llamadas: (resultado, resultado, precio)

Creo que no terminas de entender que el problema está en la CARDINALIDAD que hay entre tus tablas y si no conoces de que estoy hablando, entonces me temo que estás en un muy grave problema.

Como te comenté en mi post anterior, lo primero que tienes qué determinar es si tienes una relación 1 a 1 (es decir un registro de man obra se relaciona CON 1 Y SOLO 1 registro de materiales y a su vez CON 1 Y SÓLO 1 maquinaria) si esto es así, entonces tu consulta original "podría" servir, pero dado que no es así entonces tienes relaciones 1 a muchos o muchos a muchos.

Te voy a poner dos casos ejemplos a ver si me entiendes mejor:

supóngamos que tienes estas dos tablas:

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 tabla1;
+----+-------------+-----------+
| id | descripcion | resultado |
+----+-------------+-----------+
|  1 | uno         |        10 |
|  2 | dos         |        20 |
|  3 | tres        |        30 |
|  3 | three       |        31 |
+----+-------------+-----------+
4 rows in set (0.01 sec)
 
mysql> SELECT * FROM tabla2;
+----+-------------+-----------+
| id | descripcion | resultado |
+----+-------------+-----------+
|  1 | otro uno    |        10 |
|  2 | otro dos    |        20 |
|  2 | otro two    |        21 |
|  3 | otro tres   |        30 |
|  3 | otro three  |        31 |
+----+-------------+-----------+
5 rows in set (0.00 sec)

En este caso, la relación está dada por el campo ID. Supongamos que quieres sumar los resultados de ambas tablas, entonces, siguiendo tu consulta, para el ID = 1 tendrías lo siguiente:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT
    ->   tabla1.resultado, tabla2.resultado, sum(tabla1.resultado + tabla2.resultado) suma
    -> FROM tabla1, tabla2
    -> WHERE tabla1.id = 1 AND tabla2.id = 1;
+-----------+-----------+------+
| resultado | resultado | suma |
+-----------+-----------+------+
|        10 |        10 |   20 |
+-----------+-----------+------+
1 row in set (0.00 sec)

Aquí no hay ningún problema PORQUE SÓLO HAY UN REGISTRO CON ID_1 EN CADA TABLA... pero ¿QUÉ PASA CON LOS ID'S 2 Y 3)

1
2
3
4
5
6
7
8
9
10
mysql> SELECT
    ->   tabla1.resultado, tabla2.resultado, sum(tabla1.resultado + tabla2.resultado) suma
    -> FROM tabla1, tabla2
    -> WHERE tabla1.id = 2 AND tabla2.id = 2;
+-----------+-----------+------+
| resultado | resultado | suma |
+-----------+-----------+------+
|        20 |        20 |   81 |
+-----------+-----------+------+
1 row in set (0.00 sec)

1
2
3
4
5
6
7
8
9
10
mysql> SELECT
    ->   tabla1.resultado, tabla2.resultado, sum(tabla1.resultado + tabla2.resultado) suma
    -> FROM tabla1, tabla2
    -> WHERE tabla1.id = 3 AND tabla2.id = 3;
+-----------+-----------+------+
| resultado | resultado | suma |
+-----------+-----------+------+
|        30 |        30 |  244 |
+-----------+-----------+------+
1 row in set (0.00 sec)

pues pasa lo que en tu caso LAS SUMAS NO COINCIDEN, pero eso no implica que estés mal, simplemente es que en las tablas HAY MÁS DE UN REGISTRO CON ID=2 O ID=3, en otras palabras, tienes una relación 1 a muchos o muchos a muchos. Observa qué pasa si quito la SUM de la consulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT
    ->   tabla1.*, tabla2.*
    -> FROM tabla1, tabla2
    -> WHERE tabla1.id = 3 AND tabla2.id = 3;
+----+-------------+-----------+----+-------------+-----------+
| id | descripcion | resultado | id | descripcion | resultado |
+----+-------------+-----------+----+-------------+-----------+
|  3 | tres        |        30 |  3 | otro tres   |        30 |
|  3 | three       |        31 |  3 | otro tres   |        30 |
|  3 | tres        |        30 |  3 | otro three  |        31 |
|  3 | three       |        31 |  3 | otro three  |        31 |
+----+-------------+-----------+----+-------------+-----------+
4 rows in set (0.00 sec)

esto es un producto CARTESIANO, es decir, cada registro de la tabla1 se relaciona con cada registro de la tabla2 PORQUE TIENEN EL MISMO ID... y esto no quiere decir que esté mal, sino que la forma en que estás planteando la suma es lo que está mal...

1
2
Y no lo he logrado lamentablemente. Con lo de INNER JOIN estoy quemado en ese asunto, entiendo que sirve
para relacionar tablas como en tu ejemplo, pero para armar la consulta, me rallo como disco.

Más que entender cómo hacer JOIN's lo que debes de entender es como relacionar tablas, independientemente si lo haces de forma implícita (from tabla1, tabla2 where) o explícita (from tabla1 inner join tabla2 on...). pero si no entiendes el concepto de relaciones en BD's entonces estás completamente perdido y será muy difícil ayudarte.

Te vuelvo a poner lo mismo que puse en el post pasado:

1
2
si continuas con problemas, postea algunos datos de ejemplo de cada una de tus tablas. a partir de esos
datos dinos qué es lo que esperas obtener como salida y con gusto te tratamos de ayudar.

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

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 03/07/2018 22:56:21
Oh, ya entendí. Tengo varios registro con un mismo ID, eso es mi problema.
Quiero sumar varios de esos registros, (en conjunto) y con este caso, no podre resolverlo :/
Estoy agradecido por tu paciencia al explicarme, estoy recién aprendiendo sql, ahora gracias a ti comprendí.

¿Disculpa como haría la suma entonces? Porque deseo una totalización de todos los registros con ese ID y existen muchos.


Pedro me recomienda:
yo usaria sum en cada tabla y esa suma en 3 variables $a $b $c y la suma de esas variables las mortraria como total

Entonces, tendría que realizar la suma de cada tabla por su id, el problema sería para pasarla a variable.
Muchas Gracias Leo.

123
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
sin imagen de perfil

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 03/07/2018 23:15:08
Lo cual ahi lo que quiero sumar sería (manobra, columna: resultado) + (materiales, columna: resultado) + (maquinaria, columna:precio) y solo se sumen los registros con el mismo ID (manobra, columna: idmanobra - materiales, columna: idmaterial - maquinaria, columna: idmaquinaria)
a950fd71787f49c3d8ad689434f8f934o
Espero haber detallado lo necesario.
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Suma de columnas en diferentes tablas

Publicado por leonardo_josue (1173 intervenciones) el 03/07/2018 23:51:07
Hola de nuevo Phpnewbie:

Veamos si esto te sirve, voy a utilizar el mismo ejemplo que puse arriba, con dos tablas:

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 tabla1;
+----+-------------+-----------+
| id | descripcion | resultado |
+----+-------------+-----------+
|  1 | uno         |        10 |
|  2 | dos         |        20 |
|  3 | tres        |        30 |
|  3 | three       |        31 |
+----+-------------+-----------+
4 rows in set (0.01 sec)
 
mysql> SELECT * FROM tabla2;
+----+-------------+-----------+
| id | descripcion | resultado |
+----+-------------+-----------+
|  1 | otro uno    |        10 |
|  2 | otro dos    |        20 |
|  2 | otro two    |        21 |
|  3 | otro tres   |        30 |
|  3 | otro three  |        31 |
+----+-------------+-----------+
5 rows in set (0.00 sec)

Supongamos entonces que quiero sumar todos los registros con el mismo ID

1
2
3
id=1 -> 10+10
id=2 -> 20+20+21
id=3 -> 30+31+30+31

entonces puedes hacerlo de dos formas:

1. CONSOLIDAR SUMAS: esto quiere decir que primero AGRUPAS cada tabla por separado de tal suerte que te quede sólo un registro y entonces haces la consulta como la que planteas funciona, es decir, algo así:

Primero AGRUPAS POR ID cada tabla:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT id, sum(resultado) from tabla1 group by id;
+----+----------------+
| id | sum(resultado) |
+----+----------------+
|  1 |             10 |
|  2 |             20 |
|  3 |             61 |
+----+----------------+
3 rows in set (0.02 sec)
mysql> SELECT id, sum(resultado) from tabla2 group by id;
+----+----------------+
| id | sum(resultado) |
+----+----------------+
|  1 |             10 |
|  2 |             41 |
|  3 |             61 |
+----+----------------+
3 rows in set (0.01 sec)

y utilizas esto como dos subconsultas para obtener el resultado esperado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT T1.id, T1.resultado + T2.resultado total
    -> FROM
    -> (SELECT id, SUM(resultado) resultado FROM tabla1 GROUP BY id) T1
    -> INNER JOIN
    -> (SELECT id, SUM(resultado) resultado FROM tabla2 GROUP BY id) T2
    -> ON T1.id = T2.id;
+----+-------+
| id | total |
+----+-------+
|  1 |    20 |
|  2 |    61 |
|  3 |   122 |
+----+-------+
3 rows in set (0.00 sec)

2. UNIR LAS TABLAS y AGRUPAR: es decir, formas una sola tabla con todos los registros que quieres sumar y al final agrupas:

PRIMERO UNES LAS TABLAS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT id, resultado FROM tabla1
    -> UNION ALL
    -> SELECT id, resultado FROM tabla2;
+----+-----------+
| id | resultado |
+----+-----------+
|  1 |        10 |
|  2 |        20 |
|  3 |        30 |
|  3 |        31 |
|  1 |        10 |
|  2 |        20 |
|  2 |        21 |
|  3 |        30 |
|  3 |        31 |
+----+-----------+
9 rows in set (0.00 sec)

y después utilizas esto como una subconsulta para AGRUPAR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT id, sum(resultado) total
    -> FROM
    -> (
    ->   SELECT id, resultado FROM tabla1
    ->   UNION ALL
    ->   SELECT id, resultado FROM tabla2
    -> ) T
    -> GROUP BY id;
+----+-------+
| id | total |
+----+-------+
|  1 |    20 |
|  2 |    61 |
|  3 |   122 |
+----+-------+
3 rows in set (0.00 sec)

En ambos casos llegas al mismo resultado.

Haz la prueba para ver si alguna de las dos formas te sirve.

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

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 04/07/2018 14:30:55
Acabo de crear la consulta:
1
SELECT idmanobra, round(sum(resultado),2) total FROM (SELECT idmanobra, resultado FROM manobra UNION ALL SELECT idmaterial, resultado FROM materiales UNION ALL SELECT idmaquinaria, resultado FROM maquinaria) manobra where idmanobra = 'ID PREFERIDO'

Me ha salido bien:
id1
id2

El nombre de la columna 'precio' de maquinaria, no tuve problema en cambiarlo a 'resultado', lo que fue útil para que se sumara los datos de esa misma tabla también.
A la consulta le agrego antes del SUM, ROUND y solucionado está. Suma y redondeo. :)

Muchas gracias profesor Leo.
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

Suma de columnas en diferentes tablas

Publicado por pedro (1 intervención) el 30/06/2018 13:16:02
yo usaria sum en cada tabla y esa suma en 3 variables $a $b $c y la suma de esas variables las mortraria como total
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Suma de columnas en diferentes tablas

Publicado por Phpnewbie (8 intervenciones) el 30/06/2018 13:30:07
Lo capto, un ejemplo me vendría bien, ya que estoy aprendiendo. Gracias por ayudarme.
La suma de esa forma me sería sencillo. Buena idea, pero: ¿Como se haría eso? De la BD a una variable.
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