这个问题我不知道应该怎么描述,所以就取了一个可能不合适的标题。
问题是这样的,我的数据库里有这样一些记录:id 姓名 课程 成绩
1 张三 语文 80
2 李四 语文 70
3 王五 语文 60
4 张三 数学 81
5 李四 数学 71
6 王五 数学 61
7 张三 英语 84
8 李四 英语 74
9 王五 英语 64
……其中,每个学期的课程表有可能是不同的,例如,第一个学期学生有可能考语文、数学、英语;第二个学期学生有可能考语文、化学、物理。
现在,我想在网页中的显示结果为:姓名 语文 数学 英语
张三 80 81 84
李四 70 71 74
王五 60 61 64请问,要如何做才能实现该功能?
问题是这样的,我的数据库里有这样一些记录:id 姓名 课程 成绩
1 张三 语文 80
2 李四 语文 70
3 王五 语文 60
4 张三 数学 81
5 李四 数学 71
6 王五 数学 61
7 张三 英语 84
8 李四 英语 74
9 王五 英语 64
……其中,每个学期的课程表有可能是不同的,例如,第一个学期学生有可能考语文、数学、英语;第二个学期学生有可能考语文、化学、物理。
现在,我想在网页中的显示结果为:姓名 语文 数学 英语
张三 80 81 84
李四 70 71 74
王五 60 61 64请问,要如何做才能实现该功能?
http://blog.csdn.net/xys_777/archive/2010/06/22/5685953.aspx
假设有张学生成绩表(tb_rowtocol)如下
Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94想变成
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94declare @sql varchar(4000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
from (select distinct Subject from rowtocol) as a
set @sql = @sql + ' from rowtocol group by name'
exec(@sql)
如果上述两表互相换一下:即
表名(cj)
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94
create table tb([ID] int,姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values(1,'张三' , '语文' , 80)
insert into tb values(2,'李四' , '语文' , 70)
insert into tb values(3,'王五' , '语文' , 60)
insert into tb values(4,'张三' , '数学' , 81)
insert into tb values(5,'李四' , '数学' , 71)
insert into tb values(6,'王五' , '数学' , 61)
insert into tb values(7,'张三' , '英语' , 84)
insert into tb values(8,'李四' , '英语' , 74)
insert into tb values(9,'王五' , '英语' , 64)
select * from tbselect 姓名 as 姓名,
max(case 课程 when '语文' then 分数 else 0 end)语文,
max(case 课程 when '数学' then 分数 else 0 end)数学,
max(case 课程 when '英语' then 分数 else 0 end)英语
from tb
group by 姓名
if object_id('tempdb.dbo.#T') is not null drop table #Tselect Name as '名字', Subject as '课程' into #T from tb_rowtocol group by Name DECLARE @COUNT INT
SELECT @COUNT=COUNT(1) FROM #T
IF @COUNT>0
BEGIN
declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',ISNULL(max(case when 课程='''+课程+''' then Resultend),0) ['+课程+']'
from #T group by 课程set @sql=stuff(@sql,1,1,'')exec ('select 名字, '+@sql+' from #T group by 名字')
END
我这段时间一直在写这个,把我的改了下
结果为:
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94
max(case kemu when 'YW' then corse else 0 end) 语文,
max(case kemu when 'SX' then corse else 0 end) 数学,
max(case kemu when 'YY' then corse else 0 end) 英语
from text
group by name
语文、数学、英语
语文、化学、物理
其实是动态列,access倒是直接交叉表就可以,sql server麻烦点,要分两次查询,而且后期代码里处理也比较麻烦,列名不知道了,多少列也不知道了,全部只能动态显示,扩展性比较弱了