sqlserver如何通过pivot对数据进行行列转换(进阶)
脚本:
/*说明:sql server如何通过pivot对数据进行行列转换(进阶),用于员工业绩按月龙虎排行榜、客户销售金额按月排行榜等
脚本来源:https://www.cnblogs.com/zhang502219048/p/13173228.html
作者:zhang502219048
作者微信公众号:SQL数据库编程(微信号zhang502219048)
*/declare@nint=2
createtable #t1
(
[月份]nvarchar(50),
[业务员]nvarchar(50),
[金额]int
)
insertinto #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[月份]orderby[金额]desc)
, *
into #t2
from #t1
--select * from #t2
createtable #t3
(
[列序号]int,
[行序号]int,
[月份]nvarchar(50),
[结果]nvarchar(50),
[类型]nvarchar(50)
)
insertinto #t3
select[列序号]=1, [行序号], [月份], [结果]=[业务员], [类型]=[月份]+ N"-业务员"
from #t2
insertinto #t3
select[列序号]=2, [行序号], [月份], [结果]=[金额], [类型]=[月份]+ N"-金额"
from #t2
--select * from #t3
declare@sqlInnvarchar(max) =""
select@sqlIn=@sqlIn+casewhen@sqlIn<>""then","else""end+"["+[类型]+"]"
from (selectdistinct[列序号], [月份], [类型]from #t3) a
orderby[月份], [列序号]
--select @sqlIn
--行列转换后的目标数据
declare@sqlnvarchar(max) ="
select top "+cast(@nasnvarchar(10)) +@sqlIn+"
from (select [行序号], [结果], [类型] from #t3) D
pivot(max([结果]) for [类型] in ("+@sqlIn+")) Q
order by [行序号]
"
exec(@sql)
droptable #t1, #t2, #t3
脚本运行结果:
【转载请注明博文来源:https://www.cnblogs.com/zhang502219048/p/13173228.html】
以上是 sqlserver如何通过pivot对数据进行行列转换(进阶) 的全部内容, 来源链接: utcz.com/z/534261.html