本文介绍了如何从一个包含功能、功能分组、模块和领域信息的二维表数据中,通过SQL查询和数据处理步骤,生成一个功能分布的树状图。首先,通过SQL查询获取所有功能及其所属分组、模块和领域的信息,并存储在临时表#tmp001中。然后,提出了两种方案来转换这些数据为树形结构,最终选择了一种按层次插入的方法,通过分组和插入新行来构建树状图的层次结构。具体步骤包括处理fname3、fname2和fname1,分别为它们添加特定的前缀以表示不同的层级,并调整序号以确保正确的层级顺序。最终,通过查询临时表#tmp001,得到了符合预期的树状图数据。
场景是这样子的,进入星空,我们看到功能是这样分布的:
领域-模块-功能分组-功能,那么我们要如何获得这个功能分布的树状图呢?
第一步:获取所有功能及功能所属分组、所属模块、所属领域
--二维表数据 select ROW_NUMBER() over (order by g2.FSEQ,f.FSEQ,c2.FSEQ,c.fname,a.FSEQ)*10 fseq, g.FNAME FNAME1, e.FNAME FNAME2,c.FNAME FNAME3,b.FNAME FNAME4 into #tmp001 from T_META_CONSOLEDETAIL a join T_META_CONSOLEDETAIL_L b on a.FDETAILFUNCID=b.FDETAILFUNCID and FLOCALEID=2052 join T_META_CONSOLESUBFUNC_L c on c.FLOCALEID=2052 and a.FSUBFUNCID=c.FSUBFUNCID join T_META_CONSOLESUBFUNC c2 on c.FSUBFUNCID=c2.FSUBFUNCID join T_META_OBJECTTYPE d on a.FOBJECTID=d.FID join T_META_SUBSYSTEM_L e on d.FSUBSYSID=e.FID and e.FLOCALEID=2052 join T_META_SUBSYSTEM f on e.FID=f.FID join T_META_TOPCLASS_L g on f.FTOPCLASSID=g.FTOPCLASSID join T_META_TOPCLASS g2 on g.FTOPCLASSID=g2.FTOPCLASSID order by g2.FSEQ,f.FSEQ,c2.FSEQ,c.FNAME,a.FSEQ select * from #tmp001 order by fseq
结果如图:
第二步:转换方案
按照树形图的方式,应该是这样子的展示方式:
财务会计
总账
基础资料
促销费用项目
总账工作台
总账数字看板
总账初始化指引工作台
凭证管理
......
即fname1、fname2、fname3、fname4按特定顺序排列。
第一个想法是按照游标进行处理,按顺序遍历每一行,使用八个变量,分别存储最新行的fname和上一行的fname。每一次遍历,从fname1对应的变量开始比较,当前行fname1和上一行fname1不同,则写入fname1和后面的fname2、fname3、fname4,如果当前行fname1和上一行fname1相同,则比较fname2,处理方式类似fname1,直到比较完fname4。
感觉实现很麻烦,换种方式。
第二种想法是按层次插入。
一上面临时表#tmp001为基础,第四列就是我们要的数据,目前只有最明细的功能。
对 FNAME1,FNAME2,FNAME3进行分组,将分组后的fname3结果插入进去,同时确保新插入#tmp001的序号fseq小于分组中最小序号,这样fname3作为分组就会排在该分组的fname4的前面;fname2,fname1以此类推。
这样不要简单太多!
第三步:处理fname3
--填充fname3 insert into #tmp001(fseq,FNAME1,FNAME2,FNAME3,FNAME4) select min(fseq)-1 fnewseq, FNAME1,FNAME2,FNAME3,'【三级标题】'+FNAME3 from #tmp001 group by FNAME1,FNAME2,FNAME3 order by fnewseq select * from #tmp001 order by fseq
结果如图:关注fname4列,是我们的目标数据,结果符合预期
第四步:处理fname2、fname1
--填充fname2 insert into #tmp001(fseq,FNAME1,FNAME2,FNAME3,FNAME4) select min(fseq)-1,FNAME1,FNAME2,'','【二级标题】'+FNAME2 from #tmp001 group by FNAME1,FNAME2 --填充fname1 insert into #tmp001(fseq,FNAME1,FNAME2,FNAME3,FNAME4) select min(fseq)-1,FNAME1,'','','【一级标题】'+FNAME1 from #tmp001 group by FNAME1 select * from #tmp001 order by fseq
结果就出来了
推荐阅读