前幾天有個需求需要基於分類數據向上統計總數,一開始第一個想法是通過程式來計算,後再思考能不能通過SQL腳本直接來計算 基礎數據 | Id | ParentId | Category | Num | | | | | | | 1 | 0 | 分類1 | 0 | | 2 | 1 | 分類1-1 | 10 ...
前幾天有個需求需要基於分類數據向上統計總數,一開始第一個想法是通過程式來計算,後再思考能不能通過SQL腳本直接來計算
基礎數據
Id | ParentId | Category | Num |
---|---|---|---|
1 | 0 | 分類1 | 0 |
2 | 1 | 分類1-1 | 10 |
3 | 1 | 分類1-2 | 10 |
4 | 3 | 分類1-2-1 | 5 |
這是基礎數據,那麼希望通過sql腳本向上統計分類對應的數量.
期望結果
Id | Category | Num |
---|---|---|
1 | 分類1 | 25 |
2 | 分類1-1 | 10 |
3 | 分類1-2 | 10 |
4 | 分類1-2-1 | 5 |
思路
- 用sql遞歸CTE給每一個層次設置統計路徑
- 通過統計路徑內聯, 統計個數並分組展示
WITH result (Id, ParentId, Category, Num)
AS
(
SELECT 1, 0, '分類1', 0
UNION ALL
SELECT 2, 1, '分類1-1',10
UNION ALL
SELECT 3, 1, '分類1-2', 10
UNION ALL
SELECT 4, 3, '分類1-2-1', 5
),
CTE(Id, ParentId, Category, Path, Num)
As
(
SELECT A.Id, A.ParentId, A.Category, CAST(A.Id As VARCHAR(MAX))+'->',A.Num FROM result A WHERE A.ParentId = 0
UNION ALL
SELECT B.Id, B.ParentId, B.Category,C.Path+CAST(B.Id As VARCHAR(MAX)), B.Num FROM result B
INNER JOIN CTE c on C.Id = B.ParentId
)
SELECT C.Id,
C.Category,
SUM(C1.Num) AS Num
FROM CTE AS C
--整個統計方法的核心就是這一句代碼:CHARINDEX
INNER JOIN CTE AS C1 ON CHARINDEX(C.Path, C1.Path) = 1
GROUP BY C.ID,C.Category
參考
https://www.cnblogs.com/axiadi/p/7715529.html
博客地址: | http://www.cnblogs.com/sword-successful/ |
博客版權: | 本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接。 如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起討論,共同進步! 再次感謝您耐心的讀完本篇文章。 |