临时表#T,字段A,B,C是字符串类型,字段E,F,G,I,J,K是NUMERIC类型。#T的原始数据如下:
A B C E F G I J K
0807129 213401 200807 3384 0 0 0 3985 0
0807129 213401 200808 0 3985 0 0 0 0
0807129 213401 200809 0 7370 0 0 1790 0
0807129 213401 200811 0 1790 0 0 0 0
0808003 207301 200809 23144 34800 0 0 13600 0
0808003 207301 200810 1420 16570 0 0 0 0
现在要得到如下结果:
A(单号) B(材料) C(月份) E F G I J K
0807129 213401 200807 3384 0 0 0 3985 3384
0807129 213401 200808 0 3985 3384 3384 0 0
0807129 213401 200809 0 7370 0 0 1790 0
0807129 213401 200811 0 1790 0 0 0 0
0808003 207301 200809 23144 34800 16640.7 0 13600 6503.3
0808003 207301 200810 1420 16570 7923.3 6503.3 0 0
计算方法是:G=F*(E+I)/(F+J),从每个A(单号)和B(材料) 的最小的C(月份)开始算起,算好最小月份的再算次月的。
K=(A和B与当前行的A和B相同、C小于等于当前行的E的总和) 减去 (A和B与当前行的A和B相同、C小于等于当前行的G的总和)
I=(A和B与当前行的A和B相同、当前行的C(月份)的前月的K的值),没有前月的,I值不变。也就是说第二行的I等于第一行的K;第三行的I等于第二行的K;第四行的I等于第三行的K
-------------------------------------------
请教大家!

解决方案 »

  1.   

    排了半天数字还是没有排好。对数字部分重新排了一下,用"[]"符号隔开了:
    #T的原始数据如下:
    E F G I J K
    3384 []0 []0 []0 []3985 []0
    0 []3985 []0 []0 []0 []0
    0 []7370 []0 []0 []1790 []0
    0 []1790 []0 []0 []0 []0
    23144 []34800 []0 []0 []13600 []0
    1420 []16570 []0 []0 []0 []0
    现在要得到如下结果:
    E F G I J K
    3384 []0 []0 []0 []3985 []3384
    0 []3985 []3384 []3384 []0 []0
    0 []7370 []0 []0 []1790 []0
    0 []1790 []0 []0 []0 []0
    23144 []34800 []16640.7 []0 []13600 []6503.3
    1420 []16570 []7923.3 []6503.3 []0 []0
      

  2.   

    在帖子里面有个添加图片,写入你图片的url就能发图片了
      

  3.   


    计算方法是:G=F*(E+I)/(F+J),从每个A(单号)和B(材料) 的最小的C(月份)开始算起,算好最小月份的再算次月的。 
    K=(A和B与当前行的A和B相同、C小于等于当前行的E的总和) 减去 (A和B与当前行的A和B相同、C小于等于当前行的G的总和) 
    I=(A和B与当前行的A和B相同、当前行的C(月份)的前月的K的值),没有前月的,I值不变。也就是说第二行的I等于第一行的K;第三行的I等于第二行的K;第四行的I等于第三行的K 
    ------------------------------------------- 
    请教大家!
      

  4.   

    二行G=F*(E+I)/(F+J),结果应该是0啊, 
      

  5.   

    HEROWANG ,二行G=F*(E+I)/(F+J)=3985*(0+3384)/(3985+0)=3384
      

  6.   


    返回这列的时候 ,按照你数学公式返回就可以了 select G=F*(E+I)/(F+J) from table
      

  7.   

    tianhuo_soft ,每个同A(单号)、B(材料)的行,先要求出最小月份的G,然后计算该行的K,再把改行的K赋值给同A(单号)、同B(材料)的下个月份的I 。 得到I后的新的月份,再开始计算G--->K--->I,这是个循环。
      

  8.   

    试试这个--测试数据
    create table #t(A varchar(10),B varchar(10),C varchar(10),e int,F int,
    G decimal(9,1),I decimal(9,1),J int,K decimal(9,1))
    insert #t 
    select '0807129' ,'213401' ,'200807' ,3384 ,0 ,0 ,0 ,3985 ,0  
    union select '0807129','213401','200808',0,3985,0,0,0,0 
    union select '0807129','213401','200809',0,7370,0,0,1790,0 
    union select '0807129','213401','200811',0,1790,0,0,0,0 
    union select '0808003','207301','200809',23144,34800,0,0,13600,0 
    union select '0808003','207301','200810',1420,16570,0,0,0,0 --数据处理
    declare @a varchar(10)
    declare @b varchar(10)
    declare @c varchar(10)
    declare @e decimal(9,2)
    declare @g decimal(9,2)
    declare @k decimal(9,2)
    declare @i decimal(9,2)
    declare @g1 decimal(9,2)
    select @a='',@b='',@c='',@g=0,@k=0,@e=0,@i=0,@g=0update #t  set 
    @e=case when @a<>a and @b<>b  then e else @e+e end,
    @i=case when @a<>a and @b<>b then i else @k end,
    @g1=F*(E+@i)/(F+J),
    @g=case when @a<>a and @b<>b  then @g1 else @g+@g1 end,
    k=@e-@g,g= @g1,i=@i,
    @k=@e-@g,
    @a=a,
    @b=bselect * from #t
    /*结果
    A          B          C          e           F           G           I           J           K           
    ---------- ---------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- 
    0807129    213401     200807     3384        0           .0          .0          3985        3384.0
    0807129    213401     200808     0           3985        3384.0      3384.0      0           .0
    0807129    213401     200809     0           7370        .0          .0          1790        .0
    0807129    213401     200811     0           1790        .0          .0          0           .0
    0808003    207301     200809     23144       34800       16640.7     .0          13600       6503.3
    0808003    207301     200810     1420        16570       7923.3      6503.3      0           .0
    */
    drop table #t
      

  9.   

    lonlyhawk ,谢谢!初步验证了一下是可以的,明天再仔细检查下。