classid   parentid   childcount
37        0          2
38        37         2
43        37         2
39        38         2有这样的数据
每个类别下都有它自己的产品数量和它对应的父ID
如数据所示,38和43它的父ID是37,39它的父ID是38,所有类别的产品都默认为2现在要统计出每个类别包含所有其子类产品数的数量比如 38它有个子类39,拿他的产品数应该是 2(39) + 2(本身) = 4个
所以 37应该是 2(本身)+ 2(39) + 2(38) + 2(43) = 8个

解决方案 »

  1.   

    和这个一样
    ----CTE的综合应用USE tempdb
    GO-- 建立演示环境
    CREATE TABLE Dept(
     id int PRIMARY KEY, 
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 0, 0, N'<全部>' UNION ALL
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO-- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS AS(   -- 查询指定部门及其下的所有子部门
     -- 定位点成员
     SELECT * FROM Dept
     WHERE name = @Dept_name
     UNION ALL
     -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
     SELECT A.*
     FROM Dept A, DEPTS B
     WHERE A.parent_id = B.id
    ),
    DEPTCHILD AS(  -- 引用第1个CTE,查询其每条记录对应的部门下的所有子部门
     SELECT 
      Dept_id = P.id, C.id, C.parent_id
     FROM DEPTS P, Dept C
     WHERE P.id = C.parent_id
     UNION ALL
     SELECT 
      P.Dept_id, C.id, C.parent_id
     FROM DEPTCHILD P, Dept C
     WHERE P.id = C.parent_id
    ),
    DEPTCHILDCNT AS( -- 引用第2个CTE, 汇总得到各部门下的子部门数
     SELECT 
      Dept_id, Cnt = COUNT(*)
     FROM DEPTCHILD
     GROUP BY Dept_id
    )
    SELECT    -- JOIN第1,3个CTE,得到最终的查询结果
     D.*,
     ChildDeptCount = ISNULL(DS.Cnt, 0)
    FROM DEPTS D
     LEFT JOIN DEPTCHILDCNT DS
      ON D.id = DS.Dept_id
    GO-- 删除演示环境
    DROP TABLE Dept本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2009/09/19/4569529.aspx
      

  2.   

    BOM逐级向上汇总应用实例http://blog.csdn.net/htl258/archive/2009/09/11/4542700.aspx
      

  3.   

    /*
    *************************************
    *   T-MAC 小编                      *
    *        -->努力成长中              *
    *        -->梦想DBA                 *
    *************************************
    */
    if OBJECT_ID('tb') is not null
    drop table tb 
    go
    create table tb (classid int,parentid int,childcount int)
    insert tb select
    37, 0 ,2 union select 
    38, 37, 2 union select 
    43, 37, 2 union select 
    39, 38, 2
    go
    with cte as
    (
    select *,[path]=CAST(classid as varchar(1000)) from tb where parentid=0
    union all
    select tb.*, cast(cte.path+','+rtrim(tb.classid) as varchar(1000)) from  tb join cte on tb.parentid=cte.classid
    )
    select a.classid,SUM(b.childcount) 
    from cte a join cte b on CHARINDEX(a.path,b.path)>0 
    group by  a.classid
    /*
    classid     
    ----------- -----------
    37          8
    38          4
    39          2
    43          2*/
      

  4.   

    2楼得出来的结果是
    6 4 MIS 3
    7 6 UI 0
    8 6 软件开发 1
    9 8 内部开发 0ID = 6的是3,
    我要的结果应该是1
    因为7和9都是0,只有8有1个
    所以结果应该是1才是我要的
      

  5.   

    with cte as
    这个用法没用过,不过根据你的思想,问题解决了
    3Q