Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从两个表中获取几列的总和_Sql_Oracle_Group By_Sum - Fatal编程技术网

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