SQL - 查询以获取与每个类别和子类别关联的项目的计数

时间:2011-07-09 19:35:38

标签: sql tsql hierarchical-data categories

我有以下表格:

Categories
=================================
CategoryID |   ParentID   | Text 
---------------------------------
     1           NULL       Text
     2            1         Text
     3           NULL       Text
     4            1         Text

Items
=================================
  ItemID  |  CategoryID  | Text
---------------------------------
     1           1         Text
     2           2         Text
     3           4         Text
     4           3         Text

请记住,这不是一个n级层次结构,类别只有2个级别,因此例如,没有类别的parentID为2。

我正在寻找的方法是使用额外的列返回类别,该列显示该类别拥有的项目数(包括其子类别)。

即。我正在寻找一个可以返回如下内容的单个查询(或过程):

      Categories
============================================
CategoryID |   ParentID   | Text  |  Count
--------------------------------------------
     1           NULL       Text      3
     2            1         Text      1
     3           NULL       Text      1
     4            1         Text      1

我目前获取与某个类别相关联的项目的方法如下(给定categoryID,@ CategoryID):

SELECT * FROM Items
WHERE CategoryID 
IN (SELECT CategoryID FROM Categories where ParentID = @CategoryID or CategoryID = @CategoryID)

我的问题是我似乎无法将此链接与类别本身的选择查询相关联。 它可能非常简单,但我尝试过使用CTE的方法,各种group by子句,但类别的层次性似乎让我的逻辑失去了。

感谢您的帮助!

编辑:查询还需要考虑没有与之关联的项目的类别

1 个答案:

答案 0 :(得分:3)

您必须将项目加入类别,并从类别表中分组您需要的任何字段:

SELECT  c.CategoryID
,       c.ParentID
,       c.Text
,       count(distinct i.ItemID)
FROM    Categories c
LEFT JOIN
        Categories c2
ON      c.CategoryID = c2.ParentID
LEFT JOIN    
        Items i
ON      i.CategoryID = c.CategoryID
        or i.CategoryID = c2.CategoryID
GROUP BY
        c.CategoryID
,       c.ParentID
,       c.Text