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;
结果:


先查询出要转为列的行数据,再拼接字符串。
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;
结果:

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;
结果:


到此这篇关于SQL Server使用PIVOT与unPIVOT实现行列转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
相关文章:
1. SQL Server删除表中的重复数据2. SQL Server还原完整备份和差异备份的操作过程3. SQL Server中搜索特定的对象4. SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询5. Can’t connect to MySQL server on ’localhost’ (10048)6. SQL Server解析/操作Json格式字段数据的方法实例7. SQL Server如何建表的详细图文教程8. SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串9. SQL Server实现查询每个分组的前N条记录10. SQL Server中T-SQL标识符介绍与无排序生成序号的方法