2013-07-11 67 views
1

我有一組數據,看起來像下面T-SQL遞歸

Name Time Perc Group Mode Control Cancelled 
A  10:52 10.10 10  0  1   0 
B  09:00 10.23 10  1  1   1 
C  12:02 12.01 12  0  1   1 
D  10:45 12.12 12  1  7   1 
E  12:54 12.56 12  1  3   0 
F  01:01 13.90 13  0  11  1 
G  02:45 13.23 13  1  12  1 
H  09:10 13.21 13  1  1   0 

我需要象下面的輸出;

Group Perc Cancelled 
10 20.33  1 
12 36.69  2 
13 40.34  2 

我得到的是類似的東西;

Group Perc Cancelled 
10 20.33  5 
12 36.69  5 
13 40.34  5 

我不知道什麼叫這個,我在我的腦海東西,這樣稱呼它CTE?,但我真的無法弄清楚。

這是我的資料來源;

SELECT Group, SUM(Perc), Cancelled FROM 
(SELECT Group, Perc, (SELECT COUNT(*) FROM tblName WHERE Cancelled=1) AS Cancelled FROM tblName WHERE 1=1 AND Group>=10)dt 
GROUP BY Group, Cancelled 
+2

您是否在實際代碼中使用關鍵字作爲列名稱?我看到「SELECT Group」並且感到困惑。 「GROUP BY Group」令人眼花繚亂。 – Zec

+0

剛纔,我做的是我創建了一個#temp表,然後選擇所有的數據,然後左加入#temp表..它確實解決了這個問題,但我覺得它有點蹩腳.. –

回答

3

從你的榜樣,你不需要嵌套查詢,任何遞歸,等等...

SELECT 
    Group, 
    SUM(Perc)  AS total_perc, 
    SUM(cancelled) AS total_cancelled 
FROM 
    tblName 
WHERE 
    1=1 
    AND Group >= 10 
GROUP BY 
    Group 

如果你確實有一些不同的數據,那麼你可能想使用類似...

SUM(CASE WHEN cancelled > 0 THEN 1 ELSE 0 END) AS total_cancelled 
+0

什麼是在那裏有'1 = 1'的目的? –

+0

@goatco - 從OPs代碼複製。猜測這是爲了更容易地構建動態where子句。 – MatBailie

+0

我的例子是怪,誰讓它是沒有其他的我,我忘了在示例中顯示,我可以取消之前我需要驗證的模式和控制,如模式= 1和控制= 1,那麼它被取消了..所以你能告訴我怎麼樣? –