TSQL - запрос для получения количества элементов, связанных с каждой категорией и подкатегорией - PullRequest
3 голосов
/ 09 июля 2011

У меня есть следующие таблицы:

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, различные группы по предложениям, но иерархическая природа категорий, кажется, отбрасывает мою логику.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: запрос также должен учитывать категории без элементов, связанных с ними

1 Ответ

3 голосов
/ 09 июля 2011

Вы должны объединить элементы в категории и сгруппировать по любым полям из таблицы категорий:

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
...