22,209
社区成员
发帖
与我相关
我的任务
分享
DECLARE @SQL VARCHAR(MAX)
WITH CTE_1
AS
(SELECT Fltemid,FNUMBER FROM #T WHERE FPARENTID=0
UNION ALL
SELECT FPARENTID,FNUMBER FROM #T WHERE FPARENTID<>0),
CTE_2
AS
(SELECT *,ROW_NUMBER() OVER (PARTITION BY Fltemid ORDER BY FNUMBER) AS SEQ FROM CTE_1)
SELECT @SQL=ISNULL(@SQL+',','')+'MAX(CASE WHEN SEQ='+CAST(SEQ AS VARCHAR)+' THEN FNUMBER ELSE '''' END) AS FNUMBER_'+CAST(SEQ AS VARCHAR)
FROM CTE_2
GROUP BY SEQ
SET @SQL='WITH CTE_1
AS
(SELECT Fltemid,FNUMBER FROM #T WHERE FPARENTID=0
UNION ALL
SELECT FPARENTID,FNUMBER FROM #T WHERE FPARENTID<>0),
CTE_2
AS
(SELECT *,ROW_NUMBER() OVER (PARTITION BY Fltemid ORDER BY FNUMBER) AS SEQ FROM CTE_1)
SELECT Fltemid,'+@SQL+' FROM CTE_2 GROUP BY Fltemid'
EXEC(@SQL)
if not object_id('Class') is null
drop table Class
Go
Create table Class(Fltemid INT ,FNumber nvarchar(50),[FParentid]INT,[FLevel] INT ,[Fdetail] int)
Insert Class
select 1497,N'102EU',0,1,0 union all
select 1507,N'102EU.0002',1497,2,1 union all
select 1508,N'102EU.0003',1497,2,1 union all
select 1017,N'102UK',0,1,0 union all
select 1019,N'102UK.0001',1017,2,1 union all
select 1190,N'102UK.0002',1017,2,1 union all
select 1191,N'102UK.0003',1017,2,1
;
with list as(
select * ,rid=ROW_NUMBER()over(partition by left(fnumber,4) order by fnumber)
from Class
)
select *
from list pivot(max(fnumber) for rid in([1],[2],[3],[4]))pt
(1 行受影响)
Fltemid FParentid FLevel Fdetail 1 2 3 4
----------- ----------- ----------- ----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1017 0 1 0 102UK NULL NULL NULL
1019 1017 2 1 NULL 102UK.0001 NULL NULL
1190 1017 2 1 NULL NULL 102UK.0002 NULL
1191 1017 2 1 NULL NULL NULL 102UK.0003
1497 0 1 0 102EU NULL NULL NULL
1507 1497 2 1 NULL 102EU.0002 NULL NULL
1508 1497 2 1 NULL NULL 102EU.0003 NULL
(7 行受影响)
if not object_id('Class') is null
drop table Class
Go
Create table Class(Fltemid INT ,FNumber nvarchar(50),[FParentid]INT,[FLevel] INT ,[Fdetail] int)
Insert Class
select 1497,N'102EU',0,1,0 union all
select 1507,N'102EU.0002',1497,2,1 union all
select 1508,N'102EU.0003',1497,2,1 union all
select 1017,N'102UK',0,1,0 union all
select 1019,N'102UK.0001',1017,2,1 union all
select 1190,N'102UK.0002',1017,2,1 union all
select 1191,N'102UK.0003',1017,2,1