2016-07-05 75 views
1

這是我的第一篇文章,所以對格式/內容的任何一般性更正也是值得歡迎的。我對SQL比較陌生。SQL查詢來計算一列中值的總髮生次數和另一列中的相對發生率

假設我有一個數據庫收集來自分類評估的測試結果。我知道每個測試的預期結果。我也有一個列表示測試是否成功,即返回的期望值與期望值相匹配。它看起來是這樣的:

Expected_Result Result Success 
    A     A  True 
    A     B  False 
    B     B  True 
    A     A  True 
    B     A  False 

我知道我可以SELECT Expected_Result, COUNT(Expected_Result) FROM Evaluation_Results GROUP BY Expected_Result返回每個預期類型的​​總髮生。 我知道如何計算特定預期結果的錯誤檢測數量SELECT COUNT(*) FROM Evaluation_Results WHERE Success = 'True' AND Expected_Result = 'A'

我在哪裏掙扎就是將兩者結合在一起。我想查詢返回的所有不同的預期結果的列表,總各的,中標結果的數量,總的百分比,像這樣:

Expected_Result  Total Num_Successful Success_Rate 
A     3   2    66.67 
B     2   1    50.00 

回答

0

你可以使用一個CASE表達式聚合期間執行健康檢查。案例陳述確定了一個有條件的結果。例如,你可以使用:

select evaluation_result 
, count(*) AS total 
, sum(case when success='true' and result='a' then 1 else 0 end) AS num_successful 
, sum(case when success='true' and result='a' then 1 else 0 end)/count(*) AS success_rate 
from evaluation_results group by evaluation_result; 

基本上發生了什麼有你服用的1或基於條件的結果爲0,則執行比所有等級的COUNT(*)的總和()數學。這裏不需要加入。 CASE Expression是一個功能強大的條件語句,可用於多種多樣的方式。

或者一個更靈活的解決方案來看看這個:

select evaluation_result 
, count(*) AS total 
, sum(case when success='true' and result=evaluation_result then 1 else 0 end) AS num_successful 
, sum(case when success='true' and result=evaluation_result then 1 else 0 end)/count(*) AS success_rate 
from evaluation_results group by evaluation_result; 
+0

案例表達式,不是case語句。 – jarlh

+0

所有行的success_rate返回爲0?當成功列已經將其與expected_result進行比較時,爲什麼要使用結果? – Maps

+0

接受爲答案,但是我刪除了求和中的'result = evaluation_result'子句,並且在將%成功率劃分之前將總和乘以100.0。也許你應該編輯你的答案。謝謝。 – Maps

0

您可以使用自連接,如果表是一樣的。

SELECT distinct e.Expected_Result, COUNT(Expected_Result), sum(e1.columns name), avg(e1.column name) 
FROM Evaluation_Results e 
    left join Evaluation_Results e1 on e1.col=e.col 
GROUP BY e.Expected_Result 
+0

爲什麼SELECT DISTINCT? GROUP BY不返回重複項。 – jarlh

-1

使用這個簡單的查詢和檢查結果..

select Expected_Result, count(Expected_Result) Total, 
sum(IF ('True' = Success, 1, 0)) Num_Successful, 
avg(IF ('True' = Success, 1, 0)) Success_Rate 
from Evaluation_Results group by Expected_Result