另一个是职工账户表(Tzgzh),里面有单位代码(Fdwdm)、职工编号(Fzgbh)、该月的工资(Fgz)等,每个单位每个月每个职工产生一条记录。应该还有一个表示年份和月份的字段吧?

解决方案 »

  1.   

    不好意思,没有表述清除,是的,还有一个字段--工资日期(Fgzrq),是datetime类型的,比如2007-8-1,最后的天数没有用,只要获得前面的年和月就行了。
      

  2.   

    还有一个问题要弄清楚,就是工资日期(Fgzrq)是上个月的工资还是这个月的工资?
      

  3.   

    /*
    纵向方法
    */-- 首先生成Tzgtz表的空记录
    insert Tzgtz(Fdwdm, Fzgbh, Fyear) select Fdwdm, Fzgbh, 2007, from Tzg where Fdwdm = '单位代码'-- UPDATE F1 - F12
    declare @Max tinyint, @Min tinyint
    select @Min = max(datepart(month, Fgzrq)), @Max = max(datepart(month, Fgzrq)) from Tzgzh where datepart(year, Fgzrq) = '2007' and Fdwdm = '单位代码'
    while @Min <= @Maxmont
    begin
    --如果字段真的是F1-F12最好,如果不是,再定义一个@Col,WHEN...CASE转换一下
    exec ('update a set a.F' + @Min + ' = b.Fgz from Tzgtz a, Tzgzh b where a.Fdwdm = ''单位代码'' and a.Fyear = ''2007'' and b.Fdwdm = ''单位代码'' and datepart(year, b.Fgzrq) = ''2007'' and datepart(month, b.Fgzrq) = ' + @Min + ' and a.Fzgbh = b.Fzgbh')
    set @Min = @Min + 1
    end
      

  4.   

    即1个月1个月UPDATE。
    当让你也可以把12个JOIN起来UPDATE,这样更快;
    甚至将Fdwdm、Fzgbh、Fyear和12个月的工资也JOIN在一起,一起INSERT,那这样更快,代码超长,我不想写了。
      

  5.   

    这种方法,数据量小的时候,体现不了优势,当数据量大的时候,就有优势了。因为你数据在多,单位再多,也是INSERT一次,UPDATE12次。建议你写成一次INSERT的形式,更有优势。
      

  6.   

    字段就是F1到F12,实际上,我在游标中就是用的动态sql的,用cast(@Month as varchar),然后sql语句中就可以和F结合了,好了,先看看你的思路了,先谢谢你了。
      

  7.   

    我刚才按找你说的,先写了一下,好像没有很明显的改观,也许是我写的有问题,但还有其他的条件其实我没有在上面说清楚的,先把分给你吧,明早上再来弄,我的msn是:[email protected],可以在msn上请教一下吗?