2013-08-20 141 views
4

我確信這已被多次覆蓋,請原諒我的重複。我有一個可以正常工作的查詢,但在一個選擇中目前有6個CASE語句。有人提到,通過將我所有的WHEN條件放在一個CASE中,將會得到最佳優化。然而,我無法做到這一點單個CASE語句中的多個列

select right(RTRIM(region),5) as cell_id, 
    sum(CASE WHEN LEFT(cparty,3) in ('999','998','997') THEN chargeduration/60 else 0 END) AS OnNet_Minutes, 
    sum(CASE WHEN LEFT(cparty,3) in ('996','995') THEN chargeduration/60 else 0 END) AS OffNet_C_Minutes, 
    sum(CASE WHEN LEFT(cparty,3) in ('994','993','992') THEN chargeduration/60 else 0 END) AS OffNet_A_Minutes, 
    sum(CASE WHEN LEFT(cparty,3) in ('991','990') THEN chargeduration/60 else 0 END) AS OffNet_S_Minutes, 
    sum(CASE WHEN LEFT(cparty,2) = '00' THEN chargeduration/60 else 0 END) AS OffNet_T_Minutes, 
    sum(CASE WHEN len(cparty) < 6 and LEFT(cparty,1) <> 0 THEN chargeduration/60 else 0 END) AS SC_Minutes    
    from August.dbo.cdr20130818 
    where CHARGEDURATION > 0 and ISNULL(region,'''')<>'''' and LEN(region) > 5 
group by right(RTRIM(region),5) 
order by right(RTRIM(region),5) asc 
+0

您是否希望爲輸出中的電荷持續時間計算一個單獨的求和列,還是六個? –

+0

你應該問這個人他們的意思。您的查詢看起來很好。 –

+0

單個'CASE' *表達*意味着你會得到一個單獨的列,對你有用嗎? – Lamak

回答

1

我想你是正確的,六種不同SUM()的每一個都對自己的意義。

如果您的所有條件都在同一個CASE聲明中,那麼您將丟失詳細信息,您將返回當前單獨聲明的SUM()合併爲一個。

結合WHERE子句中的冗餘條件可以清除CASE語句,但在這裏沒有任何完全多餘的內容。

4

在你的情況下,你不能把它們全部放入一個CASE,因爲結果全部進入select的不同列。

順便說一句,你應該刪除你的ISNULL(region, '''') <> ''''條件,因爲它與LEN(region) > 5條件配對時是多餘的。 (當region爲空時,那麼LEN(region)也爲空,並且NULL > 5爲假。)

+2

改變條件,你說的是不一樣的東西。什麼地區真的等於''而不是零...? –

+0

@FabienTheSolution一般來說,我同意你的看法,但注意到後面的'LEN(region)> 5'條件?這會過濾掉你提到的情況。 –

+1

所以可能是'和LEN(ISNULL(region,'''))> 5'而不是'和ISNULL(region,'''')<>''''和LEN(region)> 5' :) –