前幾天有個需求需要基于分類資料向上統計總數,一開始第一個想法是通程序式來計算,后再思考能不能通過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/ |
| 博客著作權: | 本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接, 如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟,如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起討論,共同進步! 再次感謝您耐心的讀完本篇文章, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/501218.html
標籤:SQL Server
上一篇:Redis 定長佇列的探索和實踐
下一篇:有趣的特性:CHECK約束
