Получение суммы нескольких столбцов из двух таблиц
Я хочу получить сумму из нескольких столбцов из двух разных таблиц (эти таблицы имеют одинаковую структуру).
Если я рассматриваю только одну таблицу, я бы написал такой запрос:
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