【问题标题】:Exclude SUM From Results if it Equals 0如果 SUM 等于 0,则从结果中排除 SUM
【发布时间】:2014-08-16 01:17:14
【问题描述】:

我有以下数据结构:

问题表

QuestionID  | Question  | Error
      1        Who?         1
      2        What?        0
      3        When?        1
      4        Who?        1

QuestionID 是 int,Question 是 varchar,Error 是位域。

用户统计表

   User | QuestionID  
   Mary       1
   Joe        2
   Mary       3
   Mary       1

User 是 varchar,QuestionID 是 int。

我正在尝试设计两个查询。

在第一个查询中,我试图按问题分组,然后说谁?已经回答错了两次,什么时候?回答错了一次,为什么不报告任何事情?因为它没有错误的答案。这是我到目前为止所拥有的,一切正常,但我很难不包括什么?结果中的问题,目前它返回“0”并包含在结果中:

SELECT 'Question - ' +[Question] + ' - Answered Wrong ' + 
CAST(SUM(CONVERT(INT, Error)) as varchar) + 'Times' As Report
FROM [Questions]
GROUP BY [Question];

在我的第二个查询中,我试图通过 QuestionID 列关联这些表。本质上,试图说 Mary 回答了 QuestionID 1 两次错误,并且 QuestionID 3 错误了一次。我还没有任何关于该查询的信息。此查询预期的完整字符串类似于:

"Mary Answered Question Who? Wrong 2 Times"
"Mary Answered Question When? Wrong 1 Times"

乔没有任何问题,因为他没有回答任何错误。

SQL Server 2012,我无法控制数据结构。蒂亚!

【问题讨论】:

  • 你需要添加一个WHERE子句..FROM [Questions] WHERE Error > 0 GROUP BY [Question];

标签: sql sql-server sql-server-2012


【解决方案1】:

您可以使用having 子句过滤分组后的结果。在查询中最后添加:

HAVING SUM(CONVERT(INT, Error)) > 0

对于第二个查询,您将加入用户的表和组:

SELECT [User] + ' answered question ' + [Question] + ' wrong ' + 
CAST(SUM(CONVERT(INT, Error)) as varchar) + ' times' As Report
FROM [Questions] q
INNER JOIN [User Stat] u on u.QuestionID = q.QuestionID
GROUP BY [User]
HAVING SUM(CONVERT(INT, Error)) > 0

【讨论】:

  • 这绝对有效,但第二个查询会是什么样子?
  • @user3010406:抱歉,错过了。我为它添加了代码。
【解决方案2】:

我认为声明SUM 必须大于0 的HAVING 子句是有意义的。

【讨论】:

  • 您不能在where 子句中使用聚合函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多