如何解决一个公司的数据库笔试题目


自己在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      
数学 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      
数学 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