当前位置: 代码迷 >> Sql Server >> 急树形转换有关问题
  详细解决方案

急树形转换有关问题

热度:45   发布时间:2016-04-24 09:52:36.0
急!树形转换问题


请问专家,如何依据左表数据实现右表结果,谢谢!
左表数据是树形结构,分级了
------解决思路----------------------
在SQL2005+有效,你可以参考一下
如果你的真实数据和你贴出来的,在项目编号上的规则有较大出入,再和我说下~~
WITH ProjectCTE AS(
SELECT * FROM [数据表]WHERE [统计栏目]=N'期末'
)
,CTE AS(
SELECT [项目编号],[项目名称],CAST([项目名称]AS NVARCHAR(4000))[PATH],1[DEEP]FROM ProjectCTE WHERE[项目编号]='02'
UNION ALL
SELECT
A.[项目编号],A.[项目名称],B.[PATH]+A.[项目名称],B.[DEEP]+1
FROM ProjectCTE A JOIN CTE B
ON B.[项目编号]=LEFT(A.[项目编号],LEN(B.[项目编号]))AND B.[项目编号]<>A.[项目编号]AND LEN(A.[项目编号])<=LEN(B.[项目编号])+3
)
SELECT
A.[项目编号]
,A.[PATH][项目名称]
,B.[完工][完工否]
,B.[完工日期]
,B.[卖出]
,B.[买入]
FROM
CTE A
JOIN ProjectCTE B ON A.[项目编号]=B.[项目编号]
WHERE
A.DEEP=3
ORDER BY
A.[项目编号]

/*
02001001 暮光小区30#1单元4层402室 0 NULL -1212 6451
02001004 暮光小区30#2单元1层403室 0 NULL NULL 8039
02002001 暮光小区36#1单元1层402室 0 NULL -18280 NULL
02003001 暮光小区19#5单元1层401室 0 NULL -15379 NULL
*/

------解决思路----------------------
好像回答過,再把方法貼一遍

declare @tbl table
(
projectNo varchar(20),
projectName nvarchar(20),
isDone char(1),
finishDate datetime,
subjectName nvarchar(10),
sell decimal(13,2),
buy decimal(13,2)
)
insert @tbl 
select '02','春光小區','0',null,'期初',null,null union all
select '02','春光小區','0',null,'借方',null,null union all
select '02','春光小區','0',null,'貨方',null,null union all
select '02','春光小區','0',null,'期末',null,null union all
select '02001','30#','0',null,'期初',null,null union all
select '02001','30#','0',null,'借方',null,null union all
select '02001','30#','0',null,'貨方',null,null union all
select '02001','30#','0',null,'期末',null,null union all
select '02001001','1單元4層402室','0',null,'期初',null,null union all
select '02001001','1單元4層402室','0',null,'借方',null,6451.00 union all
select '02001001','1單元4層402室','0',null,'貨方',1212.00,null union all
select '02001001','1單元4層402室','0',null,'期末',-1212.00,6451.00 union all
select '02001004','2單元1層103室','0',null,'期初',null,null union all
select '02001004','2單元1層103室','0',null,'借方',null,8039.00 union all
select '02001004','2單元1層103室','0',null,'貨方',null,null union all
select '02001004','2單元1層103室','0',null,'期末',null,8039.00 union all
select '02002','36#','0',null,'期初',null,null union all
select '02002','36#','0',null,'借方',null,null union all
select '02002','36#','0',null,'貨方',18280.00,null union all
select '02002','36#','0',null,'期末',-18280.00,null union all
select '02002001','1單元1層102室','0',null,'期初',null,null union all
select '02002001','1單元1層102室','0',null,'借方',null,null union all
select '02002001','1單元1層102室','0',null,'貨方',18280.00,null union all
select '02002001','1單元1層102室','0',null,'期末',-18280.00,null union all
select '02003','19#','0',null,'期初',null,null union all
select '02003','19#','0',null,'借方',null,null union all
select '02003','19#','0',null,'貨方',15379.00,null union all
select '02003','19#','0',null,'期末',-15379.00,null union all
select '02003001','5單元1層101室','0',null,'期初',null,null union all
select '02003001','5單元1層101室','0',null,'借方',null,null union all
select '02003001','5單元1層101室','0',null,'貨方',15379.00,null union all
select '02003001','5單元1層101室','0',null,'期末',-15379.00,null ;

--select * from @tbl;

with cte as
(
select *,1 as lev from @tbl where projectNo='02'
union all
select a.projectNo,cast(b.projectName+a.projectName as nvarchar(20)), a.isDone,a.finishDate,a.subjectName,a.sell,a.buy,lev+1 
from @tbl as a,cte as b where substring(a.projectNo,1,len(a.projectNo)-3)=b.projectNo and a.projectNo!='02'
)
select distinct projectNo,projectName,isDone,finishDate,subjectName,sell,buy 
from cte where lev=(select MAX(lev)from cte) and subjectName='期末'
  相关解决方案