我认为你应该这么设计:--科目表 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
呵呵,其实我刚才也意识到,如果答案对于题目是多对一关系的话,应该就不需要设计中间表了。 结合你的代码,改进到以下设计--题目表 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.根据加入题库的题目编号,循环加入答案;还是感觉比较麻烦。
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来判断是多选还是单选。
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
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
...
呵呵,其实我刚才也意识到,如果答案对于题目是多对一关系的话,应该就不需要设计中间表了。
结合你的代码,改进到以下设计--题目表
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.根据加入题库的题目编号,循环加入答案;还是感觉比较麻烦。