编写此sql的更简洁的方法
有时在编写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 也许看起来不太好,但在某些情况下,这是我唯一
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:我完全同意你的意见,但他没有说有分组条款;)如果没有,那么它完全有效。。