数据库操作之——二维表如何按树状展开原创
金蝶云社区-i求知若渴
i求知若渴
23人赞赏了该文章 876次浏览 未经作者许可,禁止转载编辑于2022年09月03日 16:09:11
summary-icon摘要由AI智能服务提供

本文介绍了如何从一个包含功能、功能分组、模块和领域信息的二维表数据中,通过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

结果如图:

image.png

第二步:转换方案

按照树形图的方式,应该是这样子的展示方式:

财务会计

     总账

           基础资料

                  促销费用项目

            总账工作台

                  总账数字看板

                   总账初始化指引工作台

             凭证管理

                   ......

即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列,是我们的目标数据,结果符合预期

1662190258000.png

第四步:处理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

image.png

结果就出来了


赞 23