Hãy thử điều này:
;WITH items AS (
SELECT EstimateItemID, ItemType
, 0 AS Level
, CAST(EstimateItemID AS VARCHAR(255)) AS Path
FROM EstimateItem
WHERE ParentEstimateItemID IS NULL AND EstimateID = @EstimateID
UNION ALL
SELECT i.EstimateItemID, i.ItemType
, Level + 1
, CAST(Path + '.' + CAST(i.EstimateItemID AS VARCHAR(255)) AS VARCHAR(255))
FROM EstimateItem i
INNER JOIN items itms ON itms.EstimateItemID = i.ParentEstimateItemID
)
SELECT * FROM items ORDER BY Path
Với Path
- các hàng được sắp xếp theo các nút cha mẹ
Nếu bạn muốn sắp xếp các mã con theo ItemType
cho mỗi cấp độ, bạn có thể chơi với Level
và SUBSTRING
của Path
cột ....
Đây SQLFiddle với mẫu dữ liệu