2011-12-07 119 views
1

有時當我寫SQL我遇到以下情況:更清潔的方式來寫這個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不一樣。

+1

你想達到什麼目的? – Curt

回答

2

外應用將有助於在這裏:​​

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

如果「大查詢」是在所有的子查詢一樣,你不能只是做:

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

沒有像樣的一套示例數據和corresponsing查詢不能提供更多的幫助..

+0

但a和b列不能在group by子句中:P –

+1

@aF:我完全同意你的看法,但他沒有說過有一個group by子句;)如果沒有,那麼它的完美有效.. – StevieG

+0

是的,你說得對:P –

0

查詢可以簡化爲

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

雖然我懷疑你已經過於簡單化的情況

0

很難說什麼,沒有看到實際的查詢和你想達到什麼樣的事情。有一些可能有用的方法。
1.使用CTE或你的大查詢
2.在某些情況下,它可以與許多SUM(CASE WHEN [condition] THEN field END)

0

被替換如果A和B是字段,你可以把兩者sum S IN查詢派生表:

select sum(a), sum(b) from abc 

如果你想要做的是聚集取決於不同的條件相同的行,你可以經常使用case。想象一下,您有一個表TASKS,其字段爲STATUSEFFORT,並且您想要統計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測試謂詞可以根據您的需要,涉及多個領域等作爲獎勵複雜,這種做法通常會是更好的數據庫。

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

無需將其分開。

相關問題