[英]Combining two queries into one query
查询1
select test_id, count (student_id)*100/
(select count(distinct student_id)from test_taken)as "pass rate"
from test_taken
where result>50
group by test_id;
查询2
select test_id, count (student_id)*100/
(select count(distinct student_id)from test_taken)as "fail rate"
from test_taken
where result<50
group by test_id;
我有下表:
test_taken
Columns:test_id,student_id,result
我正在寻找通过率>失败率和失败率的百分比,结果是通过率> 50%,失败是结果<50%。
我有2个单独的查询的通过率和失败率,但我希望将它们组合成一个查询。
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;
如果两个查询的结果在列号和列类型方面相等,则可以使用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;
OP解决方案无法产生正确的结果(至少不是要求中指定的结果),因此使用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,否则我们将零加。
我们还需要计算总数nr。 的学生参加了考试,因此我们可以轻松地通过count(distinct student_id)和按test_id分组来做到这一点。
最后,我们将此查询包装在外部查询中,在其中将nr除以。 的学生通过了考试,但未通过每个给定test_id的学生总数nr。
对于输入表:
1 | 1 | 51 1 | 2 | 30 2 | 3 | 60 2 | 4 | 22 3 | 2 | 66
它产生输出:
1 | 50% | 50% 2 | 50% | 50% 3 | 100% | 0%
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.