Sql 从两个表中获取几列的总和
我想从两个不同的表(这些表共享相同的结构)中获得几列的总和Sql 从两个表中获取几列的总和,sql,oracle,group-by,sum,Sql,Oracle,Group By,Sum,我想从两个不同的表(这些表共享相同的结构)中获得几列的总和 如果我只考虑一个表,我会写这样的查询: SELECT MONTH_REF, SUM(amount1), SUM(amount2) FROM T_FOO WHERE seller = XXX GROUP BY MONTH_REF; 但是,我还希望使用表T_栏中的数据,然后使用select查询返回以下列: 月份参考 总和(T_FOO.amount1)+总和(T_BAR.amount1) 总和(T_FOO.amou
如果我只考虑一个表,我会写这样的查询:
SELECT MONTH_REF, SUM(amount1), SUM(amount2)
FROM T_FOO
WHERE seller = XXX
GROUP BY MONTH_REF;
但是,我还希望使用表T_栏中的数据,然后使用select
查询返回以下列:
- 月份参考
- 总和(T_FOO.amount1)+总和(T_BAR.amount1)
- 总和(T_FOO.amount2)+总和(T_BAR.amount2)
MONTH\u REF
的值分组
请注意,可以在一个表中找到给定月份的记录,但不能在另一个表中找到。
在这种情况下,我想得到T\u FOO.amount1+0
(或0+T\u BAR.amount1
)的总和
如何编写SQL查询以获取此信息
有关信息,我的数据库是Oracle 10g。您尝试过使用union吗
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
或者,外部连接也应起作用:
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
最后,我使用的是用户的答案
以下是正确的代码(amount1=…
在我的环境中不起作用,并且查询中的;
太多):
您可以在分组之前合并表(顺便说一句,这是在Oracle上):
您还可以将表与卖方字段合并,并在以后按其进行筛选(如果您需要更高级的逻辑):
这个查询花费了太多的时间(尤其是与Lieven的答案相比),此外,它还返回错误的结果。它还需要NVL(SUM(…),0),否则我将得到空值…最后我更喜欢您的解决方案(第一个)因为它比Lieven解决方案更清楚……第一个解决方案更有效,因为您比将WHERE
子句移到子SELECT
之外时更快地减少了行数。谢谢,我使用了第二个。@romaintaz:没问题。有一个问题,你有介绍过不同的解决方案吗?我假设在大型数据集上,按联合分组比按解决方案按联合分组更快。请对您的解决方案添加一些注释,说明其解决问题的原因和方式
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
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
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts