sql实现n日均线

来源:互联网 发布:网络传播理论与实践 编辑:程序博客网 时间:2024/04/28 20:32

if COL_LENGTH('book1','n日均线')isnotnull/*判断表中是否存在列名为n

均线的列,存在就删除,不存在就创建,book表示数据表名*/

begin

    alter table book1  /*修改表*/

    drop column n日均线/*删除列*/

end

    alter table book1  /*修改表*/

    add  n日均线decimal(18,2)null/*增加列*/

GO

/*********************************************创建存储过程*****************************************************/

    CREATE  PROCEDUREnri/*存储过程名称为nri*/

    @n int,@resfloatoutput/*输入参数n表示n日均线,resn日均线的值*/

    as

    declare @low int  /*定义循环变量low*/

    declare @high int  /*定义循环变量@high*/

    declare @max int  /*定义变量max表示book1表中数据的总量*/

    declare @nsum float   /*定义变量nsum表示某天n日收盘的总和*/

    set @high=@n /*high初始为n*/

    select @max=count(*)from book1  /*查询book数据表中数据的总行量*/  

 

/*******************************创建游标************************************************/

       declare test cursor SCROLL FOR   /*定义游标名为test*/

       select 时间,收盘from book1 /*取得要查询的结果集,游标指向此结果集*/

       open test    /*打开游标*/

       declare @收盘float /*定义局部变量收盘,数据类型要跟表中的列保持一致,接收book1表中收盘列的数据*/

       declare @时间nvarchar(255)  /*定义局部变量时间,数据类型要跟表中的列保持一致,接收book1表中时间列的数据*/

 

/****************************外循环开始*************************************************/

           while @high<=@max/*所求某日的均线值该日是否不大于表中数据的总行量*/

           begin

              set @nsum=0/*某天n日收盘的总和初始值为*/

              set @low=@high-@n+1/*所求某天n日均线这n天中的第一日始终比最后一日少(n-1)日*/

/******************************内循环开始*****************************************************/

              while @low<=@high/*low是否不大于high,low每次循环+1表示下一日,直到等于所求n日中最后一日*/

              begin 

                   fetch ABSOLUTE @lowfromtestinto @时间,@收盘/*游标根据low值定位对应第几行(第几日)数据,

                     并把数据赋值给局部变量@时间,@收盘*/

                   set @nsum=@nsum+@收盘/*n日的收盘值相加*/

                   set @res=@nsum/@n    /*求得某日的n日均线*/

                   set @low=@low+1      /*low+1表示下一日*/

               end

               update book1 set n日均线=@res where 时间=@时间/*更新日均线的值,把求得的日均线的值更新到对应日期*/

               set @high=@high+1  /*求下一日的n日均线*/

            end

 

CLOSE test   /*关闭游标*/

DEALLOCATE test   /*释放游标资源*/

 

 

/*新建查询*/

DECLARE @rijun float     /*声明变量@rijun接收存储过程的输出参数*/

EXEC nri @n=6,@res=@rijunOUTPUT/*执行存储过程nri,输入参数n(6日均线)*/

                                 /*输出参数res传递给变量@rijun*/

 

 

/*新建查询删除存储过程*/

 

drop  proc nri

 

 

 

 

 


0 0
原创粉丝点击