计数(*)和Sum在同一行

时间:2016-09-15 18:21:34

标签: sql sql-server count sum

我正把头靠在墙上,在这里。我看过几十个类似的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

此集合将答案显示为汇总,以及该特定答案的计数以及为每个不同问题提供的答案数量之和。

任何和所有帮助都非常感激。

1 个答案:

答案 0 :(得分: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;

此外,最好使用表别名缩写而不是任意字母的表别名。