现有表 T1(Pid,subPid,Quantity)
pid int :零件编号
subpid int : 子零件编号
Quantity : 数量数据
pid  subpid  Quantity
102   104     2
102   105     2
104   106     3
104   109     1
105   107     3
107   108     1这个表,表示 102 这个零件有哪些子零件组成。数量要多少
用树型表示就是 102
    |- 104
         |- 106
         |- 109
    |- 105
         |- 107
             |- 108要求,我给出一个 102 
得到结果如下
最小单位
     零件编号 个数
       106      6
       109      2
       108      6

解决方案 »

  1.   

    select distinct subpid  from T1
    where subpid  not in
    (SELECT DISTINCT pid  from T1)
      

  2.   

    不好写!我觉得你的数据库设计的不是很好! 改变一下结构要好写些!可以再tree上先显示出来!然后逐个得到叶子节点,再统计个数!
      

  3.   

    请问 hmzgz81(哩翱)  你觉得数库怎么设计好,现在数量库已经这样了,且数据量很大应该怎么解决。
      

  4.   


    由子零件去指向其父零件, ID(零件ID)
    PID(父零件ID)(若为根则为0)
    Quantity(个数)
      

  5.   

    CREATE FUNCTION [dbo].[FindOwner] (@subpid int)  
    RETURNS int AS  
    BEGIN 
    declare @pid int,@tempid int
    set @pid=(select pid from testtb where subpid=@subpid)
    if @pid is not NULL
    set @tempid=dbo.FindOwner(@pid)
    else
    set @tempid=@subpid
    return @tempid
    ENDCREATE PROCEDURE [dbo].[CalcQuantity] @pid int AS
    select subpid as pid,sum(Quantity) as SumQuantity 
    from testtb 
    where dbo.FindOwner(subpid)=@pid 
    group by subpid
    GO--最后执行为
    exec CalcQuantity 102
      

  6.   

    先按照pid  subpid汇总然后现在一个父接点在将其子接点显示出来就可以啦
    Select pid  subpid ,Sum(Quantity) From T1 group by pid  subpid 
    现在接点的时候过滤以下就OK了,一次汇总总比你没现在选择一个接点调用一次存储过程执行效率高吧
      

  7.   

    SELECT * FROM CPWLQD CONNECT BY prior cpid=fcpid START WITH cpid =" & QuotedStr(Treemain.SelectedNode.DataKey) & " ORDER BY LEVEL,CPXH"
    --
    oracle实现
    select Pid,subPid,Quantity from T1 CONNECT BY prior subPid=Pid START WITH Pid =102你下次问问题时,最好说用什么数据库