首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一sql语句:怎么得到查询某天所有站号的报警次数和报警持续时间

2012-01-23 
求一sql语句:如何得到查询某天所有站号的报警次数和报警持续时间!表A的字段定义如下:站号类型代码监测时间

求一sql语句:如何得到查询某天所有站号的报警次数和报警持续时间!
表A   的字段定义如下:
    站号                               类型代码                   监测时间                               监测值
varchar(10)               varchar(10)               datetime                                 float
01A01                             01001                   2007-1-10   10:20:00                     2.24
01A02                             01002                   2007-1-10   10:20:00                     13
02A01                             01003                   2007-1-10   10:20:00                     6.57
02A02                             01004                   2007-1-10   10:20:00                     3.59
03A01                             01002                   2007-1-10   10:20:00                     16
03A04                             01003                   2007-1-10   10:20:00                     5.87
    .
    .
A中的记录是随着监测时间的增加而按照每个站号而增加的.

表B   的字段定义如下:  
      站号                         报警开始时间                               报警结束时间              
varchar(10)                   datetime                                         datetime                    
01A01                         2007-1-10   10:20:00                   2007-1-10   10:30:00
01A02                         2007-1-10   10:10:00                   2007-1-10   10:20:00      
02A02                         2007-1-10   10:10:00                   2007-1-10   10:15:00
03A01                         2007-1-10   10:10:00                   2007-1-10   10:15:00      


03A01                         2007-1-10   10:20:00                   2007-1-10   10:30:00
03A04                         2007-2-12   10:20:00                   2007-2-12   10:25:00        
    .
    .
B:   其中并不是每个站号每天都有报警记录,有的有,有的没有.


想要根据要查询的天数来确定所有站号的报警次数和报警持续时间,如果有的站号当天没有报警记录,就记为0.
如查询   2007/01/10     这一天的记录如下:

站号                 报警次数                 报警持续时间
01A01                     1                           00:10:00
01A02                     1                           00:10:00
02A01                     0                           00:00:00           (当天没有报警记录的情况)
02A02                     1                           00:05:00
03A01                     2                           00:15:00
03A04                     0                           00:00:00           (当天没有报警记录的情况,在后天有)



[解决办法]

Create Table A
(站号varchar(10),
类型代码varchar(10),
监测时间datetime,
监测值float)
Insert A Select '01A01 ', '01001 ', '2007-1-10 10:20:00 ', 2.24
Union All Select '01A02 ', '01002 ', '2007-1-10 10:20:00 ', 13
Union All Select '02A01 ', '01003 ', '2007-1-10 10:20:00 ', 6.57
Union All Select '02A02 ', '01004 ', '2007-1-10 10:20:00 ', 3.59
Union All Select '03A01 ', '01002 ', '2007-1-10 10:20:00 ', 16
Union All Select '03A04 ', '01003 ', '2007-1-10 10:20:00 ', 5.87
Union All Select '01A01 ', '01001 ', '2007-1-10 10:25:00 ', 2.25
Union All Select '01A02 ', '01002 ', '2007-1-10 10:25:00 ', 14
Union All Select '02A01 ', '01003 ', '2007-1-10 10:25:00 ', 6.58
Union All Select '02A02 ', '01004 ', '2007-1-10 10:25:00 ', 3.56
Union All Select '03A01 ', '01002 ', '2007-1-10 10:25:00 ', 17
Union All Select '03A04 ', '01003 ', '2007-1-10 10:25:00 ', 5.12

Create Table B
(站号varchar(10),
报警开始时间datetime,
报警结束时间 datetime)


Insert B Select '01A01 ', '2007-1-10 10:20:00 ', '2007-1-10 10:30:00 '
Union All Select '01A02 ', '2007-1-10 10:10:00 ', '2007-1-10 10:20:00 '
Union All Select '02A02 ', '2007-1-10 10:10:00 ', '2007-1-10 10:15:00 '
Union All Select '03A01 ', '2007-1-10 10:10:00 ', '2007-1-10 10:15:00 '
Union All Select '03A01 ', '2007-1-10 10:20:00 ', '2007-1-10 10:30:00 '
Union All Select '03A04 ', '2007-2-12 10:20:00 ', '2007-2-12 10:25:00 '
GO
Select
站号,
报警次数,
Right(100 + 报警持续时间 / 60, 2) + ': ' + Right(100 + 报警持续时间 % 60, 2) + ':00 ' As 报警持续时间
From
(
Select
A.站号,
Count(B.站号) As 报警次数,
IsNull(SUM(DateDiff(mi, B.报警开始时间, B.报警结束时间)), 0) As 报警持续时间
From
(Select Distinct 站号, Convert(Varchar(10), 监测时间, 120) As 监测时间 From A) A
Left Join
B
On A.站号 = B.站号 And DateDiff(dd, B.报警开始时间, A.监测时间) = 0 And DateDiff(dd, B.报警结束时间, A.监测时间) = 0
Where DateDiff(dd, A.监测时间, '2007-1-10 ') = 0
Group By A.站号
) T
Order By 站号
GO
Drop Table A, B
--Result
/*
站号报警次数报警持续时间
01A01100:10:00
01A02100:10:00
02A01000:00:00
02A02100:05:00
03A01200:15:00
03A04000:00:00
*/

热点排行