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