SQLServer樹形資料結構的資料進行資料統計

2022-08-26 23:21:24 字數 3522 閱讀 7477

前言

前幾天朋友問我,關於sqlserver資料庫中對樹形結構的表資料統計問題,需求大致如下:

分類表(遞迴資料),a的子分類是b,b的子分類是c……分類關係不間斷,a為第一層,b為第二層,c為第三層……需要統計「每個分類所在的層數」、「子分類的總數」和「子分類的層數」。

解決思路:

建立示例表結構,**如下:

--

分類示例表

create

table

temp_class

( classid

intprimary

keyidentity(1,1), --

分類id,主鍵,遞增

classname nvarchar(50), --

分類名稱

pcid int

default

0, --

父級分類id,0表示最頂層

ulevel int, --

層數 nextucount int, --

子分類的總數

nextlevelcount int

--子分類的層數

);--

層數字段新增索引

--create index ind_tempclass_ulevel on temp_class(ulevel);

--新增測試資料。。。。。。

步驟一:每個分類所在的層數

根據樹形資料結構的規律,在統計層數時,需要從最頂層向下累計,**如下:

--

1、更新層數(pcid=0 表示第一層)

--更新最頂層

declare

@iint

=1; --

第一層update temp_class set ulevel=

@iwhere pcid=0;

while(1=1

) begin

if(not

exists(select

top1

1from temp_class a where

exists(select

top1

1from temp_class b where b.ulevel=

@iand b.classid=

a.pcid)))

break; --

無下層資料,跳出迴圈

--更新下一層

update a set a.ulevel=@i+

1from temp_class a where

exists(select

top1

1from temp_class b where b.ulevel=

@iand b.classid=

a.pcid);

--增加一層

set@i=@i

+1;

end;

步驟二:子分類的總數

--

2、更新子分類的總數

--獲取最低層分類(最大的層數)

declare

@maxlevel

int=1;

select

@maxlevel

=max(ulevel) from

temp_class;

--更新最底層的子分類總數為 0

update temp_class set nextucount=

0where ulevel=

@maxlevel;--

從最底層向上累計子分類總數

while(1=1

) begin

set@maxlevel

=@maxlevel-1

;

if(@maxlevel

<=

0) --

層數走完,退出

break

;

--更新上一層的子分類的總數

update a set a.nextucount=

isnull(b.nextucount,0) from

temp_class a

left

join

--父級(本層)分類的個數=下一層中子分類的個數之和+下一層的分類數量

(select pcid,sum(nextucount)+

count(classid) nextucount from temp_class where ulevel=

@maxlevel+1

group

bypcid) b

on a.classid=

b.pcid

where a.ulevel=

@maxlevel;

end;

步驟三:子分類的層數

--

3、更新子分類的層數

--獲取最低層子分類(最大的層數)

declare

@maxlevel

int=1;

select

@maxlevel

=max(ulevel) from

temp_class;

--更新最底層的子分類層數為 0

update temp_class set nextlevelcount=

0where ulevel=

@maxlevel;--

從最底層向上累計層數

while(1=1

) begin

set@maxlevel

=@maxlevel-1

;

if(@maxlevel

<=

0) --

層數走完,退出

break

;

--更新上一層的子分類層數

update a set a.nextlevelcount=

isnull(b.nextlevelcount,0) from

temp_class a

left

join

--父級(本層)分類的層數=下一層中子分類的最大層數+1(當前子分類為 1 層)

(select pcid,(max(nextlevelcount)+

1) as nextlevelcount from temp_class where ulevel=

@maxlevel+1

group

bypcid) b

on a.classid=

b.pcid

where a.ulevel=

@maxlevel;

end;

查詢結果:

後言該隨筆僅當個人筆記所用,路過的大神如有好的建議,還請賜教,菜鳥再此感激不盡!

行資料結構轉成樹形資料結構

背景 在前後端開發過程中,後端負責提供介面資料,有時前端需要把介面資料轉成其他的格式,本文就用於將具備父子邏輯的行資料轉成樹形結構。如下 function rowdatatotreedata roottreenode,rowdata else i i 1 if roottreenode.childr...

樹形資料結構實現平鋪展示

後端返回的資料是樹形結構要實現這種類似平鋪樹的結構 基本思路 取出最後兩級,取出每一級的所有祖先節點 只獲取最後兩級得資料 lastleveldata data go el 遞迴 else function go item go child else if child.isbottomlevel s...

樹形資料結構複習 先 中 後序遍歷

1.已知按層遍歷和中序遍歷,匯出先序遍歷 樣例 中序遍歷 dbafegc 按層遍歷 abcdefg 演算法 掃瞄按層遍歷,按層遍歷的實質是按照節點深度,從左到右對同深度節點進行排序 因此,可以掃瞄整個按層遍歷,與當前中序遍歷所代表的樹進行匹配!在中序遍歷中掃瞄到的位於按層遍歷中的最前面的節點,就是當...