2016-09-15 27 views
1

我在這裏撞着我的頭靠在牆上。我查看了幾十個類似的StackOverflow問題,他們讓我接近,但我還沒有找到一個能夠滿足我需要的問題。 我在數據庫中有數以千計的問題,來自多個用戶對每個問題的答案。我需要彙總答案以顯示每個問題不同答案的數量。這很容易;在我絆倒的地方是添加Sum列以顯示每個問題的答案總數。我可以做到這一點,如果我把Where子句限制在特定的問題上,但我試圖在可能的情況下將這一切都歸結爲一個查詢。 這裏的查詢:在同一行數(*)和總和

select c.ID, a.userID. c.question, a.answer, count(a.answer) as cnt 
from NotableAnswers a, categories b, questions c 
where c.fkCategory = b.ID and a.questionID = c.ID and b.ID = 18 
Group By a.answer, c.ID, c.question 
Order By c.ID, answer asc 

我需要的是一個結果集,看起來像這樣

ID | userID | Question | Answer | cnt | totcnt 
------------------------------------------------------------------ 
175 | 10318 |Favorite... |Dropbox  | 15 |  35 
175 | 10354 |Favorite... |Box   | 2 |  35 
175 | 10323 |Favorite... |Google Drive | 15 |  35 
175 | 103111 |Favorite... |Cubby   | 3 |  35 
186 | 10318 |Best IDE... |IntelliJ  | 4 |  12 
186 | 103613 |Best IDE... |Android Studio| 6 |  12 
186 | 103117 |Best IDE... |Eclipse  | 2 |  12 

這集顯示應答作爲骨料和具體的答案與總和沿計數提供給每個不同問題的答案數量。

任何和所有幫助非常感謝。

回答

5

首先,學會使用正確的join語法。簡單的規則:從不FROM子句中使用逗號。 始終使用使用正確的顯式JOIN語法。

二,答案是窗口功能:

select q.ID, a.userID. q.question, a.answer, count(a.answer) as cnt, 
     sum(count(a.answer)) over (partition by q.id) as total_cnt 
from NotableAnswers a join 
    questions q 
    on a.questionID = q.ID join 
    categories c 
    on q.fkCategory = c.ID 
where c.ID = 18 
Group By a.answer, c.ID, c.question 
Order By q.ID, answer asc; 

此外,最好是使用爲表名,而不是任意的字母縮寫表的別名。

+0

嚴重太快了...我正要發佈這個。 – scsimon

+0

「SELECT」語句中的'a.userID'如何?它不在羣組或AGGREGATE函數中。 – CodyMR

+0

感謝您提供非常快速的回答,並輕輕推敲正確的語法。我想,在那裏的某個地方,我應該提到這不是我的問題,我只是繼承了它。但是,這與問題沒有密切關係,而且我修改了它,略微使上下文更清晰一點,這意味着我忘了在Group By中包含用戶標識。我的錯。 但是,再次感謝您的快速,準確和非常有幫助的迴應。 – crazybobcat