カテゴリの階層を作成するこのクエリがあります。それはうまくいきます。今、深さに基づいて表示順序を制御しようとしています。たとえば、「猫」というカテゴリがあります。「Sub Cat 1」と「Sub Cat 2」という 2 つのサブカテゴリがあります。サブカテゴリを表示順序と深さで並べ替えることはできますか? したがって、順序は、表示順序に基づいて、「Sub Cat 2」、「Sub Cat 1」の順になります。Depth と Display Order の位置に基づいて、カテゴリの順序を制御できるようにしたいと考えています。
これが私のクエリです:
DECLARE @CategoryID INT;
DECLARE @ExcludeInactive BIT;
SET @CategoryID = 2;
SET @ExcludeInactive = 0;
Declare @Categories Table
(
ID INT,
Name VARCHAR(500),
ParentID INT,
Depth INT,
Active BIT,
DisplayOrder INT
);
INSERT INTO @Categories
SELECT 2, 'Main', 0, 0, 1, 0
UNION ALL
SELECT 6, 'Cat', 2, 0, 1, 0
UNION ALL
SELECT 13, 'Sub Cat 1', 6, 1, 1, 2
UNION ALL
SELECT 14, 'Sub Cat 2', 6, 1, 1, 1
UNION ALL
SELECT 5, 'Cat 2', 2,0, 1, 0
UNION ALL
SELECT 15, 'Sub Cat 1', 5, 1, 1, 2
UNION ALL
SELECT 16, 'Sub Cat 2', 5, 1, 1, 1;
WITH Tree (ID, Name, ParentID, Depth, Sort, Active, DisplayOrder) AS
(
SELECT ID, Name, ParentID, 0 AS Depth, CONVERT(varchar(255), Name) AS Sort, Active, DisplayOrder
FROM @Categories
WHERE ParentID = @CategoryID
UNION ALL
SELECT CT.ID, CT.Name, CT.ParentID, Parent.Depth + 1 AS Depth,
CONVERT(varchar(255), Parent.Sort + ' > ' + CT.Name) AS Sort, CT.Active, CT.DisplayOrder
FROM @Categories CT
INNER JOIN Tree as Parent ON Parent.ID = CT.ParentID WHERE (@ExcludeInactive = 0 OR (CT.Active = 1 ))
)
SELECT ID, Name, ParentID, Depth, Sort, Active, DisplayOrder FROM Tree ORDER BY SORT
現在の出力:
ID Name ParentID Depth Sort Active DisplayOrder
6 Cat 2 0 Cat 1 2
13 Sub Cat 1 6 1 Cat > Sub Cat 1 1 2
14 Sub Cat 2 6 1 Cat > Sub Cat 2 1 1
5 Cat 2 2 0 Cat 2 1 1
15 Sub Cat 1 5 1 Cat 2 > Sub Cat 1 1 2
16 Sub Cat 2 5 1 Cat 2 > Sub Cat 2 1 1
望ましい出力:
ID Name ParentID Depth Sort Active DisplayOrder
5 Cat 2 2 0 Cat 2 1 1
16 Sub Cat 2 5 1 Cat 2 > Sub Cat 2 1 1
15 Sub Cat 1 5 1 Cat 2 > Sub Cat 1 1 2
6 Cat 2 0 Cat 1 2
14 Sub Cat 2 6 1 Cat > Sub Cat 2 1 1
13 Sub Cat 1 6 1 Cat > Sub Cat 1 1 2