【问题标题】:TSQL - Query to get count of items associated to each category and subcategoryTSQL - 查询以获取与每个类别和子类别关联的项目数
【发布时间】:2011-07-09 19:35:37
【问题描述】:

我有以下表格:

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 子句,但类别的分层性质似乎让我的逻辑不正常。

感谢您的帮助!

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

【问题讨论】:

    标签: sql tsql hierarchical-data categories


    【解决方案1】:

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

    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
    

    【讨论】:

    • 感谢您的回复! - 首先,我如何解释变量的使用? (我改为使用 c.CategoryID) - 那么这个查询似乎只为单个类别节点生成计数(它不考虑子节点),即在本例中,类别 1 的计数为 1。此外,加入似乎没有考虑没有任何关联项目的类别?我会更新我的问题:)
    • @Jaime:这澄清了你的问题 :) 我已经删除了变量。您可以使用left join 包含没有任何项目的类别。
    • 谢谢! :) 虽然现在似乎有一个奇怪的效果 - 它任意将所有类别的计数分配为 1,因此例如,具有 1 个关联项目(无子项)的类别的计数为 1,但类别与0 个项目也有 1 个计数?也许在类似的注释上 - 类别 1 的计数似乎显示为 4 而不是 3,我会尝试弄清楚,但它不会显示为其他人的答案,所以这个评论应该澄清事情:)
    • @Jaime:你用的是count(*)的版本吗?对于不匹配任何行的类别,这将返回 1count(distinct i.ItemID) 应该会更好。
    • 完美解决了 :) 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多