这个板块的人气应该比那边高吧。。。
有成绩表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