【问题标题】:sql - getting sum of same column from multiple tablessql - 从多个表中获取同一列的总和
【发布时间】:2018-12-10 17:43:37
【问题描述】:

我的数据库中有几张表。我们称它们为 table1、table2、table3。 它们都有一个名为value 的列。 我需要创建一个返回单个数字的查询,其中该数字是所有表中所有value 列的总和... 我尝试了以下方法:

SELECT (SELECT SUM(value) FROM table1) + (SELECT SUM(value) FROM table2) + (SELECT SUM(value) FROM table3) as total_sum

但是当至少一个内部SUMNULL 时,整个总值(这里是total_sum)是NULL,所以这不是很值得信赖。 当某个内部SUM查询中没有值时,我需要它返回0,所以它不会影响SUM的其余部分。

为了更清楚,假设我有以下 2 个表:

表 1:

  ID  |  NAME  |  VALUE
   1    Name1     1000
   2    Name2     2000
   3    Name3     3000

表 2:

  ID  |  NAME  |  VALUE
   1    Name1     1500
   2    Name2     2500
   3    Name3     3500

最终,我需要的查询将返回一个值 - 13500,这是此处所有表的VALUE 列下所有值的总和。

所有其他列对于所需的查询没有意义,在这种情况下我什至不太关心性能。

【问题讨论】:

  • 我可能只是使用union all 将所有这些值粘在一起,然后同时对所有值求和。

标签: sql sql-server select sum


【解决方案1】:

您可以使用 ISNULL 函数来处理 NULL。

SELECT ISNULL((
                  SELECT SUM(value) FROM table1
              )
            , 0
             ) + ISNULL((
                            SELECT SUM(value) FROM table2
                        )
                      , 0
                       ) + ISNULL((
                                      SELECT SUM(value) FROM table3
                                  )
                                , 0
                                 ) AS total_sum;

【讨论】:

    【解决方案2】:

    您可以使用Coalesce 来实现它,如下所示

    SELECT 
        (SELECT coalesce(SUM(value),0) FROM table1) + 
        (SELECT coalesce(SUM(value),0) FROM table2) + 
        (SELECT coalesce(SUM(value),0) FROM table3) as total_sum
    

    另一种方法是使用union all 将所有值合并到单个表中

    select distinct coalesce(sum(a.value), 0) as total_sum from
        (select value from table1
          union all
        select value from table 2
          union all
        select value from table 3) a;
    

    【讨论】:

    • 此处选择的答案仅与此答案的第一部分有关,因为此解决方案仅返回 1 个包含 1 个字段的记录,并根据需要保存总和。使用联合的解决方案返回一个包含多条记录的记录集(每个选定的表一个,这不是我在这里需要的)。谢谢!
    【解决方案3】:

    你可以简单地总结所有这些:

    select sum(total) as Total
    from (
    select sum(value) as total from Table1
    union all
    select sum(value) as total from Table2
    union all
    select sum(value) as total from Table3 
    ) t;
    

    【讨论】:

    • 如果我使用 union all,我会得到一个包含多条记录的记录集(每个选定表一个),并且我想要一个仅包含 1 条记录的记录集...
    • @TheCuBeMan,我提供的代码只返回一条记录。你可以试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2020-10-02
    相关资源
    最近更新 更多