首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

MS-SQL 挑战一上吧!怎样处理这类有关问题,感觉无从上手啊求解

2012-12-22 
MS-SQL 挑战一下吧!怎样处理这类问题,感觉无从下手啊!求解本帖最后由 comcyd 于 2012-11-12 18:06:09 编辑

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


[其他解释]
类似于先进先出的例子,用游标做吧。
[其他解释]
【1】.订货单里产品数量小于库存数量则插入表C的该产品实发数量为库存数量(相当于库存扒空了),若库存充足,则实发数量即为订单数量,同时未发数量就等于当前产品数量减去实发数量。

小余库存,怎么库存还能扒空?是不是有点问题
[其他解释]
引用:
【1】.订货单里产品数量小于库存数量则插入表C的该产品实发数量为库存数量(相当于库存扒空了),若库存充足,则实发数量即为订单数量,同时未发数量就等于当前产品数量减去实发数量。

小余库存,怎么库存还能扒空?是不是有点问题
比喻的说明一下,应该是我说错了,我要表达的意思是所需要的大于库存,就取库存的数,然后库存就没有了,其实就不能插入了。
[其他解释]
引用:
一句sql差不多可以出来,吃饭先,随便写的,不对再自己改下
SQL code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152create table A (A01 varchar(04), A02 varchar(04),A03……

顶!
[其他解释]
引用:
类似于先进先出的例子,用游标做吧。

恩,不错!引导我找了一些资料看了一下。

热点排行