我有一个MS Access 2007数据库,其中包含已通过和未通过考试的失败记录。
Student_id, Course_id, passed
S001 C001 0
S001 C001 1
S002 C001 1
S003 C001 0
'Passed'用作布尔值,其中0表示失败并传递1,但存储为数字。
我想构建一个查询,显示每个学生每个课程的尝试次数。这可以通过平均传递的数量来完成。 S001的平均值为0.5,S002为1,S003为0.这表示S001在2次尝试后通过,S002在1次后,S003从未成功。
SELECT Student_id, Course_id, avg(passed)
FROM tbl
GROUP BY Student_id, Course_id, passed
问题是:平均值都是0或1.我的猜测是该数字不会转换为double(允许小数)。如何将平均值转换为允许小数的数据类型?
答案 0 :(得分:3)
我没有看到问题。我用相同的数据创建了一个测试表,当我运行这个SQL时:
SELECT Student_id, Course_id, avg(passed)
FROM tbl
GROUP BY Student_id, Course_id
我得到了这个结果:
Student_ID Course_ID AvgOfPassed S001 C001 0.5 S002 C001 1 S003 C001 0
您原始发布的SQL应该为原始表中的每一行生成一行,因为您在GROUP BY中错误地包含了PASSED。
我的问题是,您正在查看您认为产生错误结果的数据。很明显,使用您提供的数据和所需结果的描述,Access正好返回您的要求,如果正确编写SQL。
答案 1 :(得分:1)
我想构建一个查询,显示每个学生每门课程的尝试次数。
使用:
SELECT student_id,
course_id,
COUNT(*) AS num_attempts
FROM TBL
GROUP BY student_id, course_id
我不知道平均值在哪里有意义。如果你想让学生通过百分比:
SELECT t.student_id,
t.course_id,
COUNT(*) AS num_attempts,
x.num_passed / COUNT(*) AS pass_percentage
FROM TBL t
LEFT JOIN (SELECT student_id,
course_id,
COUNT(*) AS num_passed
FROM TBL
WHERE passed = 1
GROUP BY student_id, course_id) x ON x.student_id = t.student_id
AND x.course_id = t.courseid
GROUP BY t.student_id, t.course_id