当前位置: 代码迷 >> Sql Server >> 求SQL语句 在oracle板块发了个帖子,没人回复,特来这
  详细解决方案

求SQL语句 在oracle板块发了个帖子,没人回复,特来这

热度:47   发布时间:2016-04-24 10:15:14.0
求SQL语句 在oracle板块发了个帖子,没人回复,特来这求助
这个板块的人气应该比那边高吧。。。
有成绩表T_Score(Stu_id和Lession_id为联合主键)
缺考情况下不录入,例如B001的L002课程缺考。
Stu_id(学生号) Lession_id(课程) Score(成绩)
A001 L001 90
A001 L002 80
A002 L001 70
A002 L002 60
B001 L001 50
B001 L001 85
…… …… ……

学生档案T_Stu_Profile(Stu_id为主键)
包含所有学生信息
Stu_id(学生号) Stu_name(姓名) Class_id(班级)
A001 张三 06101
A002 李四 06101
B001 王五 06102
…… …… ……

课程信息表T_Lession(Lission_id为主键)
包含所有课程信息
Lession_id(课程号) Lession_des(课程)
L001 语文
L002 数学
L003 英语
L004 物理
L005 化学
一、找出缺考的学生名单,输出如下格式:
Class_id(班级) Stu_name(姓名) Lession_des(课程)
06102 王五 数学
…… …… ……
要求:如果不使用游标,如何实现;如果使用游标,又如何实现?
二、找出五门课程中的年级前三名,输出如下格式:(假设前三名不出现并列的情况)
Lession_des(课程) 第一名 第二名 第三名
语文 
数学 
英语 
物理 
化学 …… …… ……
要求:如果不使用游标,如何实现;如果使用游标,又如何实现?
三、输出06101班的学生成绩单,格式如下:
姓名 语文 数学 英语 物理 化学 总分
…… 

要求:如果不使用游标,如何实现;如果使用游标,又如何实现?

四、假如成绩表增加考试日期Test_Date,记录高中三年大大小小每次考试成绩。请问:如何求出高三阶段(2005年),第位学生的第门课的平均考试成绩。(缺考以及60分以下的成绩不计入平均,如高三数学共考试20次,B001缺考一次、另一次成绩58分,则B001的平均考试成绩以18次计算)。输出格式同试题三。 
 
 

------解决方案--------------------

USE [litigation]
GO
 Object  UserDefinedFunction [dbo].[f_Convert]    Script Date 02172014 114204 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
   ALTER   FUNCTION   [dbo].[f_Convert](   
   @str   NVARCHAR(4000),   --要转换的字符串   
   @flag   bit                         --转换标志,0转换成半角,1转换成全角   
   )RETURNS   nvarchar(4000)   
   AS   
   BEGIN   
   DECLARE   @pat   nvarchar(8),@step   int,@i   int,@spc   int   
   IF   @flag=0   
   Select   @pat=N'%[!-~]%',@step=-65248,   
   @str=REPLACE(@str,N' ',N'   ')   
   ELSE   
   Select   @pat=N'%[!-~]%',@step=65248,   
@str=REPLACE(@str,N'   ',N' ')   
SET   @i=PATINDEX(@pat   COLLATE   LATIN1_GENERAL_BIN,@str)   
   WHILE   @i0   
Select   @str=REPLACE(@str,   
 SUBSTRING(@str,@i,1),   
NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))   
,@i=PATINDEX(@pat   COLLATE   LATIN1_GENERAL_BIN,@str)   
   RETURN(@str)   
   END   


USE [litigation]
GO
/****** Object:  UserDefinedFunction [dbo].[f_replace]    Script Date: 02/17/2014 11:41:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   FUNCTION   [dbo].[f_replace](   
   @str   NVARCHAR(4000)   --要转换的字符串   
)RETURNS   nvarchar(4000)   
AS   
BEGIN   
--过滤0
--如果存在第号这种字符串则进行操作
if  @str like '%第0%号%'
begin
select @str=LEFT(@str,patindex('%第0%号%',@str))+
                      substring(@str,patindex('%第0%号%',@str)-1+
                                  patINDEX('%[1-9]%',substring(@str,patindex('%第0%号%',@str),LEN(@str))),
                                  LEN(@str))
end 
--调用全角半角转化函数
select @str=dbo.f_convert(@str,0)
        --替换忽略词(此处本该可以调用正则替换函数过滤忽略词,但是由于权限不够sp_OACreate 'VBScript.RegExp')
select @str=replace(@str,'号','')
select @str=replace(@str,'第','')
select @str=replace(@str,'字','')
select @str=replace(@str,'(','')
select @str=replace(@str,')','')
select @str=replace(@str,'<','')
select @str=replace(@str,'>','')
select @str=replace(@str,'/','')
select @str=replace(@str,',','')
select @str=replace(@str,'{','')
select @str=replace(@str,'}','')
select @str=replace(@str,' ','')
select @str=replace(@str,' ','')
RETURN(@str) 
END   
  相关解决方案