Sql 将两个查询合并为一个查询
问题1 问题2Sql 将两个查询合并为一个查询,sql,Sql,问题1 问题2 我希望获得百分比通过率和失败率,其中通过率为结果>50%,失败率为结果如果两个查询的结果在列数和列类型方面相等,则可以使用UNION获得一个表结果: SELECT test_id, COUNT (student_id) * 100 / (SELECT COUNT(DISTINCT student_id) FROM test_taken)AS rate FROM test_taken WHE
我希望获得百分比通过率和失败率,其中通过率为结果>50%,失败率为结果如果两个查询的结果在列数和列类型方面相等,则可以使用UNION获得一个表结果:
SELECT test_id,
COUNT (student_id) * 100 / (SELECT COUNT(DISTINCT student_id)
FROM test_taken)AS rate
FROM test_taken
WHERE result > 50
GROUP BY test_id;
UNION
SELECT test_id,
COUNT (student_id) * 100 / (SELECT COUNT(DISTINCT student_id)
FROM test_taken)AS rate
FROM test_taken
WHERE result < 50
GROUP BY test_id;
OPs解决方案不会产生正确的结果,至少不会产生要求中规定的结果,因此使用UNION或其他方法扩展该解决方案不是有效的答案。他似乎是在计算学生总数的百分比,而不仅仅是那些参加特定测试的学生 为每个测试生成正确结果的查询如下:
select Q1.test_id,
Q1.students_passed * 100 / Q1.total_students || '%' as pass_rate,
Q1.students_failed * 100 / Q1.total_students || '%' as fail_rate
from
(SELECT test_id,
sum(case when result > 50 then 1 else 0 end) students_passed,
sum(case when result < 50 then 1 else 0 end) students_failed,
count(distinct student_id) total_students
FROM test_taken
GROUP BY test_id) Q1;
我们首先统计使用SUM函数通过和失败的学生人数。当满足我们的条件时,即结果>50或结果<50,我们在总和上加一,否则我们加零
我们还需要计算参加考试的学生总数,因此我们可以使用countdistinct student\u id和按考试id分组轻松完成这项工作
最后,我们将这个查询包装在外部查询中,在外部查询中,我们将通过和失败的学生数除以每个给定测试id的总学生数
对于输入表:
1 | 1 | 51
1 | 2 | 30
2 | 3 | 60
2 | 4 | 22
3 | 2 | 66
它产生以下输出:
1 | 50% | 50%
2 | 50% | 50%
3 | 100% | 0%
那些得到结果的人呢。。你不想把它们归入任何类别吗?啊,是的。我认为<50表示0-49不合格,50及以上表示通过。感谢您指出,Out考试表只显示参加考试的学生ID。如何获得两列结果。“通过率”列和“失败率”列。谢谢
SELECT test_id,
sum(case when result > 50 then 1 else 0 end) * 100 / (SELECT COUNT(DISTINCT student_id)
FROM test_taken) AS "pass rate",
sum(case when result < 50 then 1 else 0 end) * 100 / (SELECT COUNT(DISTINCT student_id)
FROM test_taken) AS "fail rate"
FROM test_taken
GROUP BY test_id;
select Q1.test_id,
Q1.students_passed * 100 / Q1.total_students || '%' as pass_rate,
Q1.students_failed * 100 / Q1.total_students || '%' as fail_rate
from
(SELECT test_id,
sum(case when result > 50 then 1 else 0 end) students_passed,
sum(case when result < 50 then 1 else 0 end) students_failed,
count(distinct student_id) total_students
FROM test_taken
GROUP BY test_id) Q1;
1 | 1 | 51
1 | 2 | 30
2 | 3 | 60
2 | 4 | 22
3 | 2 | 66
1 | 50% | 50%
2 | 50% | 50%
3 | 100% | 0%