编写此sql的更简洁的方法

编写此sql的更简洁的方法,sql,sql-server,Sql,Sql Server,有时在编写sql时,我会遇到以下情况: select A = ( select sum(A) --... big query using abc ), select B = ( select sum(B) --... same big query using abc ) from abc 也许看起来不太好,但在某些情况下,这是我唯一

有时在编写sql时,我会遇到以下情况:

select A = (
               select sum(A)
               --... big query using abc
           ),
select B = (
               select sum(B)
               --... same big query using abc
           )
from abc
也许看起来不太好,但在某些情况下,这是我唯一能想到的方法。所以问题是:
大查询
是重复的,也许有更干净的方法来写同样的东西


澄清:
abc
是一组连接<代码>使用abc表示使用当前abc行的数据<代码>大查询与abc不同

如果所有子选择中的“大查询”都相同,您不能只执行以下操作:

select sum(a), sum(b)
from abc
where ...big query

如果没有一组合适的示例数据和相应的查询,这将非常有用。

您的查询可以简化为

SELECT sum(a) as A, sum(b) as B
FROM abc

尽管我怀疑你过于简化了你的情况

外部应用将有助于:

   select *
   from abc
    outer apply (
      select sum(a) as sumA, sum(b) as sumB
      -- big query using abc
   ) sums

在看不到实际的查询和您试图实现的目标的情况下,很难说该做什么。有一些方法可能有用。
1.使用CTE或派生表进行大查询

2.在某些情况下,它可以替换为若干个
SUM(当[condition]然后字段结束时)

如果a和B是字段,您可以将两个
SUM
都放在查询中:

select sum(a), sum(b) from abc
如果要根据不同的条件聚合相同的行,通常可以使用
case
。假设您有一个带有字段
STATUS
efforce
的表
TASKS
,您希望同时计算
主动任务和
被动任务,并获得每个聚合的总努力。你可以做:

select
count(case when status = 'ACTIVE' then 1 end) active_nr,
sum(case when status = 'ACTIVE' then effort else 0 end) active_effort,
count(case when status = 'PASSIVE' then 1 end) passive_nr,
sum(case when status = 'PASSIVE' then effort else 0 end) passive_effort
from tasks;
这是一个简单的示例,
case
测试的谓词可以根据需要复杂,涉及多个字段等。另外,这种方法通常对数据库更好

select sum(A),sum(B)
--... big query using abc
from abc

无需将其拆分。

您想实现什么?但a列和b列不能位于group by子句中:P@aF:我完全同意你的意见,但他没有说有分组条款;)如果没有,那么它完全有效。。