Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 聚合函数的Where子句条件_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 聚合函数的Where子句条件

Sql 聚合函数的Where子句条件,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个简单的问题 SELECT US_LOGON_NAME as Username, COUNT(I.IS_ISSUE_NO) as Issues FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000 GROUP BY U.US_LOGON_NAME; 我想在选择列表中

我有一个简单的问题

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO) as Issues
FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID
WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000
GROUP BY U.US_LOGON_NAME; 
我想在选择列表中添加额外的COUNT()函数,但对它们施加某些Where条件。这是用CASE()语句完成的吗?我尝试将Where子句放入select列表中,但这似乎是不允许的。我不确定这里是否真的需要子查询,但我不这么认为

例如,我需要一个COUNT()函数,该函数只计算某个范围内的问题,然后是另一个范围内的问题或其他组合条件下的问题,等等:

 SELECT US_LOGON_NAME as Username, 
 COUNT(I.IS_ISSUE_NO (condition here)
 COUNT(I.IS_ISSUE_NO (a different condition here)
等等

仍然按登录名分组

谢谢

一些解决方案

SELECT
  SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND1
  SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND2
您可以利用SQL不计算空值这一事实:

  SELECT US_LOGON_NAME as Username, 
  COUNT(CASE WHEN <cond>       THEN I.IS_ISSUE_NO ELSE NULL END)
  COUNT(CASE WHEN <other cond> THEN I.IS_ISSUE_NO ELSE NULL END)
  . . .
选择US\u LOGON\u NAME作为用户名,
计数(I.IS\U ISSUE\U NO ELSE NULL END时的情况)
计数(I.IS\U ISSUE\U NO ELSE NULL END时的情况)
. . .
或者您可以使用SUM而不是COUNT:

  SELECT US_LOGON_NAME as Username, 
  SUM(CASE WHEN <cond>       THEN 1 ELSE 0 END)
  SUM(CASE WHEN <other cond> THEN 1 ELSE 0 END)
  . . .
选择US\u LOGON\u NAME作为用户名,
总和(1或0结束时的情况)
总和(1或0结束时的情况)
. . .

在任何一种情况下,您都可以根据需要重复多次。

该示例返回每个用户的计数,每个
IssueType

;
with
q_00 as (
select
      is_issue_no
    , is_assigned_user_id 
    , case
          when is_issue_no between  1 and 10 then 'A'
          when is_issue_no between 11 and 14 then 'B'
          else  'C'  
      end as IssueType
from Issues 
)
select
      us_logon_name
    , IssueType
    , count(1) as cnt
from q_00  as a
join users as u on a.is_assigned_user_id = u.us_user_id
group by us_logon_name, IssueType
order by us_logon_name, IssueType ;

SQL server 2005+

不计数也计数0?我以为只有
NULL
没有被计算。@柯克·沃尔:他的答案中哪里写着COUNT?是的,但亚当没有计算,他在求和。@Mark,哪里,诅咒我懒惰的阅读。:)我认为你的
CASE
表达式可能是无效语法,因为没有
END
。我认为你是对的,先生。我刚刚更新了语法。我们必须停止匆忙。