我正在使用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的余额。
答案 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