SQL GROUP BY(DATEPART(),field1)结果设置为零空值

时间:2014-12-13 00:47:13

标签: sql

我想汇总计数,按日期部分和列分组。

例如,一个包含3列的表,每行代表一个唯一的事件:id,name,date

我想选择按名称和小时分组的总计数,当没有事件时选择零。如果我只按名称分组,我可以用每个名字的表加入。一个小时我可以做类似的事情。

我如何处理两者分组的情况,而不是每个名称+小时组合都有一行表?

2 个答案:

答案 0 :(得分: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

总和(name为null的情况,然后是0 else 1 end)处理特定小时和名称没有事件的情况。计数将显示为0.对于其他人,每个匹配的行对总和贡献1。

对于sql server,请改用datepart(hour,event.date)。其余的应该是类似的

答案 1 :(得分: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;