SQLserver 实现分组统计查询(按月、小时分组)
设置AccessCount字段可以根据需求在特定的时间范围内如果是相同IP访问就在AccessCount上累加。 复制代码 代码如下: Create table Counter ( CounterID int identity(1,1) not null, IP varchar(20), AccessDateTime
设置AccessCount字段可以根据需求在特定的时间范围内如果是相同IP访问就在AccessCount上累加。 复制代码 代码如下:Create table Counter ( CounterID int identity(1,1) not null, IP varchar(20), AccessDateTime datetime, AccessCount int ) 该表在这儿只是演示使用,所以只提供了最基本的字段 现在往表中插入几条记录 insert into Counter select '127.0.0.1',getdate(),1 union all select '127.0.0.2',getdate(),1 union all select '127.0.0.3',getdate(),1 1 根据年来查询,以月为时间单位 通常情况下一个简单的分组就能搞定 复制代码 代码如下:select convert(varchar(7),AccessDateTime,120) as Date, sum(AccessCount) as [Count] from Counter group by convert(varchar(7),AccessDateTime,120) 像这样分组后没有记录的月份不会显示,如下: 这当然不是我们想要的,所以得换一种思路来实现,如下: 复制代码 代码如下:declare @Year int set @Year=2009 select m as [Date], sum( case when datepart(month,AccessDateTime)=m then AccessCount else 0 end ) as [Count] from Counter c, ( select 1 m union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12 ) aa where @Year=year(AccessDateTime) group by m 查询结果如下:
2 根据天来查询,以小时为单位。这个和上面的类似,代码如下: 复制代码 代码如下:declare @DateTime datetime set @DateTime=getdate() select right(100+a,2)+ ':00 -> '+right(100+b,2)+ ':00 ' as DateSpan, sum( case when datepart(hour,AccessDateTime)> =a and datepart(hour,AccessDateTime) '+right(100+b,2)+ ':00 ' 查询结果如下图: