2011-09-15 18 views
6

En MySQL tengo dos tablas:¿Cómo puedo sumar columnas en múltiples tablas en MySQL?

Table MC: 
---------------- 
|TransNo | Qty | 
|--------|-----| 
| xxx1 | 4 | 
| xxx3 | 3 | 

y

Table Amex: 
---------------- 
|TransNo | Qty | 
|---------|-----| 
| xxx1 | 2 | 
| xxx5 | 1 | 

necesito para resumir la columna de la Qty de la mesa MC (eq. 7) y la tabla Amex y tienen resultado (eq 3). como Total Qty.

Cuando hago

SELECT (SUM(amex.Qty) + SUM(mc.Qty)) as total_qty from amex, mc 

me sale el producto cartesiano (20), pero la respuesta correcta que necesito es 10. ¿Qué necesito para cambiar esta consulta para obtener el resultado correcto?

Respuesta

11
SELECT SUM(t.Qty) AS total_qty 
    FROM (SELECT Qty FROM MC 
      UNION ALL 
      SELECT Qty FROM Amex) t 
+0

Si lo que quería hacer un grupo por sobre una de las columnas que es común para ambas tablas, ¿cómo hago eso? – Siva

0
SELECT SUM(Qty) AS total_qty FROM (SELECT Qty FROM amex UNION SELECT Qty FROM mc); 
+2

Tendría que usar un 'UNION ALL' aquí ya que 'UNION' eliminaría los valores duplicados. –

2

Si desea evitar el uso de Unión o Unión ALL (probablemente por razones de eficiencia), luego los siguientes trabajos:

SELECT (1.Qty+2.Qty) AS total_qty FROM (SELECT SUM(Qty) Qty FROM MC) 1, 
(SELECT SUM(Qty) Qty FROM Amex) 2; 

He aquí un ejemplo de si desea ampliar esto para incluir un grupo por condición. Digamos que tenemos un Cust_ID en MC y Amex para identificar al cliente que realizó cada pedido, y queremos saber las sumas de cada cliente. El código sería el siguiente aspecto:

SELECT COALESCE(1.Cust_ID, 2.Cust_ID) Cust_ID, (1.Qty+2.Qty) AS total_qty 
FROM (SELECT Cust_ID, SUM(Qty) Qty FROM MC GROUP BY Cust_ID) 1 
FULL OUTER JOIN (SELECT Cust_ID, SUM(Qty) Qty FROM Amex GROUP BY Cust_ID) 2 ON 1.Cust_ID = 2.Cust_ID; 

Si una tabla de clientes existe en la base de datos, entonces esto se puede simplificar a:

SELECT c.Cust_ID, (1.Qty+2.Qty) AS total_qty FROM Customer c 
LEFT JOIN (SELECT Cust_ID, SUM(Qty) Qty FROM MC GROUP BY Cust_ID) 1 ON 1.Cust_ID = c.Cust_ID 
LEFT JOIN (SELECT Cust_ID, SUM(Qty) Qty FROM Amex GROUP BY Cust_ID) 2 ON 2.Cust_ID = c.Cust_ID; 
Cuestiones relacionadas