当前位置: 数据库>sqlserver
SQLserver分组统计查询(按月、小时分组)
来源: 互联网 发布时间:2014-08-29
本文导语: 首先,创建数据表IP地址,访问时间和访问次数。 如果每访问一次就插入一条记录,那么AccessCount可以不要,查询时使用count即可。 这样当访问量很大的时候会对数据库造成很大压力。 设置AccessCount字段,可以根据需求在特定...
首先,创建数据表IP地址,访问时间和访问次数。
如果每访问一次就插入一条记录,那么AccessCount可以不要,查询时使用count即可。
这样当访问量很大的时候会对数据库造成很大压力。
设置AccessCount字段,可以根据需求在特定的时间范围内。
如果是相同IP访问就在AccessCount上累加。
例如:
代码示例:
Create table Counter
(
CounterID int identity(1,1) not null,
IP varchar(20),
AccessDateTime datetime,
AccessCount int
)
(
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
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)
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
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)
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)