SSRS:如何返回每月的每日事件数

时间:2017-02-10 19:07:21

标签: sql-server reporting-services

我有一张包含以下信息的表格

ID,DateTime,EventType
1,6/5/2013 9:35:00,B
1,6/5/2013 9:35:24,A
2,6/5/2013 9:35:36,B
3,6/5/2013 9:36:11,D
2,6/5/2013 9:39:16,A
3,6/5/2013 9:40:48,B
4,7/5/2013 9:35:19,B
4,7/5/2013 9:35:33,A
5,7/5/2013 9:35:53,B
5,7/5/2013 9:36:06,D
6,7/5/2013 9:39:39,A
7,7/5/2013 9:40:28,B
8,8/5/2013 9:35:02,A
7,8/5/2013 9:35:08,A
8,8/5/2013 9:35:29,B
6,8/5/2013 9:36:39,B

我需要计算事件每天改变状态的次数,只要状态之间的时间在这段时间内少于30秒。

基本上我正在寻找以下结果集

6/5/2013   |    1  
7/5/2013   |    2  
8/5/2013   |    1  

我尝试了几种不同类型的查询,但没有任何效果。我正在使用SQL Server Reporting Services 2008。

2 个答案:

答案 0 :(得分:0)

试试这个:

select CONVERT(VARCHAR(10), a.DateTime, 103) [Date], count(a.ID) Count from Table a
inner join Table b on a.ID = b.ID
where DATEDIFF(second,a.DateTime,b.DateTime) between 1 and 29 and a.ID = b.ID
and Cast(a.DateTime as Date) = Cast(b.DateTime as date)
group by CONVERT(VARCHAR(10), a.DateTime, 103)

如果有帮助,请告诉我。

答案 1 :(得分:0)

declare @t table (ID int,[DateTime] datetime ,EventType varchar);
insert  @t values
        (1,'6/5/2013 9:35:00','B'),
        (1,'6/5/2013 9:35:24','A'),
        (2,'6/5/2013 9:35:36','B'),
        (3,'6/5/2013 9:36:11','D'),
        (2,'6/5/2013 9:39:16','A'),
        (3,'6/5/2013 9:40:48','B'),
        (4,'7/5/2013 9:35:19','B'),
        (4,'7/5/2013 9:35:33','A'),
        (5,'7/5/2013 9:35:53','B'),
        (5,'7/5/2013 9:36:06','D'),
        (6,'7/5/2013 9:39:39','A'),
        (7,'7/5/2013 9:40:28','B'),
        (8,'8/5/2013 9:35:02','A'),
        (7,'8/5/2013 9:35:08','A'),
        (8,'8/5/2013 9:35:29','B'),
        (6,'8/5/2013 9:36:39','B');
--select    * from @t order by ID, DateTime;

with cte as (
        select  *, cast([DateTime] as date) the_date, row_number() over (partition by ID order by DateTime) row_num
        from    @t
)
select  c1.the_date, count(1)
from    cte c1
join    cte c2
        on  c2.ID = c1.ID
        and c2.row_num = c1.row_num + 1
where   datediff(S,c1.DateTime, c2.DateTime) < 30
group   by c1.the_date
order   by c1.the_date;