sql server行列转换案例

一、行转列

建表:
if object_id('mytest')is not null drop table mytest
go
create table mytest(姓名 varchar(10),课程 varchar(10),分数 int)
insert into mytest values('小明','化学',86)
insert into mytest values('小明','数学',77)
insert into mytest values('小明','物理',87)
insert into mytest values('小华','化学',86)
insert into mytest values('小华','数学',84)
insert into mytest values('小华','物理',94)
go

select * from mytest

姓名         课程         分数
---------- ---------- -----------
小明         化学         86
小明         数学         77
小明         物理         87
小华         化学         86
小华         数学         84
小华         物理         94

(6 行受影响)

现在的问题是:我想根据姓名统计这个人的三门成绩,即:姓名   化学   数学  物理
首先看看使用case when end结构的时候:
select 姓名,
 max(case 课程 when '化学' then 分数 else 0 end) 化学,
 max(case 课程 when '数学' then 分数 else 0 end) 数学,
 max(case 课程 when '物理' then 分数 else 0 end) 物理
from mytest
group by 姓名

姓名        化学        数学        物理
---------- ----------- ----------- -----------
小华         86          84          94
小明         86          77          87
(2 行受影响)

这个结果就是我们想要的,然后再看看使用pivot:
select * from mytest pivot(max(分数) for 课程 in (化学,数学,物理))a

姓名         化学        数学       物理
---------- ----------- ----------- -----------
小华         86          84          94
小明         86          77          87
(2 行受影响)

求出平均分、总分:
select 姓名,
max(case 课程 when '化学' then 分数 else 0 end) 化学,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
sum(分数) 总分,
cast(avg(分数*1.0) as decimal(18,2)) 平均分
from mytest
group by 姓名

姓名       化学        数学        物理        总分      平均分
---------- ----------- ----------- ----------- --------- ---------
小华        86          84          94          264      88.00
小明        86          77          87          250      83.33

二、列转行
1、建立表格
if object_id('mytest') is not null
drop table mytest
go
create table mytest(姓名 varchar(10),化学 int,数学 int,物理 int)
insert into mytest values('小明',86,77,87)
insert into mytest values('小华',86,84,94)
go
select * from mytest
go
姓名       化学        数学        物理
---------- ----------- ----------- -----------
小明       86          77          87
小华       86          84          94

使用SQL Server 2005静态SQL

select 姓名,课程,分数 from mytest unpivot (分数 for 课程 in([化学],[数学],[物理])) t

请使用浏览器的分享功能分享到微信等