2014-12-13 75 views
0

我想聚合按日期部分和列分組的計數。SQL GROUP BY(DATEPART(),field1)結果集爲零空值

例如,3列與代表一個獨特的事件的每一行的表:ID,姓名,日期

我想選擇按名稱和時段分組總計數,用零時沒有活動。如果我只按姓名進行分組,我可以加上一個名字表。用一個小時我可以做類似的事情。

我該如何處理兩者分組的情況,而不是每個名稱+小時組合都有一個表格?

+0

CROSS JOIN包含每個名字含每隔一小時,然後OUTER一個表的表加入你的數據和聚合。 – mdahlman 2014-12-13 00:54:44

+0

您正在使用哪些DBMS? – paqogomez 2014-12-13 01:18:21

回答

0

以下是MySQL溶液:

create table hours (hour int) 

insert hours (hour) values (0), (1) .... (23) 

select hour, name, sum(case when name is null then 0 else 1 end) 
from hours left outer join 
event on (hour(event.date) = hours.hour) 
group by hour, name 

總和(情況下,當名稱爲空則0,否則,1個端)處理時,有對特定小時和名稱沒有事件的情況。計數將顯示爲0.對於其他每個匹配行貢獻1的總和。

對於sql server使用datepart(hour,event.date)代替。其餘的應該是相似的

0

您可以使用cross join生成所有行,然後其它邏輯填入值:

select h.hour, n.name, count(a.name) as cnt 
from (select distinct hour(date) as hour from atable) h cross join 
    (select distinct name from atable) n left join 
    atable a 
    on hour(a.date) = h.hour and a.name = n.name 
group by h.hour, n.name;