Sql 将两个查询合并为一个查询

Sql 将两个查询合并为一个查询,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

问题1

问题2


我希望获得百分比通过率和失败率,其中通过率为结果>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%