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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29371470/viewspace-2126624/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29371470/viewspace-2126624/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值