表MOCTB
工单单别      工单单号       材料品号       需领用量        已领用量
  TB001      TB002        TB003          TB004        TB005
510         0807110001      A             100          20
510         0807120004      A             200           0
510         0807170029      A             100          50
510         0806150009      B             200          100
510         0807110001      B             50            50
510         0807190004      C             100           10
510         0807180001      C             20            0表INVMB
品号信息          库存数量
MB001              MB064
A                    100
B                     50
C                     80
结果:
工单单别     工单单号      材料品号        欠料量
TB001       TB002          TB003          TB006
510          0807110001        A             0
510          0807120004        A             -180
510          0807170029        A             -50
510          0806150009        B             -50
510          0807110001        B             0
510          0807190004        C             -10
510          0807180001        C             -20请各位高手指点。。

解决方案 »

  1.   

    第一张工单 A 未领用量=需领用量-已领用量=80
              A 库存数量=100,这张工单不欠数,库存多出20
    第二张工单 A 未领用量=200
              A 库存量=20,工单欠数-180
    第三张工单 A 未领用量=50
              A 库存量=0,工单欠数-50
    下面不同品号计算是同样的方法
      

  2.   

    由于不知道你表MOCTB是按什么排序的,所以结果会有一点不同
    declare @MOCTB table (  TB001  int,    TB002 char(10),       TB003 char(1) ,        TB004 int,       TB005 int)
    --工单单别      工单单号      材料品号      需领用量        已领用量 
    insert into @moctb
    select 510,        '0807110001',      'A',            100,          20  union 
    select 510,        '0807120004',      'A',            200,          0 union 
    select 510,        '0807170029',      'A',            100,          50 union 
    select 510,        '0806150009',      'B',            200,          100 union 
    select 510,        '0807110001',      'B',            50  ,          50 union 
    select 510,        '0807190004',      'C',            100 ,         10 union 
    select 510,        '0807180001',      'C',            20   ,         0 declare @INVMB  table (MB001 char(1),              MB064 int)
    insert into @invmb 
    select 'A',                    100  union 
    select 'B',                    50 union
    select 'C',                    80 select c.tb001 as 单别,c.tb002 as 单号,c.tb003 as 材料,
             case when d.mb064>=c.tb006 then 0 
                     else case when c.tb006-d.mb064<tb004-tb005 then mb064-tb006 
                                    else tb005-tb004 
                           end 
             end as 欠料量
    from (select a.tb001,a.tb002,a.tb003,a.tb004,a.tb005,isnull(sum(b.tb004-b.tb005),0) as tb006
             from @moctb a
             left join @moctb b on a.tb003=b.tb003 and a.tb002>=b.tb002
             group by a.tb001,a.tb002,a.tb003,a.tb004,a.tb005
            ) c
    left join @invmb d on c.tb003=d.mb001
    order by tb001,tb003,tb002
    /*
    单别          单号         材料   欠料量
    ----------- ---------- ---- -----------
    510         0807110001 A    0
    510         0807120004 A    -180
    510         0807170029 A    -50
    510         0806150009 B    -50
    510         0807110001 B    0
    510         0807180001 C    0
    510         0807190004 C    -30(7 行受影响)
    */