将两个查询组合到一个查询中

时间:2014-11-12 08:50:46

标签: sql

查询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个单独的查询,但我希望它们合并为一个查询。

3 个答案:

答案 0 :(得分:1)

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; 

答案 1 :(得分:0)

如果两个查询的结果在列数和列类型方面相同,则可以使用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;

答案 2 :(得分:0)

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或结果&lt; 50,否则我们加零。

我们还需要计算总数nr。已经参加考试的学生,所以我们可以通过count(不同的student_id)和test_id进行分组来轻松完成。

最后,我们将此查询包装在外部查询中,我们在其中划分nr。对于每个给定的test_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%