SQL server实战篇(二)利用游标进行数据统计

USE [Data Inspection]
GO
/****** Object:  StoredProcedure [dbo].[FTIR_data_processing]    Script Date: 2018/8/4 15:07:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[FTIR_data_processing]
@startime datetime,
@endtime datetime,
@Base_StationInfo_ID int,-- 站房ID
@Base_InstrumentInfo_ID int-- 设备ID
as 
begin


Declare
@UpStartTime datetime,
@UpEndTime  datetime,
@name varchar(30),
@stationName varchar(30),
@colName   varchar(10),
@startValue numeric(10,3),                 --预警阈值表里的小值
@endValue numeric(10,3),                   --预警阈值表里的大值
@grade varchar(20),                --
@type int,                         --因子预警阈值类型(0安全,1,类比)
@windDirection varchar(20),        --本周最高浓度对应的风向
@DateTime datetime,                --本周最高浓度对应的时间
@Concentration numeric(10,3),      --本周最高浓度
@lastconcentration numeric(10,3),  --上周最高浓度
@CountSQL nvarchar(MAX),
@CountValue int,   --统计是否有异常因子
@CountValue1 int,   --统计白天异常因子数目
@CountValue2 int,   --统计夜晚异常因子数目
@lowerValue numeric(10,3),  --预警阈值的范围区间值,小值
@upperValue numeric(10,3),  --预警阈值的范围区间值,大值
@Mtype  varchar(10)      --物质类型


SET @UpStartTime = DATEADD(HOUR,12,@startime)
SET @UpEndTime = DATEADD(HOUR,12,@endtime)

declare cur_FTIR cursor for 
select name,startValue,endValue,grade,type from warningStaticValue where Base_StationInfo_ID = @Base_StationInfo_ID and Base_InstrumentInfo_ID = @Base_InstrumentInfo_ID

open cur_FTIR
fetch next from cur_FTIR into @name,@startvalue,@endvalue,@grade,@type
--预警阈值分为全天,白天和夜晚的,要根据不同的@type值进行统计,当游标遍历不同类型时,统计的时间段也不一样
while @@FETCH_STATUS = 0
begin
--全天的超标统计
if @type = 0 or @type = 3
begin
set @CountSQL = N'select @countsum  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime'
EXEC SP_EXECUTESQL @COUNTSQL,
@PARAMS = N'@ustarttime datetime,@uendtime datetime,@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output ' ,
@Sname = @name,
@ustarttime = @UpStartTime,
@uendtime = @UpEndTime,
@instument = @Base_InstrumentInfo_ID,
@sstartvalue = @startValue,
@sendvalue = @endValue,
@countsum = @CountValue output
end
        --白天的阈值超标统计
        if @type  = 1
        begin
            set @CountSQL = N'select @countsum  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime and datepart(hour,reporttime) in (8,9,10,11,12,13,14,15,16,17,18,19)'
            EXEC SP_EXECUTESQL @COUNTSQL,
            @PARAMS = N'@ustarttime datetime,@uendtime datetime,@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output ' ,
            @Sname = @name,
            @ustarttime = @UpStartTime,
            @uendtime = @UpEndTime,
            @instument = @Base_InstrumentInfo_ID,
            @sstartvalue = @startValue,
            @sendvalue = @endValue,
            @countsum = @CountValue output


        end
        --夜晚阈值超标统计
        if @type  = 2
        begin
            set @CountSQL = N'select @countsum  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime and datepart(hour,reporttime) in (20,21,22,23,0,1,2,3,4,5,6,7)'
            EXEC SP_EXECUTESQL @COUNTSQL,
            @PARAMS = N'@ustarttime datetime,@uendtime datetime,@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output ' ,
            @Sname = @name,
            @ustarttime = @UpStartTime,
            @uendtime = @UpEndTime,
            @instument = @Base_InstrumentInfo_ID,
            @sstartvalue = @startValue,
            @sendvalue = @endValue,
            @countsum = @CountValue output
        end



        --如果有超标的情况及@countvalue > 0 时,统计总超标量即@countvalue,白天超标量和夜晚超标量
            if @CountValue > 0
                begin
                    if @type = 0 or @type = 3
                    set @CountSQL = N'select @countsum  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and DATEPART(HOUR,reporttime)in (8,9,10,11,12,13,14,15,16,17,18,19) and repairvalue > @sstartvalue and repairvalue < @sendvalue;
                                     select @countsum1  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname AND DATEPART(HOUR,reporttime)in (20,21,22,23,0,1,2,3,4,5,6,7) and repairvalue > @sstartvalue and repairvalue < @sendvalue'
                    if @type = 1
                    set @CountSQL = N'select @countsum  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime and datepart(hour,reporttime) in (8,9,10,11,12,13,14,15,16,17,18,19);
                                     select @countsum1  =0'
                    if @type = 2
                    set @CountSQL = N'select @countsum  = 0;
                                     select @countsum1  = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname AND DATEPART(HOUR,reporttime)in (20,21,22,23,0,1,2,3,4,5,6,7) and repairvalue > @sstartvalue and repairvalue < @sendvalue'

                    exec sp_executesql @countsql,
                    @PARAMS = N'@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output,@Countsum1 Numeric(10,4) output ' ,
                    @Sname = @name,
                    @instument = @Base_InstrumentInfo_ID,
                    @sstartvalue = @startValue,
                    @sendvalue = @endValue,
                    @countsum = @CountValue1 output,
                    @countsum1 = @CountValue2 output


            --本天最高浓度/时间/风速/风向
                    set @CountSQL = N'select @mConcentration = repairValue,@STATION = stationname ,@Sdatetime = reportTime,@Swind = windDirectionExplain from FTIR_original_data_temp  where stationID = @instument and monitorName = @Sname and reportTime between @SUPstarttime and @Supendtime and repairValue = (select max(repairValue) from FTIR_original_data_temp where stationID = @instument and monitorName = @Sname and reportTime between @SUPstarttime and @Supendtime)'
                    exec sp_executesql @countsql,
                    @params =N'@instument int,@Sname varchar(30),@sUPstarttime datetime,@Supendtime datetime,@mConcentration numeric(10,3) output,@Sdatetime datetime output,@Swind varchar(20) output,@STATION varchar(30) output',
                    @Sname = @name,
                    @instument = @Base_InstrumentInfo_ID,
                    @sUPstarttime  = @UpStartTime,
                    @Supendtime = @UpEndTime,
                    @mConcentration = @Concentration output,
                    @Sdatetime = @DateTime output,
                    @Swind = @windDirection output,
                    @STATION = @stationName output


            --昨天最高浓度

                    set @CountSQL = N'select @lConcentration = max(repairValue) from FTIR_original_data  where area = @area and stationID = @instument and monitorName = @Sname and reportTime between dateadd(day,-1,@SUPstarttime) and dateadd(day,-1,@Supendtime)'
                    exec sp_executesql @countsql,
                    @params =N'@area int,@instument int,@Sname varchar(30),@sUPstarttime datetime,@Supendtime datetime,@lConcentration numeric(10,3) output',
                    @area = @Base_StationInfo_ID,
                    @Sname = @name,
                    @instument = @Base_InstrumentInfo_ID,
                    @sUPstarttime  = @UpStartTime,
                    @Supendtime = @UpEndTime,
                    @lConcentration = @lastconcentration output

                    --将本存储过程中获取的各变量的值插入到表excess中


                    insert into excess values(NEWID(),@Base_StationInfo_ID,@stationName,'FTIR',@name,'站点预警阈值-静态',@grade,@startValue,@endValue, @CountValue,@CountValue1,@CountValue2,@DateTime,@Concentration,@lastconcentration,@windDirection)
                end

        fetch next from cur_FTIR into @name,@startvalue,@endvalue,@grade,@type
    end
CLOSE CUR_ftir
deallocate cur_ftir

insert into FTIR_original_data([id],[stationID],[stationName],[devicesID],[devicesName],[monitorID],[monitorName],[belongDevices],[reportTime],[originalData],[repairValue],[unitID],[unit],[siteID],[itemID],[weatherReportTime],[temperature],[tempExplain],[humidity],[humidityExplain],[windDirection],[windDirectionExplain],[windSpeed],[windSpeedExplain]) 
select [id],[stationID],[stationName],[devicesID],[devicesName],[monitorID],[monitorName],[belongDevices],[reportTime],[originalData],[repairValue],[unitID],[unit],[siteID],[itemID],[weatherReportTime],[temperature],[tempExplain],[humidity],[humidityExplain],[windDirection],[windDirectionExplain],[windSpeed],[windSpeedExplain]  from FTIR_original_data_temp

update FTIR_original_data set area = @Base_StationInfo_ID WHERE AREA IS NULL;

end

猜你喜欢

转载自blog.csdn.net/qq_39001049/article/details/81411255