对使用UNION ALL连接的两个查询使用sum

时间:2017-10-25 19:48:10

标签: sql-server union

我正在使用Microsoft SQL Server 2014.我有两个使用Union加入的查询。每个查询都给了我一个总数,但我需要能够得到这两个查询的总数。因此,请获取这两个查询中给出的值并将它们一起添加到我的最终编号中。这两个查询是:

select sum(acct.balance) as 'Balance'
from acct
where 
acct.status <> 'closed' 

Union all

select sum(term.balance) as 'Balance'
from term
where 
term.status = 'active'

我已尝试在此处发布的其他建议,但没有一项有效。我的查询应该向我显示Acct.balance + term.balance的余额。

3 个答案:

答案 0 :(得分:3)

在这种情况下,您的问题很容易,因为您只有两个值,所以您甚至可以直接添加它们,而不是将它们合并。我只举这个例子来完成和理论。

select (select sum(acct.balance) from acct where  acct.status <> 'closed' ) + (select sum(term.balance) from term where term.status = 'active') as Balance

我提到这一点,因为似乎所有联盟都让你陷入困境。是的,您可以将它放在子查询或CTE中,但在这种情况下,您甚至没有一个集合,只有两个值,因为您没有按任何分组。

其他示例显示了CTE和子查询,这是您可以继续和构建现有查询的方式。 (另一种选择可能是创建一个视图,如果它会被重复使用,但同样,这对你的例子来说太过分了。)

何时使用?

当我要不止一次加入某些内容时,我更喜欢 CTE 。例如,如果我找到并排名某些内容,然后加入 之前的项目到下一个项目。 CTE的其他技巧也超越了递归等领域。 (http://www.databasejournal.com/features/mssql/article.php/3910386/Tips-for-Using-Common-Table-Expressions.htm

如果我只是想要构建一个查询,那么只要代码非常简短直接,我通常会将其设为子查询。

关于CTE或子查询的一个好处是你可以选择那个内部代码,并在你试图理解为什么看到实际结果时运行它。

所有这一切,我一般不喜欢看到具有选择区域的子查询,所以我实际上如何写这个将更接近:

select sum(SubTotals.Balance) as Balance
from
(
    select sum(acct.balance) as Balance
    from acct
    where acct.status <> 'closed' 

    Union all

    select sum(term.balance) as Balance
    from term
    where term.status = 'active'

) SubTotals

我给出了有意义的名字好的评论。

答案 1 :(得分:0)

您可以使用CTE执行此操作

;with mycte as (
select 
sum(acct.balance) as 'Balance' 
from acct 
where acct.status <> 'closed'

Union all

select sum(term.balance) as 'Balance'
from term
where 
term.status = 'active'
)

Select 
sum(Balance) as total_balance
 from mycte

答案 2 :(得分:0)

select sum(t.balance) from 
(select balance
from acct
where 
acct.status <> 'closed' 

Union all

select balance
from term
where 
term.status = 'active') t