问题描述:
实现对商品信息的分类,分类的同时生成一个序号。
序号的规则就是取他所属的类的序号+同一类别的排序号)
scb_subject
classid classname fatherid scblevel
1 蔬菜 -1 01
2 茄子 1 0101
3 白菜 1 0102
4 萝卜 1 0103
5 布匹 -1 02
6 服装 5 0201
7 女装 6 020101
8 女上衣 7 02010101
9 男装 6 020102
如果现在表里面的scblevel都是空的。
解决方案:
–测试数据
Insert t Select ‘1′,’-1′ ,’蔬菜’,null
UNION ALL Select ‘2′,’1′ ,’茄子’,null
UNION ALL Select ‘3′,’1′ ,’白菜’,null
UNION ALL Select ‘4′,’1′ ,’萝卜’,null
UNION ALL Select ‘5′,’-1′ ,’布匹’,null
UNION ALL Select ‘6′,’5′ ,’服装’,null
UNION ALL Select ‘7′,’6′ ,’女装’,null
UNION ALL Select ‘8′,’7′ ,’女上衣’,null
UNION ALL Select ‘9′,’6′ ,’男装’,null
–深度排序显示处理
–生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(classid varchar(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
Insert @t_Level Select classid,@Level,’0′+classid
FROM t
Where fatherid = -1
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
Insert @t_Level Select a.classid,@Level,b.Sort+’0′+a.classid
FROM t a,@t_Level b
Where a.fatherid=b.classid
AND b.Level=@Level-1
END
—先更新原表的scblevel编号
update t
set scblevel=A.Sort
from T inner join (
Select top 100 PERCENT a.classid,b.Sort,a.classname
FROM t a,@t_Level b
Where a.classid=b.classid
orDER BY b.Sort) A on T.classid=A.classid
—重新排列scblevel编号
Update T SET
scblevel=’0′+RIGHT(–重排第一层编码
(Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel
AND LEN(scblevel)=2),2)
+CASE –重排第二层编码
WHEN LEN(scblevel)>2
THEN RIGHT(100+
(Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel
AND scblevel LIKE LEFT(a.scblevel,2)+’__’),2)
ELSE ” END
+CASE –重排第三层编码
WHEN LEN(scblevel)>4
THEN RIGHT(100+
(Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel
AND scblevel LIKE LEFT(a.scblevel,4)+’__’),2)
ELSE ” END
+CASE –重排第四层编码
WHEN LEN(scblevel)>6
THEN RIGHT(100+
(Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel
AND scblevel LIKE LEFT(a.scblevel,4)+’__’),2)
ELSE ” END
+CASE –重排第五层编码
WHEN LEN(scblevel)>8
THEN RIGHT(100+
(Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel
AND scblevel LIKE LEFT(a.scblevel,4)+’__’),2)
ELSE ” END
FROM T a
–显示处理结果
Select * FROM T
drop table T
/*
classid fatherid classname scblevel
——- ——– ———- ——————–
1 -1 蔬菜 01
2 1 茄子 0101
3 1 白菜 0102
4 1 萝卜 0103
5 -1 布匹 02
6 5 服装 0201
7 6 女装 020101
8 7 女上衣 02010101
9 6 男装 020102
(9 row(s) affected)
*/