根据产品损耗率计算产品实际数量

http://community.csdn.net/Expert/topic/3236/3236660.xml?temp=.9309046

Cp_No(产品编码)   Cp_Step(加工步骤)         Cp_Shl(损耗率)
001                    1                       0.1
001                    2                       0.15
001                    3                       0.2
002                    1                       0.3
002                    2                       0.15
003                   ...                      ...

Cp_No(产品编码)       finally_Sl(最终数量)
001                      5
002                      7
...                     ...

Cp_No(产品编码)      Cp_Step(加工步骤)    Real_Sl(实际数量)
001                    1                  7.35/(1-0.1) =8.17
001                    2                  6.25/(1-0.15)=7.35
001                    3                  5/(1-0.2)    =6.25
002                    1                  8.24/(1-0.3) =11.77
002                    2                  7/(1-0.15)   =8.24

Cp_No是Varchar，Cp_Step是int,Cp_Shl是Numeric(18,4),Finally_Sl,Real_Sl是Numeric(18,4)
T2中的Finally_Sl 是经过T1中的所有加工步骤最终要得到的数量，比如001产品经过1，2，3三个步骤的最终数量是5。T3中的Real_Sl是由Finally_Sl根据每个加工步骤的损耗率得到,比如001由最终数量5可以得到步骤3的实际数量：5/(1-0.2)=6.25,然后根据6.25得到步骤2的实际数量6.25/(1-0.15)=7.35

-----------------------------------------------------------------------------------------

--测试

--测试数据
create table T1(Cp_No varchar(10),Cp_Step int,Cp_Shl numeric(18,4))
insert T1 select '001',1,0.1
union all select '001',2,0.15
union all select '001',3,0.2
union all select '002',1,0.3
union all select '002',2,0.15

create table T2(Cp_No varchar(10),finally_Sl int)
insert T2 select '001',5
union all select '002',7
go

--方法1,直接计算(用辅助表)
select a.Cp_No,a.Cp_Step
,Cp_Shl=1-a.Cp_Shl,b.finally_Sl
,Real_Sl=cast(null as numeric(18,2))
into T3
from T1 a,T2 b
where a.Cp_No=b.Cp_No
order by a.Cp_No,a.Cp_Step desc

--计算 Real_Sl 列
declare @id varchar(10),@sl numeric(18,4)
update T3 set @sl=case @id when Cp_no then @sl else finally_Sl end/Cp_Shl
,Real_Sl=@sl,@id=Cp_no

--显示处理结果
select Cp_No,Cp_Step,Real_Sl
from T3
order by Cp_No,Cp_Step
go

/*--测试结果

Cp_No      Cp_Step     Real_Sl
---------- ----------- ----------
001        1           8.17
001        2           7.35
001        3           6.25
002        1           11.76
002        2           8.24

（所影响的行数为 5 行）
--*/

--方法2,写自定义计算函数,实现直接出结果
--计算 Cp_Shl 的函数
create function f_calc(
@Cp_No varchar(10),
@Cp_Step int,
@finally_Sl int
)returns numeric(18,2)
as
begin
declare @r numeric(18,2)
set @r=@finally_Sl
select @r=@r/(1-Cp_Shl) from T1
where Cp_No=@Cp_No
and Cp_Step>=@Cp_Step
order by Cp_Step desc
return(@r)
end
go

--调用函数实现查询
select a.Cp_No,a.Cp_Step
,Real_Sl=dbo.f_calc(a.Cp_No,a.Cp_Step,b.finally_Sl)
from T1 a,T2 b
where a.Cp_No=b.Cp_No
go

/*--测试结果

Cp_No      Cp_Step     Real_Sl
---------- ----------- ----------
001        1           8.17
001        2           7.35
001        3           6.25
002        1           11.76
002        2           8.24

（所影响的行数为 5 行）
--*/

--删除测试
drop table T1,T2,T3
drop function f_calc

根据产品损耗率计算产品实际数量

2008-01-03 15:17:00

客户需求与实际产品之间的差异

2008-03-04 18:12:00

ecshop商品页显示累计销售量,ecshop显示商品销售总数量的方法

2016-06-10 10:33:02

流程制造项目中关于销售订单数量与实际产生数量不同时的解决方案

2011-03-14 18:05:00

SAP中五个报废率的计算逻辑

2013-01-03 16:16:56

php基于thinkphp的购物车--能够更改商品数量

2013-04-26 16:23:15

修改magento产品列表页每行显示的产品个数

2013-05-07 14:35:49

magento 根据分类ID或名称获取该分类下的子分类

2016-08-26 16:55:55

MRP计算原理

2008-02-27 20:49:00

Magento产品详情页获取产品的库存

2015-06-16 13:02:01