关于#sql#的问题,如何解决?

需要按照格式查询数据,sql能力有限,请教专家。
试过left join,right join,最后的效果达不到要求

img

表结构贴一下

with cte(上级编号,本级编号,一级) as
(
    select 上级编号,本级编号, 本级名称 as 一级
    from dbo.ttt
    where 上级编号 = '0'
    union all
    select t1.上级编号, t1.本级编号, cte.一级 as 一级
    from dbo.ttt t1
    inner join cte
        on t1.上级编号 = cte.本级编号
)
select c.一级,
case 
    when len(本级编号) >2 and len(本级编号) <=4
        then (select 本级名称 from dbo.ttt t2 where t2.本级编号 = c.本级编号 )
    when len(本级编号) >=6
        then (select 本级名称 from dbo.ttt t2 where t2.本级编号 = c.上级编号 )
    else ''
end as 二级,
case when len(本级编号) >=6
    then (select 本级名称 from dbo.ttt t2 where t2.本级编号 = c.本级编号 )
    else ''
end as 三级
from cte c order by len(上级编号),上级编号,本级编号;

img

纯sql不好处理,一般都是查询到数据,然后后端递归处理成树结构。

1.根据上级编号的长度把数据分为3堆(1,2,3级):length(上级编号)
2.分别取三部分数据 UNION ALL
part 1 :单取一级,二级和三级 AS null
part 2 :一级 a join 二级 b ON a.本级编号=b.上级编号
同part 2 一样,取 part 3
可得

第三层的代码如下,前两层的类似,用union

select a.本级名称 as 一级,b.本级名称 as 二级,c.本级名称 as 三级
from (select 本级编号,本级名称 from 表名 where 上级编号=0) a
join (select 上级编号,本级编号,本级名称 from 表名 where length(上级编号)=2) b
on a.本级编号=b.上级编号
join (select 上级编号,本级编号,本级名称 from 表名 where length(上级编号)=4) c
on b.本级编号=c.上级编号

SELECT 
(CASE WHEN d3.本级编号 IS NOT NULL THEN d3.本级名称 WHEN d2.本级编号 IS NOT NULL THEN d2.本级名称 ELSE d1.本级名称 END) AS 一级,
(CASE WHEN d3.本级编号 IS NOT NULL THEN d2.本级名称 WHEN d2.本级编号 IS NOT NULL THEN d1.本级名称 ELSE NULL END) AS 二级,
(CASE WHEN d3.本级编号 IS NOT NULL THEN d1.本级名称 ELSE NULL END) AS 三级 
FROM 表名 d1 LEFT JOIN 表名 d2 ON d1.上级编号 = d2.本级编号 LEFT JOIN 表名 d3 ON d2.上级编号 = d3.本级编号