sql server行列转换案例

来源:这里教程网 时间:2026-03-02 11:03:54 作者:

一、行转列 建表:
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

相关推荐