关于聚合函数的Where子句条件

时间:2011-01-11 21:40:27

标签: 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; 

我想在选择列表中添加额外的COUNT()函数,但在某些条件上强加它们。这是以某种方式用CASE()语句完成的吗?我尝试在选择列表中放置Where子句,但似乎不允许这样做。我不确定这里是否真的需要子查询,但我不这么认为。

例如,我想要一个COUNT()函数,它只计算某个范围内的问题,然后计算另一个范围内的问题或其他各种条件等:

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

等...

仍按登录名分组。

感谢。

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

一些解决方案。

您可以利用SQL不计算NULL值的事实:

  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)
  . . .

或者您可以使用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)
  . . .

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

答案 2 :(得分: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 +