2013-02-06 43 views
0

我不太清楚應該如何描述標題問題,但這裏是我的問題。 我有一個名爲hello的表,其中有兩列,名稱分別爲timestate選擇不同屬性並打印輸出計數,即使計數爲0

Time | State 

下面是數據的一個例子,我有

1 DC 
1 VA 
1 VA 
2 DC 
2 MD 
3 MD 
3 MD 
3 VA 
3 DC 

我想獲得所有可能的時間和「VA」的數(0,如果「VA」沒有出現在時間) 輸出應該是這樣的

Time Number 
1 2 
2 0 
3 1 

我試圖做

SELECT DISTINCT time, 
    COUNT(state) as Number 
     FROM hello 
     WHERE state = 'VA' 
     GROUP BY time 

但它似乎沒有工作。

回答

2

這是一個有條件的聚集:

select time, sum(case when state = 'VA' then 1 else 0 end) as NumVA 
from hello 
group by time 

我想補充一點,你不應該使用distinct當你有一個group by。這兩個是多餘的。在SQL語言中甚至不需要作爲關鍵字的Distinct;在語義上,它只是對所有列進行分組的簡寫。拇指

+0

精彩的一點,謝謝 - 不錯的答案。 – sgeddes

+0

關於'獨特'的偉大觀點,我會牢記這一點。謝謝! – Firyn

2
SELECT TIME, 
     SUM(CASE WHEN State = 'VA' THEN 1 ELSE 0 END) 
FROm tableName 
GROUP BY Time 
+0

非常感謝! – Firyn

+0

不客氣':D'很高興爲您效勞。 –

0

一個規則是先得到你的計數,並把它們放到一個臨時供以後使用。 見下:

Create table temp(Num int, [state] varchar(2)) 
    Insert into temp(Num,[state]) 
    Select 1,'DC' 
     UNION ALL 
    Select 1,'VA' 
     UNION ALL 
    Select 1,'VA' 
     UNION ALL 
    Select 2,'DC' 
     UNION ALL 
    Select 2,'MD' 
     UNION ALL 
    Select 3,'MD' 
     UNION All 
    Select 3,'MD' 
     UNION ALL 
    Select 3,'VA' 
     UNION ALL 
    Select 3,'DC' 


    Select t.Num [Time],t.[State] 
    , CASE WHEN t.[state] = 'VA' THEN Count(t.[State]) ELSE 0 END [Number] 
    INTO #temp2 
    From temp t 
    Group by t.Num, t.[state] 
    --drop table #temp2 
    Select 
    t2.[time] 
    ,SUM(t2.[Number]) 
    From #temp2 t2 
    group by t2.[time]