----其中wbscode 爲1 1.1.1 1.1.2 這樣的編碼。
主要關注的地方爲:1 分解函數 2.根據分解函數進行行轉列 3 最終合併數據去重
-----分解函數 CREATE FUNCTION dbo.Split( @String varchar(8000), @Delimiter char(1)) returns @temptable TABLE (items varchar(8000),splitLevel int ) as begin declare @idx int declare @slice varchar(8000) declare @index int set @index=0 select @idx=1 if len(@String)<1 or @String is null return while @idx!=0 begin set @idx=charindex(@Delimiter,@String) if @idx!=0 set @slice=left(@String,@idx-1) else set @slice=@String if(len(@slice)>0) set @index=@index+1; insert into @temptable(Items,splitLevel) values(@slice,@index) set @String=right(@String,len(@String) -@idx) if len(@String) =0 break end return end go ---更新執行版本的任務序號數據 update PMM_TaskPerformance set Sequence=c.se from PMM_TaskPerformance tp inner join ( ---進行排序獲取排序數據 select ROW_NUMBER() over(order by level1,level2,level3,level4,level5,level6,level7,level8,level9,level10 ) as se, * from ( -----數據進行行轉列 select performancetaskid,WBSCode,sum(level1)as level1,SUM(level2) as level2,sum(level3) as level3,sum(level4) as level4 ,sum(level5) as level5,sum(level6) as level6,sum(level7) as level7,sum(level8) as level8,sum(level9) as level9,sum(level10) as level10 from ( ---執行查詢與編碼分解 select items 'SalesOffice',splitLevel, case splitLevel when 1 then items else 0 end as level1, case splitLevel when 2 then items else 0 end as level2, case splitLevel when 3 then items else 0 end as level3, case splitLevel when 4 then items else 0 end as level4, case splitLevel when 5 then items else 0 end as level5, case splitLevel when 6 then items else 0 end as level6, case splitLevel when 7 then items else 0 end as level7, case splitLevel when 8 then items else 0 end as level8, case splitLevel when 9 then items else 0 end as level9, case splitLevel when 10 then items else 0 end as level10, --執行版本任務id pt.id as performancetaskid ,pt.WBSCode,pt.Level from PMM_TaskPerformance pt CROSS apply dbo.split(pt.WBSCode,'.') ----以下三行爲篩選條件,可以不用關注 --join PMM_WBSTask t on t.ID=pt.WBSTask ---項目主鍵條件 ----where t.ProjectMaster='1002209270220008' )a group by performancetaskid,WBSCode )b )c on c.performancetaskid=tp.ID ---刪除臨時方法 drop FUNCTION dbo.Split;