表结构:
父物料编号 父物料版本 子物料编号  子物料版本 父物料数量   子物料数量      
 A            1           B          1            1            2
 A            1           C          1            1            1
 B            1           Z          1            1            2.5
 C            1           Z          1            1            3.5      
 B            1           M          1            1            3.2
 C            1           M          1            1            1.9
需要根据输入的父物料编号和版本及数量,查询最终物料M和Z的数量!
能否快速的计算出来啊!

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/5429/5429535.xml?temp=.7268946
      

  2.   

    create table ta(
    父物料编号 varchar(5),
    父物料版本 int, 
    子物料编号 varchar(5),
    子物料版本 int,
    父物料数量 int,子物料数量 decimal(15,2))
    insert ta select   'A',            1,           'B',          1,            1,            2
    insert ta select   'A',            1,           'C',          1,            1,            1
    insert ta select   'B',            1,           'Z',          1,            1,            2.5
    insert ta select   'C',            1,           'Z',          1,            1,            3.5      
    insert ta select   'B',            1,           'M',          1,            1,            3.2
    insert ta select   'C',            1,           'M',          1,            1,            1.9create function (@父物料编号 varchar(5),@父物料版本 int)
    returns @ta table(父物料编号 varchar(5),
    父物料版本 int, 
    子物料编号 varchar(5),
    子物料版本 int,
    父物料数量 int,
    子物料数量 decimal(15,2)
    ,lev int)
    as
    begin
    declare @i int,@j decimal(15,2)
    set @i=1
    insert @ta select *,@i from ta where 父物料编号=@父物料编号 and 父物料版本=@父物料版本
    while @@rowcount>0
        begin
            set @i=@i+1
            insert @ta select ta.*,@i from ta join @ta a 
            where ta.父物料编号=a.子物料编号 and ta.父物料版本=a.子物料版本 and lev=@i-1
        end
    return
    end
    --测试:
    select * from dbo.test_f('A',1)--楼主求合计就行了父物料编号 父物料版本       子物料编号 子物料版本       父物料数量       子物料数量                                   lev
    ----- ----------- ----- ----------- ----------- --------------------------------------- -----------
    A     1           B     1           1           2.00                                    1
    A     1           C     1           1           1.00                                    1
    B     1           Z     1           1           2.50                                    2
    B     1           M     1           1           3.20                                    2
    C     1           M     1           1           1.90                                    2
    C     1           Z     1           1           3.50                                    2(6 行受影响)
      

  3.   

    --测试:
    select * from dbo.test_f('b',1)--楼主求合计就行了父物料编号 父物料版本       子物料编号 子物料版本       父物料数量       子物料数量                                   lev
    ----- ----------- ----- ----------- ----------- --------------------------------------- -----------
    B     1           Z     1           1           2.50                                    1
    B     1           M     1           1           3.20                                    1(2 行受影响)
      

  4.   

    select 子物料编号,[父物料版本]=sum(父物料版本),[子物料数量]=sum(子物料数量) 
    from dbo.test_f('b',1) group by 子物料编号
    --楼主求合计就行了子物料编号 父物料版本       子物料数量
    ----- ----------- ---------------------------------------
    M     1           3.20
    Z     1           2.50(2 行受影响)
      

  5.   

    一个简单的递归取叶子节点及计算数量的例子:
    ---------------------------------------------------------------
    --生成测试数据
    create table BOM(ID INT,PID INT,NUM INT)
    insert into BOM select 1,0,1
    insert into BOM select 2,1,2
    insert into BOM select 3,1,3
    insert into BOM select 4,2,2
    insert into BOM select 5,3,1
    insert into BOM select 6,5,2
    insert into BOM select 7,6,1
    go--创建用户定义函数
    create function f_getChild(@ID VARCHAR(10))
    returns @t table(ID VARCHAR(10),PID VARCHAR(10),NUM INT,Level INT)
    as
    begin
        declare @i int,@ret varchar(8000)
        set @i = 1
        insert into @t select ID,PID,NUM,@i from BOM where PID = @ID
        
        while @@rowcount<>0
        begin
            set @i = @i + 1
            
            insert into @t 
            select 
                a.ID,a.PID,a.NUM*B.NUM,@i 
            from 
                BOM a,@t b 
            where 
                a.PID=b.ID and b.Level = @i-1
        end
        
        delete t from @t t where exists(select 1 from @t where PID=t.ID)
        
        return
    end
    go--执行查询
    select ID,NUM from dbo.f_getChild(1)
    go--输出结果
    /*
    ID         NUM         
    ---------- ----------- 
    4          4
    7          6
    */--删除测试数据
    drop function f_getChild
    drop table BOM