加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server如何实现行列转换,方法指什么

发布时间:2023-05-08 14:14:37 所属栏目:MsSql教程 来源:
导读:这篇给大家分享的知识是“SQL Server如何实现行列转换,方法是什么”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“SQL Server如何实现行列转换,方法是
这篇给大家分享的知识是“SQL Server如何实现行列转换,方法是什么”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“SQL Server如何实现行列转换,方法是什么”文章能帮助大家解决问题。
 
一、sql行转列:PIVOT
 
1、基本语法:
 
create table #table1
 
    (    id int ,code varchar(10) , name varchar(20) );
 
go
 
insert into #table1 ( id,code, name ) values ( 1, 'm1','a' ), ( 2,  'm2',null ), ( 3, 'm3', 'c' ), ( 4,  'm2','d' ), ( 5,  'm1','c' );
 
go
 
select * from #table1;
 
--方法一(推荐)
 
select PVT.code, PVT.a, PVT.b, PVT.c
 
      from #table1 pivot(count(id) for name in(a, b, c)) as PVT;
 
--方法二
 
with P as (select * from #table1)
 
select PVT.code, PVT.a, PVT.b, PVT.c
 
     from P        pivot(count(id) for name in(a, b, c)) as PVT;
 
drop table #table1;
 
2、传统方式:(先汇总拼接出所需列的字符串,再动态执行转列)
 
先查询出要转为列的行数据,再拼接字符串。
 
create table #table1
 
    (    id int ,code varchar(10) , name varchar(20) );
 
go
 
insert into #table1 ( id,code, name ) values ( 1, 'm1','a' ), ( 2,  'm2',null ), ( 3, 'm3', 'c' ), ( 4,  'm2','d' ), ( 5,  'm1','c' );
 
go
 
select * from #table1;
 
declare @strCN nvarchar(100);
 
select @strCN = isnull(@strCN + ',', '') + quotename(name) from #table1 group by name ;
 
print  @strCN  --‘[a],[c],[d]'
 
declare @SqlStr nvarchar(1000);
 
set @SqlStr = N'
 
select * from #table1 pivot ( count(ID) for name in (' + @strCN + N') ) as PVT';
 
exec ( @SqlStr );
 
drop table #table1;
 
二、sql列转行:unPIVOT:
 
基本语法:
 
create table #table1 (id int,
 
code varchar(10),
 
name1 varchar(20),
 
name2 varchar(20),
 
name3 varchar(20));
 
go
 
insert into #table1(id, name1, name2, code, name3)
 
values(1, 'm1', 'a1', 'a2', 'a3'),
 
    (2, 'm2', 'b1', 'b2', 'b3'),
 
    (4, 'm1', 'c1', 'c2', 'c3');
 
go
 
select * from #table1;
 
--方法一
 
select PVT.id, PVT.code, PVT.name, PVT.val
 
            from #table1 unpivot(val for name in(name1, name2, name3)) as PVT;
 
--方法二
 
with P as (select * from #table1)
 
select PVT.id, PVT.code, PVT.name, PVT.val
 
            from P       unpivot(val for name in(name1, name2, name3)) as PVT;
 
drop table #table1;
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章