1 1.1.1.1 1.1.2 1.3 2 2.1 ...這樣的數據sql排序

----其中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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章