MS-SQL 挑战一下吧!怎样处理这类问题,感觉无从下手啊!求解
本帖最后由 comcyd 于 2012-11-12 18:06:09 编辑 直入主题请看下文:
描述有点过于详细,表文并茂,请耐心看完(感觉像写很烂的小说),有类似经验的看一遍就知道意思啦:
1、表A订单表:
A01[订单号] | A01[产品编号] | A02[订单数量]
--------------------------------------------------
M01 | P01 | 100
M01 | P02 | 200
M01 | P03 | 50
M02 | P01 | 200
M02 | P02 | 200
M03 | P01 | 100
M03 | P02 | 200
...
2、表B库存表:
B01[产品编号] | B02[库存数量]
---------------------------------
P01 | 200
P02 | 400
P03 | 300
...
3、表C发货单表:
C01[订货单号] | C02[产品编号] | C03[订单数量] | C04[实发数量] | C05[未发数量] | C06[主键]
--------------------------------------------------------
现在想结合表A和表B来产生表C,动态库存联合检测,然后依次插入到表C中,比如上面我要把A表中的三张订货单产生发货单,逻辑描述:
【1】.订货单里产品数量小于库存数量则插入表C的该产品实发数量为库存数量(相当于库存扒空了),若库存充足,则实发数量即为订单数量,同时未发数量就等于当前产品数量减去实发数量。
【2】.若C表插入了一条产品记录,继续再插入另一张订货单里的相同产品的时候,就要结合C表发货单表里已插入的产品记录实发数量再结合库存表综合判断。
比如C表已有一条订货单M01记录:
C01[订货单号] | C02[产品] | C03[订单数量] | C04[实发数量] | C05[未发数量] | C06[主键]
----------------------------------------------------------
M01 P01 100 100 0 k01
M01 P02 200 200 0 k02
M01 P03 50 50 0 k03
当我继续再插入第二张订货单M02时(有P1和P2两种产品),需先在C表中汇总计算出P1已发了100件(那时库存充足),P1库存还有200-100=100件,P2发了200件(那时库存也充足),P2库存还有400-200=200件,那么我插入第二张订货单里的P1时,发现订单所需要数量200>库存数量100,库存不够,则实发数量就只能取库存里的100,未发数量即为100-200=-100。其它产品同理。
当插入第三张订货单时,经判断此时P1库存为200-100-100=0件,所以这时就不插入到C表中了,其它依次类推。
提示:库存表B是在这个过程中不作实际修改,库存量的判断也是通过逻辑判断然后再去插入表C的。
针对上面三张订货单,最后表C的实际效果如下:
C01[订货单号] | C02[产品] | C03[订单数量] | C04[实发数量] | C05[未发数量] | C06[主键]
-------------------------------------------------------
M01 P01 100 100 0 k01
M01 P02 200 200 0 k02
M01 P03 50 50 0 k03
M02 P01 200 100 100 k04
M02 P02 200 200 0 k05
M03 P01 50 50 0 k04
说明:由于在插入第三张订货单M03时,P02库存已为0,所以不插入,只有P01符合,所以插入进来了。
想把这个过程用存储过程来实现,等待大牛们献策啊
[最优解释]
一句sql差不多可以出来,吃饭先,随便写的,不对再自己改下
create table A (A01 varchar(04), A02 varchar(04),A03 int)
insert into A select 'M01','P01',100
insert into A select 'M01','P02',200
insert into A select 'M01','P03',50
insert into A select 'M02','P01',200
insert into A select 'M02','P02',200
insert into A select 'M03','P01',100
insert into A select 'M03','P02',200
insert into A select 'M04','P04',100
create table B(B01 varchar(04), B02 int)
insert into B select 'P01',200
insert into B select 'P02',400
insert into B select 'P03',300
GO
;with cte_A
as
(select A.*, id=row_number() over (order by getdate())
from A
)
,result_1
as
(
Select A01 as C1,A02 as C2,A03 as C3,
[C4] = case when (select sum(A03) from cte_A where A02=T.A02 and id<=T.id) <= isnull((select sum(B02) from B where B01=T.A02),0)
then A03
else case when isnull((select sum(A03) from cte_A where A02=T.A02 and id<T.id),0) <= isnull((select sum(B02) from B where B01=T.A02),0)
then isnull((select sum(B02) from B where B01=T.A02),0)-isnull((select sum(A03) from cte_A where A02=T.A02 and id<T.id),0)
else 0
end
end
from cte_A as T
)
select C1,C2,C3,C4,C5=C3-C4
from result_1
/*
M01P011001000
M01P022002000
M01P0350500
M02P01200100100
M02P022002000
M03P011000100
M03P022000200
M04P041000100
*/
drop table A,B