簡體   English   中英

將兩個查詢合並為一個查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM