系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > MsSql > 详细页面

sql server如何通过pivot对数据进行行列转换(进阶)

时间:2020-06-22来源:www.pcxitongcheng.com作者:电脑系统城

复制代码
/*
说明: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 Server 数据库中的收缩数据库和文件操作

    收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间,在文件末尾创建足够的空间后,可取消对文件末尾的数据页的分配并将它们返回给文件系统,本文给大家介绍SQL Server 数据库中的收缩数据...

    2023-10-27

  • dbeaver配置SQL server连接实现

    一、需要java jdk环境,我用的比较新 二、dbeaver新建连接SQL server...

    2023-10-27

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载