有时当我写sql时遇到以下情况:
select A = (
select sum(A)
--... big query using abc
),
select B = (
select sum(B)
--... same big query using abc
)
from abc
也许它看起来不太好,但这是我在某些情况下能想到的唯一方法。所以问题是:big query
重复,也许有一种更简洁的方式来编写同样的东西?
澄清: abc
是一堆联接。 using abc
表示使用当前abc行的数据。 big query
与abc
不同。
答案 0 :(得分:2)
外部申请将在这里提供帮助:
select *
from abc
outer apply (
select sum(a) as sumA, sum(b) as sumB
-- big query using abc
) sums
答案 1 :(得分:1)
如果所有子选择中的'大查询'相同,那么你不能这样做:
select sum(a), sum(b)
from abc
where ...big query
如果没有一套不错的示例数据和相应的查询,那就无济于事了。
答案 2 :(得分:0)
您的查询可以简化为
SELECT sum(a) as A, sum(b) as B
FROM abc
虽然我怀疑你已经过度简化了你的情况
答案 3 :(得分:0)
如果没有看到实际查询以及您想要实现的目标,很难说该怎么做。有些方法可能有用。
1.使用CTE或派生表进行大查询
2.在某些情况下,可以用一些SUM(CASE WHEN [condition] THEN field END)
答案 4 :(得分:0)
如果A和B是字段,您可以将sum
放在查询中:
select sum(a), sum(b) from abc
如果您要执行的操作是根据不同的条件聚合相同的行,您通常可以使用case
。想象一下,您有一个包含字段TASKS
和STATUS
的表EFFORT
,并且您想要计算ACTIVE
和PASSIVE
个任务,并获得每个骨料。你可以这样做:
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
测试的谓词可以像你需要的那样复杂,涉及多个字段等。作为奖励,这种方法通常对数据库更好。
答案 5 :(得分:0)
select sum(A),sum(B)
--... big query using abc
from abc
无需拆分。