sql server如何經過pivot對數據進行行列轉換(進階)

腳本:
html

/*
說明:sql server如何經過pivot對數據進行行列轉換(進階),用於員工業績按月龍虎排行榜、客戶銷售金額按月排行榜等
腳原本源:https://www.cnblogs.com/zhang502219048/p/13173228.html
做者:zhang502219048
做者微信公衆號:SQL數據庫編程(微信號zhang502219048)
*/

declare @n int = 2

create table #t1
(
    [月份] nvarchar(50),
    [業務員] nvarchar(50),
    [金額] int
)
insert into #t1
values(N'2020-01', N'業務員1', N'100')
    , (N'2020-01', N'業務員2', N'200')
    , (N'2020-02', N'業務員2', N'300')
    , (N'2020-02', N'業務員3', N'400')
    , (N'2020-03', N'業務員4', N'500')
    , (N'2020-03', N'業務員5', N'600')
    , (N'2020-04', N'業務員1', N'700')
    , (N'2020-04', N'業務員3', N'800')

--select * from #t1

select [行序號] = row_number() over(partition by [月份] order by [金額] desc)
     , *
into #t2
from #t1

--select * from #t2

create table #t3
(
    [列序號] int,
    [行序號] int,
    [月份] nvarchar(50),
    [結果] nvarchar(50),
    [類型] nvarchar(50)
)

insert into #t3
select [列序號] = 1, [行序號], [月份], [結果] = [業務員], [類型] = [月份] + N'-業務員'
from #t2

insert into #t3
select [列序號] = 2, [行序號], [月份], [結果] = [金額], [類型] = [月份] + N'-金額'
from #t2

--select * from #t3

declare @sqlIn nvarchar(max) = ''
select @sqlIn = @sqlIn + case when @sqlIn <> '' then ',' else '' end + '[' + [類型] + ']' 
from (select distinct [列序號], [月份], [類型] from #t3) a
order by [月份], [列序號]
--select @sqlIn

--行列轉換後的目標數據
declare @sql nvarchar(max) = '
select top ' + cast(@n as nvarchar(10)) + @sqlIn + '
from (select [行序號], [結果], [類型] from #t3) D
pivot(max([結果]) for [類型] in (' + @sqlIn + ')) Q
order by [行序號]
'
exec(@sql)

drop table #t1, #t2, #t3

腳本運行結果:

sql

【轉載請註明博文來源:https://www.cnblogs.com/zhang502219048/p/13173228.html】數據庫

相關文章
相關標籤/搜索