大家好,有个问题咨询下,谢谢:
我有一个表:其中1-12为列名
处理日期    间隔月份    1  2  3   4  5  6   7  8  9  10  11  12
20130203      3
20130504      6
20130101      9
20130203      1
.
.

我现在要更新这个表,把处理日期之后按间隔月份做排表,把得到的日期按月份数更新到对应数字的列中,
但是有要求更新的日期年份不能超出处理日期的年份
这个要怎么处理,谢谢各位了

解决方案 »

  1.   

    本帖最后由 htl258 于 2013-07-25 12:40:06 编辑
      

  2.   


    create table hc
    (处理日期 varchar(12), 间隔月份 int,
     [1] varchar(12), [2] varchar(12), 
     [3] varchar(12), [4] varchar(12),
     [5] varchar(12), [6] varchar(12), 
     [7] varchar(12), [8] varchar(12), 
     [9] varchar(12), [10] varchar(12), 
     [11] varchar(12), [12] varchar(12)) insert into hc(处理日期,间隔月份)
     select '20130203', 3 union all
     select '20130504', 6 union all
     select '20130101', 9 union all
     select '20130203', 1
    declare @clrq varchar(12),@jgyf int,@tsql varchar(6000),@t varchar(12)declare ap scroll cursor for
     select 处理日期,间隔月份 from hc
     
    open ap
    fetch first from ap into @clrq,@jgyfwhile(@@fetch_status<>-1)
    begin
     select @t=convert(varchar(12),dateadd(m,@jgyf,@clrq),112)
     while (datediff(yy,@clrq,@t)=0)
     begin
      select @tsql='update hc set ['+rtrim(datepart(m,@t))+']='''+@t+''' '
                  +' where 处理日期='''+@clrq+''' and 间隔月份='+rtrim(@jgyf)
      exec(@tsql)
      
      select @t=convert(varchar(12),dateadd(m,@jgyf,@t),112)
     end
     fetch next from ap into @clrq,@jgyf
    endclose ap
    deallocate ap
    -- 结果                                                            
    select * from hc/*
    处理日期         间隔月份        1            2            3            4            5            6            7            8            9            10           11           12
    ------------ ----------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
    20130203     3           NULL         NULL         NULL         NULL         20130503     NULL         NULL         20130803     NULL         NULL         20131103     NULL
    20130504     6           NULL         NULL         NULL         NULL         NULL         NULL         NULL         NULL         NULL         NULL         20131104     NULL
    20130101     9           NULL         NULL         NULL         NULL         NULL         NULL         NULL         NULL         NULL         20131001     NULL         NULL
    20130203     1           NULL         NULL         20130303     20130403     20130503     20130603     20130703     20130803     20130903     20131003     20131103     20131203(4 row(s) affected)
    */