Получение суммы нескольких столбцов из двух таблиц

Я хочу получить сумму из нескольких столбцов из двух разных таблиц (эти таблицы имеют одинаковую структуру).

Если я рассматриваю только одну таблицу, я бы написал такой запрос:

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

Однако я хотел бы также работать с данными из таблицы T_BAR, а затем иметь запрос select, который возвращает следующие столбцы:

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

все сгруппировано по значению MONTH_REF.

Обратите внимание, что запись для данного MONTH_REF может быть найдена в одной таблице, но не в другой таблице. В этом случае я хотел бы получить сумму T_FOO.amount1 + 0 (или 0 + T_BAR.amount1).

Как я могу написать свой SQL-запрос, чтобы получить эту информацию?

Для информации моя база данных - это Oracle 10g.

Ответ 1

Вы можете объединить свои таблицы перед группой (это, кстати, на Oracle):

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

Вы также можете объединять таблицы с полем продавца и фильтровать их позже (если вам нужна более сложная логика):

 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

Ответ 2

Вы пытались использовать союз?

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

Ответ 3

Кроме того, внешнее соединение также должно работать:

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

Ответ 4

Я, наконец, получаю эту работу, используя ответ Lieven.

Вот правильный код (amount1 = ... не работает в моей среде, и в запросе слишком много ;):

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

Ответ 5

SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts