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