sqlserver行列转换

Posted 蒹葭白露

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver行列转换相关的知识,希望对你有一定的参考价值。

  • sqlserver行转列
--创建行转列表及插入数据
create table tb_RowConvertToColumn
(
   username nvarchar(100) null,
   course nvarchar(100) null,
   score numeric(10,2) null
)
insert into tb_RowConvertToColumn(username,course,score) values(张三,语文,82)
insert into tb_RowConvertToColumn(username,course,score) values(张三,数学,85)
insert into tb_RowConvertToColumn(username,course,score) values(张三,外语,90)
insert into tb_RowConvertToColumn(username,course,score) values(李四,语文,86)
insert into tb_RowConvertToColumn(username,course,score) values(李四,数学,82)
insert into tb_RowConvertToColumn(username,course,score) values(李四,外语,92)
insert into tb_RowConvertToColumn(username,course,score) values(王五,语文,82)
insert into tb_RowConvertToColumn(username,course,score) values(王五,数学,94)
insert into tb_RowConvertToColumn(username,course,score) values(王五,外语,82)

--1.静态sql行转列,该sql指定了转换的列头
select username 姓名,
       MAX(case course when 语文 then score else 0 end) 语文,
       MAX(case course when 数学 then score else 0 end) 数学,
       MAX(case course when 外语 then score else 0 end) 外语
from tb_RowConvertToColumn
group by username
order by username
/*
姓名    语文    数学    外语
李四    86.00    82.00    92.00
王五    82.00    94.00    82.00
张三    82.00    85.00    90.00
*/


--2.静态sql行转列,该sql指定了转换的列头,该语句必须sqlserver2005及以上版本才能使用
select username 姓名,语文,数学,外语 from tb_RowConvertToColumn pivot(max(score) for course in(语文,数学,外语)) a
/*
姓名    语文    数学    外语
李四    86.00    82.00    92.00
王五    82.00    94.00    82.00
张三    82.00    85.00    90.00
*/
select * from tb_RowConvertToColumn pivot(max(score)for course in (语文,数学,外语)) a
/*
username    语文    数学    外语
李四    86.00    82.00    92.00
王五    82.00    94.00    82.00
张三    82.00    85.00    90.00
*/


--3.动态sql行转列,自动生成转换的列
declare @sql nvarchar(2000)
select distinct course into #tb_group from tb_RowConvertToColumn order by course desc--表头及排序
select @sql=ISNULL(@sql+,,‘‘)+MAX(case course when ‘‘‘+course+‘‘‘ then score else 0 end) [+course+]
 from #tb_group
set @sql=select username 姓名,+@sql
        + from tb_RowConvertToColumn a
        + group by username
exec(@sql)
drop table #tb_group
/*
姓名    语文    外语    数学
李四    86.00    92.00    82.00
王五    82.00    82.00    94.00
张三    82.00    90.00    85.00
*/


--4.动态sql行转列,自动生成转换的列,该语句必须sqlserver2005及以上版本才能使用
declare @sql nvarchar(2000)
select @sql=ISNULL(@sql+,,‘‘)+course
from tb_RowConvertToColumn
group by course
set @sql=select * from tb_RowConvertToColumn pivot (max(score) for course in (+@sql+)) a
exec(@sql)
/*
username    数学    外语    语文
李四    82.00    92.00    86.00
王五    94.00    82.00    82.00
张三    85.00    90.00    82.00
*/
  • sqlserver列转行
--创建列转行表及插入数据
create table tb_ColumnConvertToRow
(
   [姓名] nvarchar(100) null,
   [语文] nvarchar(100) null,
   [数学] nvarchar(100) null,
   [外语] nvarchar(100) null
)

insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values(李四,82,92,86)
insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values(王五,94,82,82)
insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values(张三,85,90,82)

--1.静态sql列转行,当列头较少时使用
select * from 
(
   select 姓名,课程=语文,分数=语文 from tb_ColumnConvertToRow
   union all
   select 姓名,课程=数学,分数=数学 from tb_ColumnConvertToRow
   union all 
   select 姓名,课程=外语,分数=外语 from tb_ColumnConvertToRow
) a
/*
姓名    课程    分数
李四    语文    82
王五    语文    94
张三    语文    85
李四    数学    92
王五    数学    82
张三    数学    90
李四    外语    86
王五    外语    82
张三    外语    82
*/


--2.静态sql列转行,当列头较少时使用,该语句必须sqlserver2005及以上版本才能使用
select 姓名,课程,分数 from tb_ColumnConvertToRow unpivot(分数 for 课程 in (语文,数学,外语)) a
/*
姓名    课程    分数
李四    语文    82
李四    数学    92
李四    外语    86
王五    语文    94
王五    数学    82
王五    外语    82
张三    语文    85
张三    数学    90
张三    外语    82
*/

 

以上是关于sqlserver行列转换的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver行列转换,动态行转换

sqlserver行列转换,动态行转换

sqlserver行列转换,动态行转换

sqlserver行列转换,动态行转换

sql server行列转换问题

sql server 2005中,如何将行列转换?