有一表,记录如下,每条记录有两条,不同之处为日期上,现想更新表月分部门,更新条件为:同一个人,较早升职日期对应的月份值从较晚的升职日期月分向后开始值如果为1变为0,其余值不变;较晚升职日期对应的月份值从较早的升职日期月分开始向前值如果为1变为0,其余值不变原表:
____________________________________________________________________________________________________________________
姓名    升职日期        入职日期    离职日期    1月 2月 3月 4月 5月 6月 7月  8月 9月 10月 11月 12月
A 2008-10-17  2008-03-11  NULL 0 0 1 1 1 1 1 1 1 1 1 1
A 2008-03-17  2008-03-11  NULL 0 0 1 1 1 1 1 1 1 1 1 1
B 2008-02-01  2006-11-10  NULL 1 1 1 1 1 1 1 1 1 1 1 1
B 2008-07-28  2006-11-10  NULL 1 1 1 1 1 1 1 1 1 1 1 1
C 2008-09-08  2007-03-26  2008-10-15  1 1 1 1 1 1 1 1 1 -1 0 0
C 2008-02-01  2007-03-26  2008-10-15  1 1 1 1 1 1 1 1 1 -1 0 0变更后的表:
___________________________________________________________姓名    升职日期        入职日期    离职日期    1月 2月 3月 4月 5月 6月 7月  8月 9月 10月 11月 12月
A 2008-10-17  2008-03-11  NULL 0 0 0 0 0 0 0 0 0 1 1 1
A 2008-03-17  2008-03-11  NULL 0 0 1 1 1 1 1 1 1 0 0 0
B 2008-02-01  2006-11-10  NULL 1 1 1 1 1 1 0 0 0 0 0 0
B 2008-07-28  2006-11-10  NULL 0 0 0 0 0 0 1 1 1 1 1 1
C 2008-09-08  2007-03-26  2008-10-15  0 0 0 0 0 0 0 0 1 -1 0 0
C 2008-02-01  2007-03-26  2008-10-15  1 1 1 1 1 1 1 1 0 0 0 0简单的讲就是:
比如第一次升职日期为2008-02-01,第二次升职日期为:2008-09-01
原值
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
变更为
1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1
不知道哪位大哥知道更新这样表,多谢

解决方案 »

  1.   

    楼主发错地方了,发到sql论坛上就有高手解决了
      

  2.   

    楼主发错地方了,发到sql论坛上就有高手解决了
      

  3.   

    a.分别取A的最大升职日期和最小升职日期两条记录
    b.最大日期记录:取月份值,如9,更新大于等于9的字段为1,其余更新为0.
    c.最小日期记录:取月份值,如9,更新小于9的字段为1,其余更新为0.不知道我的理解是不是这样的?
      

  4.   

    仔细研究了一下,下面的代码应该可以达到你的要求update #emp_temp6
    set 
     1月=case when datepart(M,b.升职日期)=1 then 1月 else 0 end,
     2月=case when datepart(M,b.升职日期)<=2 then 2月 else 0 end,
     3月=case when datepart(M,b.升职日期)<=3 then 3月 else 0 end,
     4月=case when datepart(M,b.升职日期)<=4 then 4月 else 0 end,
     5月=case when datepart(M,b.升职日期)<=5 then 5月 else 0 end,
     6月=case when datepart(M,b.升职日期)<=6 then 6月 else 0 end,
     7月=case when datepart(M,b.升职日期)<=7 then 7月 else 0 end,
     8月=case when datepart(M,b.升职日期)<=8 then 8月 else 0 end,
     9月=case when datepart(M,b.升职日期)<=9 then 9月 else 0 end,
     10月=case when datepart(M,b.升职日期)<=10 then 10月 else 0 end,
     11月=case when datepart(M,b.升职日期)<=11 then 11月 else 0 end,
     12月=case when datepart(M,b.升职日期)<=12 then 12月 else 0 end
     from #emp_temp6 a inner join
    (select 姓名,max(升职日期) '升职日期' from #emp_temp6 group by 姓名)b 
    on a.姓名=b.姓名 and a.升职日期=b.升职日期update #emp_temp6
    set 
     1月=case when datepart(M,b.升职日期2)>1 then 1月 else 0 end,
     2月=case when datepart(M,b.升职日期2)>2 then 2月 else 0 end,
     3月=case when datepart(M,b.升职日期2)>3 then 3月 else 0 end,
     4月=case when datepart(M,b.升职日期2)>4 then 4月 else 0 end,
     5月=case when datepart(M,b.升职日期2)>5 then 5月 else 0 end,
     6月=case when datepart(M,b.升职日期2)>6 then 6月 else 0 end,
     7月=case when datepart(M,b.升职日期2)>7 then 7月 else 0 end,
     8月=case when datepart(M,b.升职日期2)>8 then 8月 else 0 end,
     9月=case when datepart(M,b.升职日期2)>9 then 9月 else 0 end,
     10月=case when datepart(M,b.升职日期2)>10 then 10月 else 0 end,
     11月=case when datepart(M,b.升职日期2)>11 then 11月 else 0 end,
     12月=case when datepart(M,b.升职日期2)>12 then 12月 else 0 end
     from #emp_temp6 a inner join
    (select 姓名,min(升职日期) '升职日期',max(升职日期) '升职日期2' from #emp_temp6 group by 姓名)b 
    on a.姓名=b.姓名 and a.升职日期=b.升职日期select * from #emp_temp6