2009-09-07 24 views
11

Quiero obtener la suma de varias columnas de 2 tablas diferentes (estas tablas comparten la misma estructura).Obteniendo la suma de varias columnas de dos tablas

Si sólo considero una mesa, me gustaría escribir este tipo de consulta:

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
    FROM T_FOO 
    WHERE seller = XXX 
    GROUP BY MONTH_REF; 

Sin embargo, me gustaría trabajar también con los datos de la T_BAR mesa, y luego tener una consulta select que devuelven las siguientes columnas:

  • MONTH_REF
  • SUM (T_FOO.amount1) + SUM (T_BAR.amount1)
  • SUM (T_FOO.amount2) + SUM (T_BAR.amount2)

todo agrupado por el valor de MONTH_REF.

Tenga en cuenta que un registro para un dado MONTH_REF se puede encontrar en una tabla pero no en la otra tabla. En este caso, me gustaría obtener la suma de T_FOO.amount1 + 0 (o 0 + T_BAR.amount1).

¿Cómo puedo escribir mi consulta SQL para obtener esta información?

Para obtener información, mi base de datos es Oracle 10g.

Respuesta

12

Puede unión de las tablas antes del grupo de (esto es en Oracle , por cierto):

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2 
      FROM T_FOO 
     WHERE seller = XXX 
     UNION ALL 
     SELECT month_ref, amount1, amount2 
      FROM T_BAR 
     WHERE seller = XXX 
     ) t 
GROUP BY t.month_ref 

es posible que al mismo tiempo unión de las tablas con el campo vendedor y filtrar por ello más tarde (en caso de que necesite una lógica más avanzada):

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2, seller 
      FROM T_FOO 
      UNION ALL 
     SELECT month_ref, amount1, amount2, seller 
      FROM T_BAR) t 
    where t.seller = XXX 
    GROUP BY t.month_ref 
+0

Finalmente prefiero su solución (la primera) ya que es más clara que la solución de Lieven ... – romaintaz

+0

La primera es más eficiente porque está reduciendo el número de filas antes que cuando mueve la cláusula 'WHERE' fuera del sub' SELECT'. – JohnB

+0

Gracias he usado el segundo. –

2

¿Has probado a utilizar una unión?

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) AS amount1, SUM(amount2) as amount2 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
+0

@romaintaz: no hay problema. Una pregunta, ¿ha perfilado las diferentes soluciones? Supongo que * agrupando por - unión - agrupando por * será más rápido en grandes conjuntos de datos que solo * unión - agrupando por * solución. –

1

Alternativamente, una combinación externa también debería funcionar:

SELECT month_ref, 
     SUM(t_foo.amount1) + SUM(t_bar.amount1), 
     SUM(t_foo.amount2)+SUM(t_bar.amount2) 
FROM t_foo FULL OUTER JOIN t_bar 
     ON t_foo.month_ref = t_bar.month_ref 
GROUP BY month_ref 
+0

Esta consulta lleva demasiado tiempo (especialmente en comparación con la respuesta de Lieven), y además devuelve resultados incorrectos. También necesita NVL (SUM (...), 0) de lo contrario obtendré valores nulos ... – romaintaz

1

finalmente conseguir este trabajo usando la respuesta Lieven 's.

Aquí es el código correcto (amount1 = ... no está trabajando en mi entorno, y hay demasiados ; en la consulta):

SELECT MONTH_REF, SUM(sumAmount1), SUM(sumAmount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) as sumAmount1, SUM(amount2) as sumAmount1 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
-1
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts 
+0

Agregue algunos comentarios acerca de su solución sobre por qué y cómo resuelve el problema –

+0

Este comando no está completo .... – taboubim

Cuestiones relacionadas