2017-09-18 120 views
-1

我有一個表X這樣,sql中計算比例超過分組數據

student ans_status question_id 
1  1   10 
2  -1   10 
3   1   10 
4   0   10 
1  -1   11 
2   1   11 
3   -1   11 
4   -2   11 

預期的O/P是

10 2/3 
11 1/3 

等。 現在,我希望來來往往每個問題10中的數據like, 1的數量/(每個問題的總數爲1和-1) 我試過這個,

select (select count(student_id) from X 
     where question_id=10 and ans_status=1)/count(student_id) 
from X 
where question_id=10 
group by ans_status 
having ans_status in(1,-1). 

我可以在嵌套查詢中做到這一點,通過再次根據狀態條件選擇和分組,但有沒有更好的辦法呢? 請注意,我想這對錶中的

+0

與該表數據,什麼是預期的結果? (表格格式) – jarlh

+1

將常規列條件放入WHERE子句中。 HAVING子句用於聚合函數條件。 – jarlh

回答

1

你可以這樣做:

select question_id, 
     avg(ans_status = 1) 
from X 
where ans_status in (1, -1) 
group by question_id; 

這將使用MySQL的功能,一個布爾表達式在數值當作整數上下文。 「真」是1,「假」是0,所以平均結果是真實的百分比。

如果你想獨立的價值觀:

select question_id, 
     sum(ans_status = 1), count(*) 
from X 
where ans_status in (1, -1) 
group by question_id; 
+0

它可以工作,但是你能解釋一下,avg(ans_status = 1)是做什麼的? – Bhargav

0

使用GROUP BY採取每個question_id的計數獲得的answer_id計數的所有問題是1或-1。

查詢

select t.`question_id`, 
t.`count_1`/t.`total_count` as `new_col` from(
    select `question_id`, 
    sum(case `ans_status` when 1 then 1 when -1 then 1 else 0 end) as `count_1`, 
    count(*) as `total_count` 
    from `your_table_name` 
    group by `question_id` 
)t; 

Find a demo here

+0

我對不起,我忘了添加,還有其他狀態爲ans_status,像-2等,但我只對1和-1感興趣,這就是爲什麼我使用該組的 – Bhargav

+0

使用CONCAT_WS('/',t .count_1',t.'total_count')作爲'new_col'來產生百分比列作爲x/y – krishnar

+0

@Bhargav:我已經更新了我的答案。請檢查一下 。 – Wanderer