首页 新闻 会员 周边 捐助

SQL关于table的操作

0
悬赏园豆:5 [已解决问题] 解决于 2011-10-27 10:28

行转列、列转行怎么操作?由table1、table2如何得到table3?

问题补充:

问题:假设有张学生成绩表(tb)如下:

姓名 课程 分数

张三 语文 74

张三 数学 83

张三 物理 93

李四 语文 74

李四 数学 84

李四 物理 94

想变成(得到如下结果):

姓名 语文 数学 物理

 李四 74   84   94

 张三 74   83   93

 

飘雪媛媛的主页 飘雪媛媛 | 菜鸟二级 | 园豆:210
提问于:2011-10-26 17:23
< >
分享
最佳答案
0

没懂。。。

收获园豆:3
喬喬AI | 小虾三级 |园豆:996 | 2011-10-26 19:22

是想让查询结果显示的是这个?

喬喬AI | 园豆:996 (小虾三级) | 2011-10-26 20:58

@张小线: 其实这两个成绩表都是表格的形式的,但是上面没显示出来。前面的那个也是表格形式的,后面的那个也是表格形式的。

飘雪媛媛 | 园豆:210 (菜鸟二级) | 2011-10-26 21:04

@飘雪媛媛: 是把上面的表格内容写到下面的那个表格里?

喬喬AI | 园豆:996 (小虾三级) | 2011-10-26 21:05

@飘雪媛媛: 发消息了?没看到

喬喬AI | 园豆:996 (小虾三级) | 2011-10-26 21:26

@飘雪媛媛: 是把

姓名 语文 数学 物理

 李四 74   84   94

 张三 74   83   93

放到一个表内吗?

喬喬AI | 园豆:996 (小虾三级) | 2011-10-26 21:31

@张小线: 是的啊

飘雪媛媛 | 园豆:210 (菜鸟二级) | 2011-10-26 21:31

@飘雪媛媛: 我可以试试

喬喬AI | 园豆:996 (小虾三级) | 2011-10-26 21:32

@飘雪媛媛: 

这个是我写的,希望有用

--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

好像只有课程用整数表示的时候才能显示分数,否则就一直显示为空。

喬喬AI | 园豆:996 (小虾三级) | 2011-10-27 00:04
其他回答(4)
0

你在网上搜一下,一大推的额行转列、列转行的。sql2005也已经嵌入到语言里面去了。其实原理都是一样的。

收获园豆:1
小小刀 | 园豆:1991 (小虾三级) | 2011-10-26 21:57

支持sql2000的话要动态生成sql语句

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2011-10-26 21:59
0

用pivot
Sql2005就可以使用这个语法来行转列。

收获园豆:1
webaspx | 园豆:1973 (小虾三级) | 2011-10-26 21:58
0

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

飘雪媛媛 | 园豆:210 (菜鸟二级) | 2011-10-27 10:07
0

你查下case when的用法

Rookier | 园豆:652 (小虾三级) | 2011-12-20 17:35

问题已经解决了,不用了。。。这里的case when用法是对的。

支持(0) 反对(0) 飘雪媛媛 | 园豆:210 (菜鸟二级) | 2011-12-20 17:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册