Я пытаюсь создать динамическую навигацию на основе иерархической таблицы, которая выглядит следующим образом:
CREATE TABLE #CPTree (UID int, ParentID int, Name nvarchar (150),
ItemCount int)
INSERT INTO #CPTree VALUES ('1', '0', 'Vehicles', '0')
INSERT INTO #CPTree VALUES ('2', '1', 'Bikes', '10')
INSERT INTO #CPTree VALUES ('3', '1', 'Cars', '20')
INSERT INTO #CPTree Значения ('5', '2', 'Bike Make 1', '0')
INSERT INTO #CPTree Значения ('6', '2', 'Bike Make 2', '5')
INSERT INTO #CPTree Значения ('7', '3', 'Car Make 1', '0')
INSERT INTO #CPTree Значения ('8', '3', 'Car Make 2', '0')
INSERT INTO #CPTree Значения («9», «5», «Модель велосипеда A», «7»)
INSERT INTO #CPTree Значения («10», «5», «Модель B велосипеда», «1»)
INSERT INTO #CPTree Значения («11», «7», «Модель автомобиля D», «4»)
INSERT INTO #CPTree Значения («12», «8», «Модель автомобиля X», «2»)
- Получить уровень категории / дочерних категорий с помощью CTE
; с HCTE (CategoryID, ParentID, Name, itemcount, Level) как (выберите
UID, ParentID, Name, itemcount, 0 как уровень от #CPTree c, где c.UID
= 3 - Категория авто
объединить все выбрать c.UID, c.ParentID, c.Name, c.itemcount, ch.Level + 1
из #CPTree c внутренним соединением HCTE ch на ch.CategoryID = c.ParentID)
ВЫБРАТЬ * ИЗ HCTE
DROP TABLE # CPTree
- конец
Я хотел бы получить общее количество элементов для каждой категории, например, категория «Автомобили» верхнего уровня (количество элементов 20) имеет 2 детей (количество элементов 0 для обоих), и у каждого из них есть дети (2 и 4 пункта считаются с уважением). Общее количество предметов для Автомобилей будет равно 26. Аналогично, общее количество предметов для Автомобиля Марка 1 (CategoryID 7) будет равно 4 (сумма от его ребенка - CategoryID 11). Результат вернет это:
Это позволит мне увидеть, есть ли в подкатегориях какие-либо элементы в их подкатегориях, но не обязательно, если у них есть какие-либо элементы сами. Моя живая таблица имеет много уровней, поэтому в запросе нужно будет продолжать детализировать категории, пока он не достигнет последнего уровня. При необходимости могу привести более глубокий пример.