更清洁的方式来编写这个sql

时间:2011-12-07 17:17:52

标签: 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

也许它看起来不太好,但这是我在某些情况下能想到的唯一方法。所以问题是:big query重复,也许有一种更简洁的方式来编写同样的东西?

澄清: abc是一堆联接。 using abc表示使用当前abc行的数据。 big queryabc不同。

6 个答案:

答案 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。想象一下,您有一个包含字段TASKSSTATUS的表EFFORT,并且您想要计算ACTIVEPASSIVE个任务,并获得每个骨料。你可以这样做:

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

无需拆分。