本帖最后由 SilverNet 于 2010-01-11 15:12:55 编辑

解决方案 »

  1.   

    --科目表
    SubjectID
    SubjectName--标准答案表
    SubjectID , itemid , Answer , score1, score2 , type
    1           1        A        4       0        1    --1表示单选,--2表示多选
    1           2        A,B      4       2        2    --A,B表示两个答案,0,2,4表示存在三种可能的分值。--一般来说,多选题全对得全分,少选不错选,得一半的分,错选,不选,得0分。
    这样,你可以通过type为1,2来判断是多选还是单选。
      

  2.   

    我认为你应该这么设计:--科目表
    SubjectID
    SubjectName--标准答案表
    SubjectID , itemid , Answer , score1, score2 , type --itemid 为题号
    1           1        A        4       0        1    --1表示单选,--2表示多选
    1           2        A,B      4       2        2    --A,B表示两个答案,0,2,4表示存在三种可能的分值。--一般来说,多选题全对得全分,少选不错选,得一半的分,错选,不选,得0分。
    这样,你可以通过type为1,2来判断是多选还是单选。--学生作答表。
    studentid , SubjectID , itemid , Answer--统计方法如下:
    select m.studentid ,
      sum(case when m.Answer = n.Answer then score1 
               when n.type = 2 and charindex(m.Answer ,n.Answer) > 0 and m.Answer <> n.Answer then score2
               else 0 end)
    from 学生作答表 m, 标准答案表 n
    where m.SubjectID = n.SubjectID and m.itemid = n.itemid
    group by m.studentid--如果需要科目名称,再连接科目表
    select m.studentid , p.SubjectName,
      sum(case when m.Answer = n.Answer then score1 
               when n.type = 2 and charindex(m.Answer ,n.Answer) > 0 and m.Answer <> n.Answer then score2
               else 0 end)
    from 学生作答表 m, 标准答案表 n,科目表 p
    where m.SubjectID = n.SubjectID and m.itemid = n.itemid and m.SubjectID = p.SubjectID
    group by m.studentid,p.SubjectName
      

  3.   

    和3楼差不多一个意思.这样?--标准答案表
    SubjectID , itemid , px , Answer , score  --itemid 为题号,px 为答案的内容序号
    1           1        1  , 内容1    4      
    1           1        2  , 内容2    5     
    1           1        3  , 内容3    6      
    1           1        4  , 内容4    7     
    1           2        1  , 内容1    6
    1           2        2  , 内容2    8
    ...     
      

  4.   


    呵呵,其实我刚才也意识到,如果答案对于题目是多对一关系的话,应该就不需要设计中间表了。
    结合你的代码,改进到以下设计--题目表
    IF OBJECT_ID('Question') IS NOT NULL DROP TABLE Question
    CREATE TABLE Questions(
    queID INT PRIMARY KEY IDENTITY,
    queContent VARCHAR(1000)         --题目内容
    )
    GO
    --答案表
    IF OBJECT_ID('ANSWERS') IS NOT NULL DROP TABLE ANSWERS
    CREATE TABLE ANSWERS
    (
    ansID INT PRIMARY KEY IDENTITY,
    ansContent VARCHAR(1000),        --答案内容
    isRight BIT                      --是否正确
    subID INT                        --所属题目
    )
    这样就少了一个表,那么操作的话就只要2个表的关联,感觉比以前好些,但是还是需要循环执行SQL语句插入答案.
    这样子添加和编辑的时候肯定就要进行2步操作了,
    1.把题目加入题库表
    (可能这中间还要一步,把刚才插入的那条题目自动生成的唯一标识给取出来,用于以下插入题目对应的答案做关联用)
    2.根据加入题库的题目编号,循环加入答案;还是感觉比较麻烦。