【问题标题】:Getting the sum of several columns from two tables从两个表中获取几列的总和
【发布时间】:2010-11-26 04:05:09
【问题描述】:

我想从 2 个不同的表中获取几列的总和(这些表共享相同的结构)。

如果我只考虑一张表,我会写这样的查询:

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。

【问题讨论】:

    标签: sql oracle group-by sum


    【解决方案1】:

    您可以在 group by 之前合并您的表(顺便说一下,这是在 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
    

    【讨论】:

    • 最后我更喜欢你的解决方案(第一个),因为它比 Lieven 解决方案更清晰......
    • 第一个效率更高,因为与将 WHERE 子句移到子 SELECT 之外时相比,您可以更快地减少行数。
    • 谢谢我用了第二个。
    【解决方案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
    

    【讨论】:

    • @romaintaz:没问题。一个问题,您是否描述了不同的解决方案?我假设 grouping by - union - grouping by 在大型数据集上会比 union - grouping by 解决方案更快。
    【解决方案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
    

    【讨论】:

    • 这个查询花费了太多时间(特别是与 Lieven 的答案相比),此外它返回错误的结果。它还需要 NVL(SUM(...), 0) 否则我会得到空值...
    【解决方案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
      

      【讨论】:

      • 请添加一些关于您的解决方案的 cmet,说明它为什么以及如何解决问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多