问题描述:
实现对商品信息的分类,分类的同时生成一个序号。
序号的规则就是取他所属的类的序号+同一类别的排序号)
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都是空的。

解决方案:

–测试数据

程序代码 程序代码
Create TABLE t(classid varchar(3),fatherid varchar(3),classname nvarchar(10),scblevel varchar(20))
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)

*/

posted on 2010-04-08 10:54  gaojier  阅读(126)  评论(0编辑  收藏  举报