SQL判分

需求介绍


    整个学校英语网上考试,下图中是学生答题的详细情况,包括题号、标准答案、答题学生学号,学生答题情况,每个题具体得分。该系统设计为学生每选择一题后,便在数据库中自动判出得分来(在数据库中的字段为Fraction)。图中的题型为选词填空,系统中CorrectAnswer是标准答案,每一空的答案用“#”来分割。

    但是现在的情况是,系统中标准答案错了,导致所有学生判分都不是正确的。那么如何解决这个问题呢?

------------------------------------------------------------------------------------------------------

问题分析


给每个空判分,一下子全部判出分来不容易实现。可以先从第一题开始判分,然后逐个判分。由于问题相对比较复杂,我们从局部分割来看这个问题。如下图所示。

------------------------------------------------------------------------------------------------------

难点分析

1、如何得到“#”的位置?

2、得到“#”的位置后,如何获取第一个答案的值?

3、如何批量给所有学生判分?

------------------------------------------------------------------------------------------------------

项目实践

Step1:

先执行一个函数:
/*
方法很多,这里简单写一个
返回@find在@str中第(@n)次出现的位置。没有第(@n)次返回0。
*/
create function fn_find(@find varchar(8000), @str varchar(8000), @n smallint)
    returns int
as
begin
    if @n < 1 return (0)
    declare @start smallint, @count smallint, @index smallint, @len smallint
    set @index = charindex(@find, @str)
    if @index = 0 return (0)
    else select @count = 1, @len = len(@find)
    while @index > 0 and @count < @n
        begin
            set @start = @index + @len
            select @index = charindex(@find, @str, @start), @count = @count + 1
        end
    if @count < @n set @index = 0
    return (@index)
end
go

Step2:

再编写一个存储过程:
create procedure MyFxqOne
    @n int
as 
    begin
        declare @find varchar(8000), @str varchar(8000), @mystart smallint,@myend smallint,@mylength smallint
        --赋值
        set @find ='#'
        set @str ='presented#annual#pains#colleagues#symptoms#patterns#occur#delaying#waking#problem'
        set @mystart =@n 
        set @myend =@mystart +1
        if (@myend<10) 
            begin
            --得到某个题的长度
            set @mylength=(dbo.fn_find(@find,@str,@myend)+1-dbo.fn_find(@find,@str,@mystart)-2)
            --得到正确答案
            select SUBSTRING(@str,dbo.fn_find(@find,@str,@mystart)+1,@mylength)
            --更新该题
            update T_dxyysyj_ListeningCompound_Record
            set Fraction =Fraction +1 
            where QuestionID ='4' and SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1,@mylength)=SUBSTRING(@str,dbo.fn_find(@find,@str,@mystart)+1,@mylength)
            and SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1+@mylength,1)='#'
            --筛选出涉及到的范围
            select * from  T_dxyysyj_ListeningCompound_Record
            where QuestionID ='4' and SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1,@mylength)=SUBSTRING(@str,dbo.fn_find(@find,@str,@mystart)+1,@mylength)
            and SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1+@mylength,1)='#'
            --筛选出所有学生第N个题的答案
            select studentid,ExamAnswer, SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1,@mylength) from  T_dxyysyj_ListeningCompound_Record
            where QuestionID ='4' 
            end
        else
            begin
            --得到某个题的长度
            set @mylength=len(@str)-dbo.fn_find(@find,@str,@mystart)
            --得到正确答案
            select SUBSTRING(@str,dbo.fn_find(@find,@str,@mystart)+1,@mylength)
            --更新该题
            update T_dxyysyj_ListeningCompound_Record
            set Fraction =Fraction +1 
            where QuestionID ='4' and SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1,@mylength)=SUBSTRING(@str,dbo.fn_find(@find,@str,@mystart)+1,@mylength)
            --筛选出涉及到的范围
            select * from T_dxyysyj_ListeningCompound_Record
            where QuestionID ='4' and SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1,@mylength)=SUBSTRING(@str,dbo.fn_find(@find,@str,@mystart)+1,@mylength)
            --筛选出所有学生第N个题的答案
            select studentid,ExamAnswer, SUBSTRING(ExamAnswer,dbo.fn_find(@find,ExamAnswer,@mystart)+1,@mylength) from T_dxyysyj_ListeningCompound_Record
            where QuestionID ='4'  
            end
            --筛选出所有学生第N个题的答案
    end

Step3:

判分:
1、先清空所有学生该题的得分
2、给第一题判分:execute MyFxqOne(0)
3、给第二题判分: execute MyFxqOne(1)
4、。。。。。。
----------------------------------------------------------------------------------------------------------------------------------

思考总结

1、学会把复杂的问题分割成简单的问题,实现单点突破。

2、积极主动。不管是在公司还是学校,要多多承担一些。在生活的方方面面要学会先付出。

3、在管理上,遇事要冷静。善于调动起团队每个人的积极性,要让每个人在团队中能深刻感受到巨大的收获。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 66
    评论
评论 66
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值