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

operaciones con SUM() de dos tablas (solucionado)

Estas en el tema de operaciones con SUM() de dos tablas (solucionado) en el foro de Mysql en Foros del Web. Mi problema lo redusco a lo siguiente. Una consulta donde salgan las sumas totales de un campo de una tabla "uno" agrupado por nombre, y ...
  #1 (permalink)  
Antiguo 25/02/2010, 22:48
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 8 meses
Puntos: 1
Busqueda operaciones con SUM() de dos tablas (solucionado)

Mi problema lo redusco a lo siguiente. Una consulta donde salgan las sumas totales de un campo de una tabla "uno" agrupado por nombre, y que muestre tambien la sumas totales de otro campo "dos" agrupadas por un campo nombre.
ejemplo:

select nombre_dos, sum(cantidad_dos) from dos group by nombre_dos;
+----------------+------------------------+
| nombre_dos | sum(cantidad_dos) |
+----------------+------------------------+
| gel | 7 |
| jabon | 9 |
+----------------+------------------------+

select nombre_uno, sum(cantidad_uno) from uno group by nombre_uno;
+--------------------+------------------------+
| nombre_uno | sum(cantidad_uno) |
+--------------------+------------------------+
| gel | 3 |
| jabon | 3 |
+---------------------+-----------------------+



Aca es donde no funciona la idea:


select nombre_uno, sum(cantidad_dos), sum(cantidad_uno) from uno, dos where dos.nombre_dos like uno.nombre_uno group by nombre_uno;
+---------------+-------------------------+------------------------+
| nombre_uno | sum(cantidad_dos) | sum(cantidad_uno) |
+---------------+-------------------------+------------------------+
| gel | 14 | 6 |
| jabon | 9 | 6 |
+---------------+-------------------------+-------------------------+


alguna idea???

De antemano, gracias por sus sugerencias

Última edición por drnocho; 26/02/2010 a las 11:14
  #2 (permalink)  
Antiguo 25/02/2010, 22: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: operaciones con SUM() de dos tablas

Si vas a hacer sumas que requieran precisión, LIKE no lo veo como una opción válida, ya que es una clausula que busca aproximación.
Eso significa que si más de un A puede ser "como" B, se sumará una unidad a cada uno de ellos, lo que resultaría en sumas poco razonables en algunos casos.
¿Se entiende?

Es el problema de que una consulta no sólo debe dar un resultado, sino que el resultado debe tener cierta coherencia. No es lo mismo sumar gatos que sumar félidos... en el segundo caso tengo que contar leones y panteras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/02/2010, 10:01
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: operaciones con SUM() de dos tablas

Agradezco tu interés, pero lo he intentado haciendo lo mas simple posible y aun así no corre como quisiera, observa:

SELECT nombre_uno, sum(dos.cantidad_dos), sum(uno.cantidad_uno)
FROM uno, dos
WHERE nombre_uno = "gel" AND nombre_dos ="gel";

+---------------+------------------------+-------------------------+
| nombre_uno | sum(cantidad_dos) | sum(cantidad_uno) |
+---------------+------------------------+-------------------------+
| gel | 14 | 6 |
+---------------+------------------------+-------------------------+

únicamente los reportes de la suma de esos 2 campos en distintas tablas y aun asi pasa algo al poner sum al involucrar las dostablas "uno" y "dos". Por algún motivo me pone el doble de lo que es.
  #4 (permalink)  
Antiguo 26/02/2010, 10:15
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: operaciones con SUM() de dos tablas

Volvamos al principio:
Cita:
Mi problema lo redusco a lo siguiente. Una consulta donde salgan las sumas totales de un campo de una tabla "uno" agrupado por nombre, y que muestre tambien la sumas totales de otro campo "dos" agrupadas por un campo nombre.
El tema es que para hacer algo como esto debes usar un LEFT JOIN o RIGHT JOIN, según sea necesario, y no un JOIN (o la coma, que es lo mismo).
La cosa parte proque un JOIN devolverá registros comunes en los valores de los campos. Si hay más de un campo con el mismo nombre en las dos tablas, se los relacionara a todos. JOIN no hace muchas distinciones bien en ese caso y puede dar resultados irreales. Mi recomendación sería usar INNER JOIN o LEFT JOIN.
Pero hay un problema: INNER JOIN devolverá sólo los campos de las tablas que tengan el mismo valor en los campos puestos en el ON, con lo que si la primera tabla tiene algunos que no aparecen en la segunda, esos registros no se sumarán en ningun caso (ni para una ni para otra). Entonces habría que optar por LEFT JOIN o RIGHT JOIN. Pero aquí se repite el problema: si la primera de las tablas tiene menos que la otra, los registros de la otra no saldrán...
Hay dos opciones:
O hacer una consulta con dos UNION donde primero se consideren los que están en ambos, luego los que están en la primera solamente y después los que están en la segunda únicamente (muy complicado), o bien usar tres tablas (más simple): Una donde estén todos los nombres posibles, y las otras dos para hacer las sumas.

Obviamente esa solución solo tiene sentido si existe la posibilidad de que las tablas no coincidan en la cantidad de nombres distinguibles, si esto no se da, yo lo solucionaría por medio de suconsultas para cada tabla en el FROM:
Código MySQL:
Ver original
  1. SELECT nombre, suma1, suma2
  2.     (SELECT nombre SUM(campo) FROM tabla1 GROUP BY nombre) T1 INNER JOIN
  3.     (SELECT nombre SUM(campo) FROM tabla2 GROUP BY nombre)  T2 ON T1.nombre = T2.nombre
  4. GROUP BY nombre;
__________________
¿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/02/2010, 11:13
 
Fecha de Ingreso: febrero-2010
Mensajes: 5
Antigüedad: 14 años, 8 meses
Puntos: 1
De acuerdo Respuesta: operaciones con SUM() de dos tablas

Efectivamente, muchas gracias por tu orientacion. Al final corrio con la sugerencia que me haz dado.

Código MySQL:
Ver original
  1. SELECT nombre_uno, suma1, suma2
  2.     (SELECT nombre_uno, SUM(cantidad_uno) as suma1 FROM uno GROUP BY nombre_uno)
  3.         T1 INNER JOIN
  4.     (SELECT nombre_dos, SUM(cantidad_dos) as suma2 FROM dos GROUP BY nombre_dos)
  5.         T2 ON T1.nombre_uno = T2.nombre_dos
  6. GROUP BY nombre_uno;

Muchas gracias
  #6 (permalink)  
Antiguo 13/12/2011, 21:42
 
Fecha de Ingreso: agosto-2008
Ubicación: Canarias, España - París, Francia
Mensajes: 105
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: operaciones con SUM() de dos tablas (solucionado)

Hola a todos, me ha servido de mucho este post y en vista de ello me he puesto a hacer un programa de prueba para controlar compras y ventas de una hipotética tienda de coches, pero me he dado cuenta de que si no hay coincidencia en las fechas pues no los saca, claro como indica el igual. Pero como podría hacerlo para que saque todos los valores de compras y de ventas, agrupados y sumados.

Ahora tengo este codigo y digamos que los meses que no hay ventas aunque haya compras pues no los muestra y viceversa. Me gustaría que sacara todos los meses existentes, y cuando no hay ventas pues que ponga un 0 o NULL pero que saque las compras... uff es dificil explicar esto.

Por ejemplo: (agrupados por mes)

Código SQL:
Ver original
  1. Fecha             Compras                    Ventas
  2. Enero              10                                 3
  3. Febrero            2                                  1
  4. Marzo               0                                  4
  5. Abril                  0                                  3
  6. Mayo                 3                                  0
  7. Junio                 2                                  0

El código que estoy utilizando está basado en el ejemplo que ustedes pusieron, drnocho como gnzsoloyo (muchas gracias :) y es el siguiente


Código MySQL:
Ver original
  1. select Fecha, Compras, Ventas
  2. (select date_format(fechaalta,'%m-%Y') as fecha, SUM(pvp) as ventas FROM facturas GROUP BY fecha) T1
  3. (select date_format(fechacompra, '%m-%Y' ) as fecha_compra, SUM(gtotal) as compras FROM vehiculos GROUP BY fecha_compra) T2
  4. ON T2.fecha_compra =T1.fecha

Muchas gracias a quien me pueda echar una mano y a todos los del foro y al Mundo entero, ¿por qué no?

Etiquetas: dos, operaciones, solucionado, sum, 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 07:13.