临时表#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
-------------------------------------------
请教大家!
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
-------------------------------------------
请教大家!
#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
计算方法是: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
-------------------------------------------
请教大家!
返回这列的时候 ,按照你数学公式返回就可以了 select G=F*(E+I)/(F+J) from table
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