行转列、列转行怎么操作?由table1、table2如何得到table3?
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
李四 74 84 94
张三 74 83 93
没懂。。。
是想让查询结果显示的是这个?
@张小线: 其实这两个成绩表都是表格的形式的,但是上面没显示出来。前面的那个也是表格形式的,后面的那个也是表格形式的。
@飘雪媛媛: 是把上面的表格内容写到下面的那个表格里?
@飘雪媛媛: 发消息了?没看到
@飘雪媛媛: 是把
姓名 语文 数学 物理
李四 74 84 94
张三 74 83 93
放到一个表内吗?
@张小线: 是的啊
@飘雪媛媛: 我可以试试
@飘雪媛媛:
这个是我写的,希望有用
--1代表语文
--2代表数学
--3代表物理
create table 学生(姓名 varchar(20),课程代号 int,分数 int)
insert into 学生(姓名,课程代号,分数)VALUES('张三',1,74);
insert into 学生(姓名,课程代号,分数)VALUES('张三',2,83);
insert into 学生(姓名,课程代号,分数)VALUES('张三',3,93);
insert into 学生(姓名,课程代号,分数)VALUES('李四',1,74);
insert into 学生(姓名,课程代号,分数)VALUES('李四',2,84);
insert into 学生(姓名,课程代号,分数)VALUES('李四',3,94);
select 姓名,
[1] as "语文",
[2] as "数学",
[3] as "物理"
from 学生
pivot
(
sum(分数) for 课程代号 in([1],[2],[3])
)as pvt
好像只有课程用整数表示的时候才能显示分数,否则就一直显示为空。
你在网上搜一下,一大推的额行转列、列转行的。sql2005也已经嵌入到语言里面去了。其实原理都是一样的。
支持sql2000的话要动态生成sql语句
用pivot
Sql2005就可以使用这个语法来行转列。
1、SQL行转列
http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
【注意修改数据库的兼容级别】
--姓名 学科 成绩
--张三 语文 80
--张三 数学 90
--张三 物理 100
--李四 语文 40
--李四 数学 50
--李四 物理 60
--行转列
--姓名 语文 数学 物理
--张三 80 90 100
--李四 40 50 60
-----------------------
create table tChengJi
(
姓名 varchar(20),
学科 varchar(20),
成绩 int
)
go
insert into tChengJi(姓名,学科,成绩) values('张三', '语文', 80)
insert into tChengJi(姓名,学科,成绩) values('张三', '数学', 90)
insert into tChengJi(姓名,学科,成绩) values('张三', '物理', 100)
insert into tChengJi(姓名,学科,成绩) values('李四', '语文', 40)
insert into tChengJi(姓名,学科,成绩) values('李四', '数学', 50)
insert into tChengJi(姓名,学科,成绩) values('李四', '物理', 60)
go
select * from tChengJi
go
select 姓名,
avg(case 学科 when '语文' then 成绩 end) 语文,
avg(case 学科 when '数学' then 成绩 end) 数学,
avg(case 学科 when '物理' then 成绩 end) 物理
from tChengJi
group by 姓名
--table_source
--PIVOT(
--聚合函数(value_column)
--FOR pivot_column
--IN(<column_list>)
--) table_target
select * from tChengJi
pivot(max(成绩) for 学科 in (语文,数学,物理)) t
你查下case when的用法
问题已经解决了,不用了。。。这里的case when用法是对的。