http://www.pdriver.com/bbs5/dispbbs.asp?boardID=14&ID=106036
自己在SQL Server中建立一个数据库(或利用现有数据库),再建立下表。
SQL Server中表test:
CREATE TABLE test(
Code smallint NOT NULL, --学生编号
Name varchar(10) NOT NULL, --学生姓名
Lessons varchar(1000) NOT NULL, --课程名称,每个名称以“,”结束
Score1 varchar(1000) NOT NULL, --期中成绩,每课程成绩以“,”结束
Score2 varchar(1000) NOT NULL, --期末成绩,每课程成绩以“,”结束
PRIMARY KEY (Code)
)
go
实例记录数据:
insert into test (Code,Name,Lessons,Score1,Score2) values(20301,'张三','语文,数学
,外语,','100,99,98,','97,96,95,')
go
insert into test (Code,Name,Lessons,Score1,Score2) values(20302,'李四','语文,数学
,外语,','90,89,88,','87,86,85,')
go
insert into test (Code,Name,Lessons,Score1,Score2) values(20303,'王五','语文,数学
,外语,','70,69,68,','67,66,65,')
go
屏幕显示实例:
课程 语文 数学 外语
编号 姓名 期中 期末 期中 期末 期中 期末
20301 张三 100 97 99 96 98 95
20302 李四 90 87 89 86 88 85
20303 王五 70 67 69 66 68 65
题目的难点在于科目是动态的
陶清网站已经有人用sql实现了
他说没有用到游标只用了一个函数
函数已经给出
但后面的具体实现过程他没有提供
还请csdn上的高手们赐教
谢谢
---------------------------------------------------------------
drop table test
go
drop table #t
go
CREATE TABLE test(
Code smallint NOT NULL, --学生编号
Name varchar(10) NOT NULL, --学生姓名
Lessons varchar(1000) NOT NULL, --课程名称,每个名称以“,”结束
Score1 varchar(1000) NOT NULL, --期中成绩,每课程成绩以“,”结束
Score2 varchar(1000) NOT NULL, --期末成绩,每课程成绩以“,”结束
PRIMARY KEY (Code)
)
go
insert into test (Code,Name,Lessons,Score1,Score2) values(20301,'张三','语文,数学
,外语,','100,99,98,','97,96,95,')
go
insert into test (Code,Name,Lessons,Score1,Score2) values(20302,'李四','语文,数学
,外语,','90,89,88,','87,86,85,')
go
insert into test (Code,Name,Lessons,Score1,Score2) values(20303,'王五','语文,数学
,外语,','70,69,68,','67,66,65,')
go
/*
屏幕显示实例:
课程 语文 数学 外语
编号 姓名 期中 期末 期中 期末 期中 期末
20301 张三 100 97 99 96 98 95
20302 李四 90 87 89 86 88 85
20303 王五 70 67 69 66 68 65
*/
create table #t(
Code smallint NOT NULL, --学生编号
Name varchar(10) NOT NULL, --学生姓名
Lessons varchar(100) NOT NULL, --课程名称,每个名称以“,”结束
Score1 int,
Score2 int
)
go
Select 1
while @@rowcount > 0
begin
insert #t
select code,name
,left(lessons,charindex(',',lessons)-1)
,left(score1,charindex(',',score1)-1)
,left(score2,charindex(',',score2)-1)
from test
where charindex(',',lessons)>0
update test set lessons = right(lessons,len(lessons)-charindex(',',lessons)),
score1 = right(score1,len(score1)-charindex(',',score1)) ,
score2 = right(score2,len(score2)-charindex(',',score2))
where charindex(',',lessons)>0
end
declare @sql varchar(8000)
set @sql = 'select code,name'
select @sql = @sql + ',sum(case lessons when '''+lessons+''' then cast(score1 as int) end) ['+rtrim(lessons)+'中]'
+ ',sum(case lessons when '''+lessons+''' then cast(score2 as int) end) ['+rtrim(lessons)+'末]'
from (select distinct lessons as lessons from #t) as a
select @sql = @sql+' from #t group by code,name'
exec(@sql)
code name 数学
中 数学
末 外语中 外语末 语文中 语文末
------ ---------- ----------- ----------- ----------- ----------- ----------- -----------
20302 李四 89 86 88 85 90 87
20303 王五 69 66 68 65 70 67
20301 张三 99 96 98 95 100 97