【发布时间】:2011-05-28 23:05:09
【问题描述】:
我正在尝试基于遵循此设计的分层表创建动态导航:
CREATE TABLE #CPTree (UID int, ParentID int, Name nvarchar(150), ItemCount int)
插入 #CPTree 值('1'、'0'、'Vehicles'、'0')
插入 #CPTree 值('2'、'1'、'Bikes'、'10')
插入 #CPTree 值('3'、'1'、'Cars'、'20')
插入 #CPTree 值('5'、'2'、'Bike Make 1'、'0')
插入 #CPTree 值('6'、'2'、'Bike Make 2'、'5')
INSERT INTO #CPTree 值(“7”、“3”、“汽车制造商 1”、“0”)
插入 #CPTree 值(“8”、“3”、“汽车制造商 2”、“0”)
插入 #CPTree 值('9'、'5'、'Bike Model A'、'7')
插入 #CPTree 值('10'、'5'、'Bike Model B'、'1')
INSERT INTO #CPTree 值('11'、'7'、'Car Model D'、'4')
INSERT INTO #CPTree 值('12'、'8'、'Car Model X'、'2')
--使用 CTE 检索类别/子类别的级别
;with HCTE(CategoryID, ParentID, Name, itemcount, Level) as (select UID, ParentID, Name, itemcount, 0 as Level from #CPTree c where c.UID = 3 -- 汽车类别
union all select c.UID, c.ParentID, c.Name, c.itemcount, ch.Level + 1 from #CPTree c inner join HCTE ch on ch.CategoryID = c.ParentID )
从 HCTE 中选择 *
删除表#CPTree
--结束
我想检索每个类别的总项目数,例如顶级类别“汽车”(项目数 20)有 2 个孩子(两个项目数均为 0),并且每个都有孩子(2 和恭敬地计算 4 项)。 Cars 的总项目数为 26。同样,Car Make 1(CategoryID 7)的总项目数为 4(其子项的总和 - CategoryID 11)。结果将返回:
类别 ID |家长 ID |姓名 |项目计数 |水平 | 项目总数
3 | 1 |汽车 | 20 | 0 | 26
7 | 3 |汽车制造 1 | 0 | 1 | 4
8 | 3 |汽车制造2 | 0 | 1 | 2
12 | 8 | X 型车 | 2 | 2 | 2
11 | 7 |车型 D 4 | 2 | 4
这将使我能够查看子类别是否在其子类别中包含任何项目,但不一定它们本身是否有任何项目。我的活动表有很多级别,因此查询必须继续钻取类别,直到达到最后一个级别。如有必要,我可以提供更深入的示例。
感谢任何帮助!谢谢
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql