不用游标可以实现吗? 另一个是职工账户表(Tzgzh),里面有单位代码(Fdwdm)、职工编号(Fzgbh)、该月的工资(Fgz)等,每个单位每个月每个职工产生一条记录。应该还有一个表示年份和月份的字段吧? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不好意思,没有表述清除,是的,还有一个字段--工资日期(Fgzrq),是datetime类型的,比如2007-8-1,最后的天数没有用,只要获得前面的年和月就行了。 还有一个问题要弄清楚,就是工资日期(Fgzrq)是上个月的工资还是这个月的工资? /*纵向方法*/-- 首先生成Tzgtz表的空记录insert Tzgtz(Fdwdm, Fzgbh, Fyear) select Fdwdm, Fzgbh, 2007, from Tzg where Fdwdm = '单位代码'-- UPDATE F1 - F12declare @Max tinyint, @Min tinyintselect @Min = max(datepart(month, Fgzrq)), @Max = max(datepart(month, Fgzrq)) from Tzgzh where datepart(year, Fgzrq) = '2007' and Fdwdm = '单位代码'while @Min <= @Maxmontbegin--如果字段真的是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 + 1end 即1个月1个月UPDATE。当让你也可以把12个JOIN起来UPDATE,这样更快;甚至将Fdwdm、Fzgbh、Fyear和12个月的工资也JOIN在一起,一起INSERT,那这样更快,代码超长,我不想写了。 这种方法,数据量小的时候,体现不了优势,当数据量大的时候,就有优势了。因为你数据在多,单位再多,也是INSERT一次,UPDATE12次。建议你写成一次INSERT的形式,更有优势。 字段就是F1到F12,实际上,我在游标中就是用的动态sql的,用cast(@Month as varchar),然后sql语句中就可以和F结合了,好了,先看看你的思路了,先谢谢你了。 我刚才按找你说的,先写了一下,好像没有很明显的改观,也许是我写的有问题,但还有其他的条件其实我没有在上面说清楚的,先把分给你吧,明早上再来弄,我的msn是:[email protected],可以在msn上请教一下吗? T-SQL 两个变量相加的问题 怎样判断update重复的数据 情解释在JDBC和ODBC中下列操作如何进行?(请举T-SQL例子)(学生) 请问这样的SQL语句应怎样写?谢谢指点! 我分离的数据库怎么加不上啊 送分問題!大家關照!! 一个有趣的SQL语句,各位进来看看。 搜索出来找不到地址,只好再问,如何查每个学生最近一次的考试成绩? 怎样分开DATE和TIME? 关于锁的问题,帮帮我!谢谢! 遇到不会写的SQL,哪位高手帮忙看看? 存储过程中调用存储过程的超时,存储中有游标嵌套--急啊!
纵向方法
*/-- 首先生成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
当让你也可以把12个JOIN起来UPDATE,这样更快;
甚至将Fdwdm、Fzgbh、Fyear和12个月的工资也JOIN在一起,一起INSERT,那这样更快,代码超长,我不想写了。